Oracle LiveLabs实验:Operador de Kubernetes de la base de datos de Oracle

descripción general

Este laboratorio le muestra cómo implementar y ejecutar Oracle Database en un clúster de Kubernetes mediante el operador de Oracle Database Kubernetes.

Consulte la documentación del operador de base de datos de Oracle para Kubernetes para obtener más detalles sobre otras opciones de implementación proporcionadas por el operador (como ejecutar una base de datos autónoma o ejecutar un PDB local sobre un CDB)

La dirección de la aplicación para este experimento está aquí .

Experimente la ayuda aquí .

En esta práctica de laboratorio, utilizaremos dos tipos de almacenamiento persistente:

  • Un volumen de bloque dinámico, que se elimina automáticamente una vez que se elimina la base de datos,
  • Un sistema de archivos NFS estático que permite la conmutación por error automática entre nodos en un clúster de kubernetes.

Objetivo

  • Configurar una instancia de Oracle Kubernetes Engine en Oracle Cloud Infrastructure
  • Instale el operador de Kubernetes de la base de datos
  • Configure y lance una instancia de base de datos en Kubernetes con volúmenes de bloques dinámicos
  • Conéctese a la base de datos y elimine la instancia.
  • Crear un sistema de archivos compartidos NFS
  • Configurar e iniciar una base de datos con varios pods utilizando el sistema de archivos
  • Verifique la conmutación por error del nodo deteniendo el nodo donde la base de datos se estaba ejecutando originalmente
  • destruir el medio ambiente

Duración estimada del taller: 1 hora

Laboratorio 1: configurar una instancia de Oracle Kubernetes Engine en OCI

Introducción

Este laboratorio lo guiará a través de los pasos para crear un entorno de Kubernetes administrado en Oracle Cloud Infrastructure.

Oracle Cloud Infrastructure Container Engine for Kubernetes es un servicio completamente administrado, escalable y de alta disponibilidad para implementar aplicaciones de contenedores en la nube. Cuando su equipo de desarrollo desee crear, implementar y administrar de manera confiable aplicaciones nativas de la nube, use Container Engine for Kubernetes (a veces abreviado como OKE). Usted especifica los recursos informáticos que requiere su aplicación y OKE los aprovisiona en Oracle Cloud Infrastructure en un arrendamiento de OCI existente.

En este laboratorio, usted:

  • Cree una instancia de OKE (Oracle Kubernetes Engine).
  • Abra OCI Cloud Shell y configure kubectl para interactuar con el clúster de Kubernetes.

Tarea 1: crear un clúster de OKE

La función Creación rápida utiliza la configuración predeterminada para crear clústeres rápidos con nuevos recursos de red según sea necesario. Este método es la forma más rápida de crear un nuevo clúster. Si acepta todos los valores predeterminados, puede crear un nuevo clúster con solo unos pocos clics. Cree automáticamente nuevos recursos de red para el clúster, junto con un grupo de nodos y tres nodos trabajadores. Este experimento utilizará el método de creación rápida.

Lo siguiente debe configurarse explícitamente, y el resto usa valores predeterminados:

  • Punto final de la API de Kubernetes: punto final público
  • Tipo de nodo: Administrado
  • Nodos trabajadores de Kubernetes: trabajadores públicos

La siguiente es una captura de pantalla parcial:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
toma 12 minutos en total (este tiempo es relativamente estable), entre los cuales toma 3 minutos crear un clúster y 3 minutos crear un grupo de nodos. El estado final es el siguiente:
inserte la descripción de la imagen aquí
Tenga en cuenta que aquí se crean 3 subredes, una para la API de Kubenetes, otra para el equilibrio de carga y otra para 3 nodos K8S, que no se muestran en la figura y comienzan con oke-nodesubnet.

La razón por la que se señala específicamente es que en los experimentos posteriores de NFS, la subred utilizada por el bloqueo Mount Target debe ser coherente con la subred del nodo K8S; de lo contrario, el nodo K8S no puede acceder a NFS. Este error me hizo perder al menos 6 horas de tiempo

Tarea 2: Configurar kubectl (CLI del clúster de Kubernetes)

No tengo el permiso de acceso a Cloud Shell, así que utilicé el método de acceso local. El proceso se detalla en Configuración del acceso local a los clústeres.

Primero cree una instancia de OCI, instale la CLI de OCI, se omite el proceso .

Luego configure la OCI CLI, el proceso se abrevia:

oci setup config

Verifique que la configuración de OCI CLI fue exitosa:

oci iam region list

Cree kubeconfig a través de OCI CLI:

mkdir -p $HOME/.kube
CLUSTER_ID=ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaay65nbbpqwgvt23p6grixlvavj2rnowlzckm6x7lyrcftl6arjcha
oci ce cluster create-kubeconfig --cluster-id $CLUSTER_ID --file $HOME/.kube/config --region ap-tokyo-1 --token-version 2.0.0  --kube-endpoint PUBLIC_ENDPOINT
# suggest add below to .bash_profile
export KUBECONFIG=$HOME/.kube/config

Instale kubectl, vea aquí para más detalles .

Confirme que kubectl puede acceder al clúster

$ kubectl get nodes
NAME          STATUS   ROLES   AGE   VERSION
10.0.10.170   Ready    node    96m   v1.25.4
10.0.10.21    Ready    node    96m   v1.25.4
10.0.10.9     Ready    node    96m   v1.25.4

Laboratorio 2: Instalar el operador Kubernetes de la base de datos de Oracle

Introducción

Un operador es un controlador específico de la aplicación que amplía Kubernetes para crear, configurar y administrar instancias de aplicaciones complejas. Oracle Database Kubernetes Operator gestiona la gestión y el funcionamiento de las implementaciones de bases de datos en los clústeres de Kubernetes.

Tarea 1: Prepárese para extraer la imagen de DB Docker

Para acceder a la imagen acoplable preconfigurada que contiene la base de datos Oracle 21c Enterprise Edition desde Oracle Container Registry, deberá iniciar sesión y aceptar el Acuerdo de licencia de desarrollador requerido. Esta operación solo debe realizarse una vez.

Inicie sesión en Oracle Container Registry y se omiten una serie de operaciones intermedias.

Finalmente obtuve Pull Command para Latest for Database Enterprise Edition, pero no necesitamos ejecutarlo ahora:

docker pull
container-registry.oracle.com/database/enterprise:latest

Tarea 2: instalar el operador mediante Cloud Shell

kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml

kubectl apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/main/oracle-database-operator.yaml

Obtenga el estado de la instalación:

$ kubectl get pod -n oracle-database-operator-system -o wide
NAME                                                          READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
oracle-database-operator-controller-manager-5747ccc95-fqsnp   1/1     Running   0          13s   10.244.1.4     10.0.10.130   <none>           <none>
oracle-database-operator-controller-manager-5747ccc95-h2qqr   1/1     Running   0          13s   10.244.0.4     10.0.10.43    <none>           <none>
oracle-database-operator-controller-manager-5747ccc95-t82n2   1/1     Running   0          13s   10.244.0.133   10.0.10.95    <none>           <none>

Asegúrese de que su estado sea listo, por ejemplo, LISTO 1/1, ESTADO Running.

De lo contrario, es posible que se produzcan errores más adelante porque el operador de Kubernetes de la base de datos de Oracle no está listo. Por ejemplo:

$ kubectl apply -f https://objectstorage.us-ashburn-1.oraclecloud.com/p/LNAcA6wNFvhkvHGPcWIbKlyGkicSOVCIgWLIu6t7W2BQfwq2NSLCsXpTL9wVzjuP/n/c4u04/b/livelabsfiles/o/developer-library/singleinstancedatabase-fss.yaml
Error from server (InternalError): error when creating "https://objectstorage.us-ashburn-1.oraclecloud.com/p/LNAcA6wNFvhkvHGPcWIbKlyGkicSOVCIgWLIu6t7W2BQfwq2NSLCsXpTL9wVzjuP/n/c4u04/b/livelabsfiles/o/developer-library/singleinstancedatabase-fss.yaml": Internal error occurred: failed calling webhook "msingleinstancedatabase.kb.io": failed to call webhook: Post "https://oracle-database-operator-webhook-service.oracle-database-operator-system.svc:443/mutate-database-oracle-com-v1alpha1-singleinstancedatabase?timeout=10s": EOF

Laboratorio 3: implementar una base de datos de instancia única con un volumen en bloque asignado dinámicamente

Introducción

Persistencia dinámica
En esta práctica de laboratorio, utilizaremos el aprovisionamiento de persistencia dinámica, que es un volumen persistente que se aprovisiona automáticamente al especificar una clase de almacenamiento. Dado que estamos ejecutando Oracle OCI, utilizaremos la clase de almacenamiento oci-bv. Esta clase de almacenamiento facilita el aprovisionamiento dinámico de volúmenes de bloques OCI. El modo de acceso admitido por esta clase es ReadWriteOnce. Para otros proveedores de nube, puede usar de manera similar sus clases de almacenamiento aprovisionadas dinámicamente.

También especificamos la política de recuperación del volumen de aprovisionamiento dinámico como eliminación. En este caso, cuando se elimina la implementación de la base de datos correspondiente, también se elimina el volumen.

Objetivo:
crear una base de datos que se ejecute en Kubernetes, utilizando volúmenes en bloque como almacenamiento persistente

Tarea 1: almacenar contraseñas en Kubernetes Secrets

Al crear la base de datos, necesitamos algunas contraseñas:

  • La contraseña de la cuenta de Oracle utilizada para extraer el contenedor de la ventana acoplable DB del repositorio de contenedores de Oracle
  • La contraseña de administrador para la base de datos que crearemos.

Primero instale la ventana acoplable, consulte aquí .

Inicie sesión con el nombre de usuario y la contraseña del sitio web de Oracle:

docker login container-registry.oracle.com

Después de un inicio de sesión exitoso, se generará el directorio .docker:

$ ls -l .docker
total 4
-rw-------. 1 opc opc 125 Apr  5 02:01 config.json

Cree un secreto y ejecútelo en el directorio HOME del usuario, que es el directorio principal del directorio .docker:

cd ~
kubectl create secret generic oracle-container-registry-secret --from-file=.dockerconfigjson=.docker/config.json --type=kubernetes.io/dockerconfigjson

Cree una contraseña para el administrador de la base de datos:

kubectl create secret generic admin-secret --from-literal=oracle_pwd=Your-DB-Password

Reemplace Your-DB-Password con una contraseña de su elección, que debe tener 12 caracteres y contener letras, números y letras mayúsculas.

Tarea 2: crear el archivo de configuración de base de datos para el operador

Para comenzar a crear una base de datos por parte del Operador, debemos crear un archivo de configuración que describa la configuración deseada de la base de datos. Para este laboratorio, usaremos el archivo singleinstancedatabase-create.yaml , que contiene la configuración lista para esta parte del laboratorio.

El contenido de este archivo es el siguiente, no es necesario modificarlo:

#
# Copyright (c) 2021, Oracle and/or its affiliates. 
# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
#
apiVersion: database.oracle.com/v1alpha1
kind: SingleInstanceDatabase
metadata:
  name: sidb-test1
  namespace: default


spec:
  ## Use only alphanumeric characters for sid
  sid: ORCL1
  
  ## A source database ref to clone from, leave empty to create a fresh database
  cloneFrom: ""

  ## NA if cloning from a SourceDB (cloneFrom is set)
  edition: enterprise
  
  ## Should refer to SourceDB secret if cloning from a SourceDB (cloneFrom is set)
  ## Secret containing SIDB password mapped to secretKey
  ## This secret will be deleted after creation of the database unless keepSecret is set to true
  adminPassword:
    secretName: admin-secret
#    secretKey:
    keepSecret: true

  ## NA if cloning from a SourceDB (cloneFrom is set)
  charset: AL32UTF8

  ## NA if cloning from a SourceDB (cloneFrom is set)
  pdbName: orclpdb1

  ## Enable/Disable Flashback
  flashBack: false

  ## Enable/Disable ArchiveLog
  archiveLog: false

  ## Enable/Disable ForceLogging
  forceLog: false

  ## NA if cloning from a SourceDB (cloneFrom is set)
  ## Specify both sgaSize and pgaSize (in MB) or dont specify both
  ## Specify Non-Zero value to use
  initParams:
    cpuCount: 0
    processes: 0
    sgaTarget: 0
    pgaAggregateTarget: 0

  ## Database image details
  ## Database can be patched by updating the RU version/image
  ## Major version changes are not supported
  image:
    pullFrom: container-registry.oracle.com/database/enterprise:latest
    pullSecrets: oracle-container-registry-secret

  ## size : Minimum size of pvc | class : PVC storage Class
  ## AccessMode can only accept one of ReadWriteOnce, ReadWriteMany
  ## Below mentioned storageClass/accessMode applies to OCI block volumes. Update appropriately for other types of persistent volumes.
  persistence:
    size: 100Gi
    storageClass: "oci"
    accessMode: "ReadWriteOnce"

  ## Type of service . Applicable on cloud enviroments only
  ## if loadBalService : false, service type = "NodePort". else "LoadBalancer"
  loadBalancer: true
  serviceAnnotations:
     service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
     service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
     service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "10"

  ## Deploy only on nodes having required labels. Format label_name : label_value
  ## Leave empty if there is no such requirement.
  ## Uncomment to use
  # nodeSelector: 
  #   failure-domain.beta.kubernetes.io/zone: bVCG:PHX-AD-1
  #   pool: sidb

  ## Count of Database Pods. Applicable only for "ReadWriteMany" AccessMode
  replicas: 1

En la parte de nivel superior del archivo, el parámetro kind se refiere al tipo de base de datos que se creará; en este caso, iniciaremos una base de datos en un contenedor que se ejecuta en el clúster de Kubernetes, denominado base de datos de instancia única. Otras opciones posibles son usar una base de datos autónoma en OCI, usar una base de datos de contenedor externa, etc. El nombre del parámetro define el nombre de la base de datos de Oracle que vamos a crear y el nombre utilizado para hacer referencia a la base de datos a través de varios comandos de kubectl.

secretName define el nombre del secreto que contiene la contraseña de la base de datos. Puede usar el parámetro keepSecret para especificar que este secreto se elimine después de la creación para mayor seguridad.

La sección Imagen especifica de dónde extraer la imagen del contenedor de la base de datos. En este caso, estamos usando la imagen predeterminada, puede crear una imagen personalizada y hacer referencia a ella. El parámetro pullSecrets hace referencia al nombre del Secreto donde almacenamos las credenciales para el repositorio del contenedor, en este caso Oracle Container Repository.

La sección de persistencia define el tipo de almacenamiento persistente a utilizar. En este caso usaremos la clase oci para usar volúmenes de bloque OCI. El parámetro accessMode especifica que se trata de un volumen en bloque y solo se puede montar en un único nodo del clúster. En la próxima práctica de laboratorio, usaremos un volumen NFS que se puede montar en varios nodos simultáneamente.

Finalmente, el parámetro replicas especifica cuántos pods queremos tener en funcionamiento. Dado que este es un volumen basado en bloques, solo se puede montar en un solo nodo del clúster que usamos.

Tarea 3: Iniciar y rastrear la creación de la base de datos

La creación de la base de datos de inicio se realiza con un solo comando que aplica un archivo de configuración en el clúster. A continuación, el operador iniciará las operaciones necesarias para abrir la base de datos, lo que lleva unos 15 minutos en un entorno nuevo; por ejemplo, la imagen debe copiarse del repositorio del contenedor.

En esta sección, explicaremos algunos comandos que le permiten rastrear lo que sucede durante esta compilación y cómo depurar los problemas que pueda encontrar.

Aplique el archivo de configuración para iniciar la creación de la base de datos:

kubectl apply -f https://objectstorage.us-ashburn-1.oraclecloud.com/p/LNAcA6wNFvhkvHGPcWIbKlyGkicSOVCIgWLIu6t7W2BQfwq2NSLCsXpTL9wVzjuP/n/c4u04/b/livelabsfiles/o/developer-library/singleinstancedatabase-create.yaml

Verifique que la definición de la instancia se haya comprometido con el operador:

$ kubectl get singleinstancedatabase sidb-test1
NAME         EDITION      STATUS    VERSION       CONNECT STR   TCPS CONNECT STR   OEM EXPRESS URL
sidb-test1   Enterprise   Pending   Unavailable   Unavailable   Unavailable        Unavailable

Podemos ver más detalles con el siguiente comando:

$ kubectl describe singleinstancedatabase sidb-test1
Name:         sidb-test1
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  database.oracle.com/v1alpha1
Kind:         SingleInstanceDatabase
Metadata:
  Creation Timestamp:  2023-04-04T09:41:16Z
  Finalizers:
    database.oracle.com/singleinstancedatabasefinalizer
  Generation:  1
  Managed Fields:
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        .:
        f:adminPassword:
          .:
          f:keepSecret:
          f:secretKey:
          f:secretName:
        f:archiveLog:
        f:charset:
        f:cloneFrom:
        f:edition:
        f:flashBack:
        f:forceLog:
        f:image:
          .:
          f:pullFrom:
          f:pullSecrets:
        f:initParams:
          .:
          f:cpuCount:
          f:pgaAggregateTarget:
          f:processes:
          f:sgaTarget:
        f:loadBalancer:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:replicas:
        f:serviceAnnotations:
          .:
          f:service.beta.kubernetes.io/oci-load-balancer-shape:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:
        f:sid:
    Manager:      kubectl-client-side-apply
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .:
          v:"database.oracle.com/singleinstancedatabasefinalizer":
    Manager:      manager
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
        .:
        f:charset:
        f:cloneFrom:
        f:clusterConnectString:
        f:conditions:
          .:
          k:{
    
    "type":"ReconcileQueued"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
        f:connectString:
        f:datafilesCreated:
        f:datafilesPatched:
        f:edition:
        f:initParams:
        f:isTcpsEnabled:
        f:oemExpressUrl:
        f:pdbConnectString:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:releaseUpdate:
        f:replicas:
        f:role:
        f:sid:
        f:status:
        f:tcpsConnectString:
        f:tcpsPdbConnectString:
    Manager:         manager
    Operation:       Update
    Subresource:     status
    Time:            2023-04-04T09:42:02Z
  Resource Version:  38177
  UID:               af85922d-00cf-4dfc-8edb-f4700ce005fa
Spec:
  Admin Password:
    Keep Secret:  true
    Secret Key:   oracle_pwd
    Secret Name:  admin-secret
  Charset:        AL32UTF8
  Edition:        enterprise
  Image:
    Pull From:     container-registry.oracle.com/database/enterprise:latest
    Pull Secrets:  oracle-container-registry-secret
  Init Params:
  Load Balancer:  true
  Pdb Name:       orclpdb1
  Persistence:
    Access Mode:    ReadWriteOnce
    Size:           100Gi
    Storage Class:  oci
  Replicas:         1
  Service Annotations:
    service.beta.kubernetes.io/oci-load-balancer-shape:           flexible
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:  10
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:  10
  Sid:                                                            ORCL1
Status:
  Charset:                 AL32UTF8
  Clone From:              Unavailable
  Cluster Connect String:  sidb-test1-ext.default:1521/ORCL1
  Conditions:
    Last Transition Time:  2023-04-04T09:42:02Z
    Message:               no reconcile errors
    Observed Generation:   1
    Reason:                LastReconcileCycleQueued
    Status:                True
    Type:                  ReconcileQueued
  Connect String:          131.186.59.114:1521/ORCL1
  Datafiles Created:       false
  Datafiles Patched:       false
  Edition:                 Enterprise
  Init Params:
  Is Tcps Enabled:     false
  Oem Express URL:     https://131.186.59.114:5500/em
  Pdb Connect String:  131.186.59.114:1521/ORCLPDB1
  Pdb Name:            orclpdb1
  Persistence:
    Access Mode:            ReadWriteOnce
    Size:                   100Gi
    Storage Class:          oci
  Release Update:           Unavailable
  Replicas:                 1
  Role:                     Unavailable
  Sid:                      ORCL1
  Status:                   Pending
  Tcps Connect String:      Unavailable
  Tcps Pdb Connect String:  Unavailable
Events:
  Type    Reason            Age               From                    Message
  ----    ------            ----              ----                    -------
  Normal  Database Pending  4s (x5 over 49s)  SingleInstanceDatabase  waiting for a pod to get to running state

Vemos que el Operador está esperando que un pod esté disponible.

Podemos comprobar el estado del pod que iniciará la base de datos y seguir los diferentes pasos del proceso de creación:

$ kubectl get pod
NAME               READY   STATUS     RESTARTS   AGE
sidb-test1-u9wze   0/1     Init:0/2   0          2m57s

Para obtener más detalles sobre la creación, puede emitir el siguiente comando, sustituyendo el nombre exacto del pod con el nombre de su entorno:

$ kubectl describe pod sidb-test1-u9wze
Name:             sidb-test1-u9wze
Namespace:        default
Priority:         0
Service Account:  default
Node:             10.0.10.21/10.0.10.21
Start Time:       Tue, 04 Apr 2023 09:41:35 +0000
Labels:           app=sidb-test1
                  version=
Annotations:      <none>
Status:           Pending
IP:
IPs:              <none>
Controlled By:    SingleInstanceDatabase/sidb-test1
Init Containers:
  init-permissions:
    Container ID:
    Image:         container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      chown 54321:54321 /opt/oracle/oradata || true
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9dnst (ro)
  init-wallet:
    Container ID:
    Image:         container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
    Args:
      -c
      if [ ! -f $ORACLE_BASE/oradata/.${ORACLE_SID}${CHECKPOINT_FILE_EXTN} ] || [ ! -f ${ORACLE_BASE}/oradata/dbconfig/$ORACLE_SID/.docker_enterprise ]; then while [ ! -f ${WALLET_DIR}/ewallet.p12 ] || pgrep -f $WALLET_CLI > /dev/null; do sleep 0.5; done; fi
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:
      ORACLE_SID:  ORCL1
      WALLET_CLI:  mkstore
      WALLET_DIR:  /opt/oracle/oradata/dbconfig/$(ORACLE_SID)/.wallet
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9dnst (ro)
Containers:
  sidb-test1:
    Container ID:
    Image:          container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Ports:          1521/TCP, 5500/TCP
    Host Ports:     0/TCP, 0/TCP
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Readiness:      exec [/bin/sh -c if [ -f $ORACLE_BASE/checkDBLockStatus.sh ]; then $ORACLE_BASE/checkDBLockStatus.sh ; else $ORACLE_BASE/checkDBStatus.sh; fi ] delay=20s timeout=20s period=60s #success=1 #failure=3
    Environment:
      SVC_HOST:             sidb-test1
      SVC_PORT:             1521
      CREATE_PDB:           true
      ORACLE_SID:           ORCL1
      WALLET_DIR:           /opt/oracle/oradata/dbconfig/$(ORACLE_SID)/.wallet
      ORACLE_PDB:           orclpdb1
      ORACLE_CHARACTERSET:  AL32UTF8
      ORACLE_EDITION:       enterprise
      INIT_SGA_SIZE:
      INIT_PGA_SIZE:
      SKIP_DATAPATCH:       true
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9dnst (ro)
Conditions:
  Type              Status
  Initialized       False
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  datamount:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  sidb-test1
    ReadOnly:   false
  oracle-pwd-vol:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  admin-secret
    Optional:    true
  kube-api-access-9dnst:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason                  Age                   From                     Message
  ----     ------                  ----                  ----                     -------
  Warning  FailedScheduling        4m8s (x2 over 4m23s)  default-scheduler        0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.
  Normal   Scheduled               4m5s                  default-scheduler        Successfully assigned default/sidb-test1-u9wze to 10.0.10.21
  Normal   SuccessfulAttachVolume  3m49s                 attachdetach-controller  AttachVolume.Attach succeeded for volume "ocid1.volume.oc1.ap-tokyo-1.abxhiljr3e6n22weyra4v7fcrdqyflbmj3b5cgzboetmgfpofhuhu5lmcajq"
  Normal   Pulling                 3m37s                 kubelet                  Pulling image "container-registry.oracle.com/database/enterprise:latest"
  Normal   Pulled                  6s                    kubelet                  Successfully pulled image "container-registry.oracle.com/database/enterprise:latest" in 3m31.220010488s
  Normal   Created                 1s                    kubelet                  Created container init-permissions

En este punto, puede ver el almacenamiento en bloque de 100 GB y el balanceador de carga creados para él en Almacenamiento en bloque y Balanceador de carga en la consola de OCI.

El pod ahora debería estar ejecutándose, pero no está listo: vuelva a emitir el siguiente comando:

$ kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
sidb-test1-u9wze   0/1     Running   0          6m1s

Ejecute repetidamente la siguiente instrucción:

$ kubectl describe singleinstancedatabase sidb-test1

Hasta que el estado cambie a Saludable:

$ kubectl describe singleinstancedatabase sidb-te                                                       st1
Name:         sidb-test1
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  database.oracle.com/v1alpha1
Kind:         SingleInstanceDatabase
Metadata:
  Creation Timestamp:  2023-04-04T09:41:16Z
  Finalizers:
    database.oracle.com/singleinstancedatabasefinalizer
  Generation:  1
  Managed Fields:
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        .:
        f:adminPassword:
          .:
          f:keepSecret:
          f:secretKey:
          f:secretName:
        f:archiveLog:
        f:charset:
        f:cloneFrom:
        f:edition:
        f:flashBack:
        f:forceLog:
        f:image:
          .:
          f:pullFrom:
          f:pullSecrets:
        f:initParams:
          .:
          f:cpuCount:
          f:pgaAggregateTarget:
          f:processes:
          f:sgaTarget:
        f:loadBalancer:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:replicas:
        f:serviceAnnotations:
          .:
          f:service.beta.kubernetes.io/oci-load-balancer-shape:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:
        f:sid:
    Manager:      kubectl-client-side-apply
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .:
          v:"database.oracle.com/singleinstancedatabasefinalizer":
    Manager:      manager
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
        .:
        f:archiveLog:
        f:charset:
        f:cloneFrom:
        f:clusterConnectString:
        f:conditions:
          .:
          k:{
    
    "type":"ReconcileBlocked"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
          k:{
    
    "type":"ReconcileComplete"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
          k:{
    
    "type":"ReconcileQueued"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
        f:connectString:
        f:datafilesCreated:
        f:datafilesPatched:
        f:edition:
        f:flashBack:
        f:forceLog:
        f:initParams:
        f:isTcpsEnabled:
        f:oemExpressUrl:
        f:pdbConnectString:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:releaseUpdate:
        f:replicas:
        f:role:
        f:sid:
        f:status:
        f:tcpsConnectString:
        f:tcpsPdbConnectString:
    Manager:         manager
    Operation:       Update
    Subresource:     status
    Time:            2023-04-04T09:55:56Z
  Resource Version:  42552
  UID:               af85922d-00cf-4dfc-8edb-f4700ce005fa
Spec:
  Admin Password:
    Keep Secret:  true
    Secret Key:   oracle_pwd
    Secret Name:  admin-secret
  Charset:        AL32UTF8
  Edition:        enterprise
  Image:
    Pull From:     container-registry.oracle.com/database/enterprise:latest
    Pull Secrets:  oracle-container-registry-secret
  Init Params:
  Load Balancer:  true
  Pdb Name:       orclpdb1
  Persistence:
    Access Mode:    ReadWriteOnce
    Size:           100Gi
    Storage Class:  oci
  Replicas:         1
  Service Annotations:
    service.beta.kubernetes.io/oci-load-balancer-shape:           flexible
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:  10
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:  10
  Sid:                                                            ORCL1
Status:
  Archive Log:             false
  Charset:                 AL32UTF8
  Clone From:              Unavailable
  Cluster Connect String:  sidb-test1-ext.default:1521/ORCL1
  Conditions:
    Last Transition Time:  2023-04-04T09:54:41Z
    Message:               no pod is ready currently
    Observed Generation:   1
    Reason:                LastReconcileCycleQueued
    Status:                True
    Type:                  ReconcileQueued
    Last Transition Time:  2023-04-04T09:54:54Z
    Message:               processing datapatch execution
    Observed Generation:   1
    Reason:                LastReconcileCycleBlocked
    Status:                True
    Type:                  ReconcileBlocked
    Last Transition Time:  2023-04-04T09:55:56Z
    Message:               no reconcile errors
    Observed Generation:   1
    Reason:                LastReconcileCycleCompleted
    Status:                True
    Type:                  ReconcileComplete
  Connect String:          131.186.59.114:1521/ORCL1
  Datafiles Created:       true
  Datafiles Patched:       true
  Edition:                 Enterprise
  Flash Back:              false
  Force Log:               false
  Init Params:
  Is Tcps Enabled:     false
  Oem Express URL:     https://131.186.59.114:5500/em
  Pdb Connect String:  131.186.59.114:1521/ORCLPDB1
  Pdb Name:            orclpdb1
  Persistence:
    Access Mode:            ReadWriteOnce
    Size:                   100Gi
    Storage Class:          oci
  Release Update:           21.3.0.0.0
  Replicas:                 1
  Role:                     PRIMARY
  Sid:                      ORCL1
  Status:                   Healthy
  Tcps Connect String:      Unavailable
  Tcps Pdb Connect String:  Unavailable
Events:                     <none>
[opc@instance-kubectl-client ~]$ kubectl describe singleinstancedatabase sidb-test1
Name:         sidb-test1
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  database.oracle.com/v1alpha1
Kind:         SingleInstanceDatabase
Metadata:
  Creation Timestamp:  2023-04-04T09:41:16Z
  Finalizers:
    database.oracle.com/singleinstancedatabasefinalizer
  Generation:  1
  Managed Fields:
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        .:
        f:adminPassword:
          .:
          f:keepSecret:
          f:secretKey:
          f:secretName:
        f:archiveLog:
        f:charset:
        f:cloneFrom:
        f:edition:
        f:flashBack:
        f:forceLog:
        f:image:
          .:
          f:pullFrom:
          f:pullSecrets:
        f:initParams:
          .:
          f:cpuCount:
          f:pgaAggregateTarget:
          f:processes:
          f:sgaTarget:
        f:loadBalancer:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:replicas:
        f:serviceAnnotations:
          .:
          f:service.beta.kubernetes.io/oci-load-balancer-shape:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:
          f:service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:
        f:sid:
    Manager:      kubectl-client-side-apply
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .:
          v:"database.oracle.com/singleinstancedatabasefinalizer":
    Manager:      manager
    Operation:    Update
    Time:         2023-04-04T09:41:16Z
    API Version:  database.oracle.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
        .:
        f:archiveLog:
        f:charset:
        f:cloneFrom:
        f:clusterConnectString:
        f:conditions:
          .:
          k:{
    
    "type":"ReconcileBlocked"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
          k:{
    
    "type":"ReconcileComplete"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
          k:{
    
    "type":"ReconcileQueued"}:
            .:
            f:lastTransitionTime:
            f:message:
            f:observedGeneration:
            f:reason:
            f:status:
            f:type:
        f:connectString:
        f:datafilesCreated:
        f:datafilesPatched:
        f:edition:
        f:flashBack:
        f:forceLog:
        f:initParams:
        f:isTcpsEnabled:
        f:oemExpressUrl:
        f:pdbConnectString:
        f:pdbName:
        f:persistence:
          .:
          f:accessMode:
          f:size:
          f:storageClass:
        f:releaseUpdate:
        f:replicas:
        f:role:
        f:sid:
        f:status:
        f:tcpsConnectString:
        f:tcpsPdbConnectString:
    Manager:         manager
    Operation:       Update
    Subresource:     status
    Time:            2023-04-04T09:55:56Z
  Resource Version:  42552
  UID:               af85922d-00cf-4dfc-8edb-f4700ce005fa
Spec:
  Admin Password:
    Keep Secret:  true
    Secret Key:   oracle_pwd
    Secret Name:  admin-secret
  Charset:        AL32UTF8
  Edition:        enterprise
  Image:
    Pull From:     container-registry.oracle.com/database/enterprise:latest
    Pull Secrets:  oracle-container-registry-secret
  Init Params:
  Load Balancer:  true
  Pdb Name:       orclpdb1
  Persistence:
    Access Mode:    ReadWriteOnce
    Size:           100Gi
    Storage Class:  oci
  Replicas:         1
  Service Annotations:
    service.beta.kubernetes.io/oci-load-balancer-shape:           flexible
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max:  10
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min:  10
  Sid:                                                            ORCL1
Status:
  Archive Log:             false
  Charset:                 AL32UTF8
  Clone From:              Unavailable
  Cluster Connect String:  sidb-test1-ext.default:1521/ORCL1
  Conditions:
    Last Transition Time:  2023-04-04T09:54:41Z
    Message:               no pod is ready currently
    Observed Generation:   1
    Reason:                LastReconcileCycleQueued
    Status:                True
    Type:                  ReconcileQueued
    Last Transition Time:  2023-04-04T09:54:54Z
    Message:               processing datapatch execution
    Observed Generation:   1
    Reason:                LastReconcileCycleBlocked
    Status:                True
    Type:                  ReconcileBlocked
    Last Transition Time:  2023-04-04T09:55:56Z
    Message:               no reconcile errors
    Observed Generation:   1
    Reason:                LastReconcileCycleCompleted
    Status:                True
    Type:                  ReconcileComplete
  Connect String:          131.186.59.114:1521/ORCL1
  Datafiles Created:       true
  Datafiles Patched:       true
  Edition:                 Enterprise
  Flash Back:              false
  Force Log:               false
  Init Params:
  Is Tcps Enabled:     false
  Oem Express URL:     https://131.186.59.114:5500/em
  Pdb Connect String:  131.186.59.114:1521/ORCLPDB1
  Pdb Name:            orclpdb1
  Persistence:
    Access Mode:            ReadWriteOnce
    Size:                   100Gi
    Storage Class:          oci
  Release Update:           21.3.0.0.0
  Replicas:                 1
  Role:                     PRIMARY
  Sid:                      ORCL1
  Status:                   Healthy
  Tcps Connect String:      Unavailable
  Tcps Pdb Connect String:  Unavailable
Events:                     <none>

O confirme con el siguiente comando:

$ kubectl get singleinstancedatabase sidb-test1
NAME         EDITION      STATUS    VERSION      CONNECT STR                 TCPS CONNECT STR   OEM EXPRESS URL
sidb-test1   Enterprise   Healthy   21.3.0.0.0   131.186.59.114:1521/ORCL1   Unavailable        https://131.186.59.114:5500/em

Tarea 4: conectarse a la base de datos

Ok, ¡parece que nuestra base de datos está en funcionamiento! Intentemos conectarnos a Enterprise Manager...

Haga clic en el enlace de la salida anterior, usando su dirección IP, en mi caso https://131.186.59.114:5500/em.

Ingrese el nombre de usuario sys y su contraseña, ingrese el nombre de PDB orclpdb1 y conéctese.
inserte la descripción de la imagen aquí

Obtenga la cadena de conexión de la base de datos:

$ kubectl get singleinstancedatabase sidb-test1 -o "jsonpath={.status.pdbConnectString}" && echo -e "\n"
131.186.59.114:1521/ORCLPDB1

Use easy connect to connect (aquí necesita instalar sqlplus por adelantado), o use cualquier cliente con sqlplus:

$ sqlplus sys@131.186.59.114:1521/ORCLPDB1 as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Apr 4 12:33:52 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SYS@131.186.59.114:1521/ORCLPDB1> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 1536M
sga_min_size                         big integer 0
sga_target                           big integer 0
SYS@131.186.59.114:1521/ORCLPDB1> show parameter pga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit                  big integer 2G
pga_aggregate_target                 big integer 512M

Si desea liberar los recursos ocupados por esta base de datos (Pods, volúmenes en bloque y balanceadores de carga en el clúster de Kubernetes), puede ejecutar el siguiente comando para eliminar la base de datos y eliminar automáticamente los recursos relacionados:

kubectl delete singleinstancedatabase.database.oracle.com sidb-test1

confirmar la eliminación:

$ kubectl get singleinstancedatabase sidb-test1
Error from server (NotFound): singleinstancedatabases.database.oracle.com "sidb-test1" not found

Laboratorio 4: implementar una base de datos de instancia única con un sistema de archivos NFS estático

Introducción

Persistencia estática
En esta práctica de laboratorio, usaremos una de las opciones de persistencia estática para nuestra base de datos, por lo que crearemos manualmente un volumen persistente y lo referenciaremos en el archivo de configuración de nuestra base de datos.

Podría usar un volumen en bloque para esto, pero el resultado es el mismo que en el primer experimento: el volumen solo se puede montar en un solo nodo, por lo que no hay opción de conmutación por error.

Por lo tanto, usaremos un volumen NFS que se puede montar en los 3 nodos simultáneamente y nos permite demostrar lo que sucede cuando falla un nodo.

Objetivo: Crear una base de datos que se ejecute en Kubernetes, usando volúmenes NFS como almacenamiento persistente

Tarea 1: Prepare su volumen persistente NFS

Crear punto de montaje y exportar, se omite el proceso. Lo único a tener en cuenta es que al seleccionar la red, debe seleccionar la red OKE y la subred donde se encuentra el nodo K8S .
inserte la descripción de la imagen aquí

Tome nota de la dirección IP del punto de montaje, necesitará esta información más adelante en la configuración. En este ejemplo, la dirección es: 10.0.10.120 .

Tome nota de la ruta de exportación: la necesitará más adelante en el archivo de configuración de la base de datos: /FileSystem-20230405-0739-26

Después de crear el volumen NFS, el uso de espacio en este momento es 0.
inserte la descripción de la imagen aquí

Copie el OCID del sistema de archivos, que se utilizará más adelante. Este ejemplo es ocid1.filesystem.oc1.ap_tokyo_1.aaaaaaaaaaafmqvpnzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia

Finalmente configure la política de acceso a la red para permitir el acceso a NFS. Se omite el proceso.

A continuación, debemos crear un volumen persistente de kubernetes que apunte a la configuración que acabamos de crear.

Cree un archivo pv.yaml con el siguiente contenido:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol-1
spec:
  storageClassName: oci-fss
  capacity:
    storage: 224Gi
  volumeMode: Filesystem
  accessModes:
   - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: fss.csi.oraclecloud.com
    volumeHandle: "ocid1.filesystem.oc1.ap_tokyo_1.aaaaaaaaaaafmr5wnzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia:10.0.10.120:/FileSystem-20230405-0739-26"

El formato de volumeHandle es: "<OCID of the file system>:<Mount Target IP Address>:/<Export Path>", que debe reemplazarse con el valor correspondiente.

Ahora aplique la configuración usando kubectl:

kubectl apply -f pv.yaml

Tarea 2: Creación del archivo de configuración de base de datos para el operador

Para comenzar a crear una base de datos por parte del Operador, debemos crear un archivo de configuración que describa la configuración deseada de la base de datos. En esta práctica de laboratorio, usaremos el archivo singleinstancedatabase_fss.yaml que contiene la configuración lista para esta parte de la práctica.

Este archivo no necesita ser modificado, su contenido es:

#
# Copyright (c) 2021, Oracle and/or its affiliates. 
# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
#
apiVersion: database.oracle.com/v1alpha1
kind: SingleInstanceDatabase
metadata:
  name: sidb-test2
  namespace: default
spec:
  
  ## Use only alphanumeric characters for sid
  sid: ORCL1
  
  ## A source database ref to clone from, leave empty to create a fresh database
  cloneFrom: ""

  ## NA if cloning from a SourceDB (cloneFrom is set)
  edition: enterprise
  
  ## Should refer to SourceDB secret if cloning from a SourceDB (cloneFrom is set)
  ## Secret containing SIDB password mapped to secretKey
  ## This secret will be deleted after creation of the database unless keepSecret is set to true
  adminPassword:
    secretName: admin-secret
#    secretKey:
    keepSecret: true

  ## NA if cloning from a SourceDB (cloneFrom is set)
  charset: AL32UTF8

  ## NA if cloning from a SourceDB (cloneFrom is set)
  pdbName: orclpdb1

  ## Enable/Disable Flashback
  flashBack: false

  ## Enable/Disable ArchiveLog
  archiveLog: false

  ## Enable/Disable ForceLogging
  forceLog: false

  ## NA if cloning from a SourceDB (cloneFrom is set)
  ## Specify both sgaSize and pgaSize (in MB) or dont specify both
  ## Specify Non-Zero value to use
  initParams:
    cpuCount: 0
    processes: 0
    sgaTarget: 0
    pgaAggregateTarget: 0

  ## Database image details
  ## Database can be patched by updating the RU version/image
  ## Major version changes are not supported
  image:
    pullFrom: container-registry.oracle.com/database/enterprise:latest
    pullSecrets: oracle-container-registry-secret

  ## size : Minimum size of pvc | class : PVC storage Class
  ## AccessMode can only accept one of ReadWriteOnce, ReadWriteMany
  ## Below mentioned storageClass/accessMode applies to OCI block volumes. Update appropriately for other types of persistent volumes.
  persistence:
    size: 224Gi
    storageClass: "oci-fss"
    accessMode: "ReadWriteMany"
    volumeName: "nfs-vol-1"

  ## Type of service . Applicable on cloud enviroments only
  ## if loadBalService : false, service type = "NodePort". else "LoadBalancer"
  loadBalancer: true
  serviceAnnotations:
     service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
     service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
     service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "10"
  ## Deploy only on nodes having required labels. Format label_name : label_value
  ## Leave empty if there is no such requirement.
  ## Uncomment to use
  # nodeSelector: 
  #   failure-domain.beta.kubernetes.io/zone: bVCG:PHX-AD-1
  #   pool: sidb

  ## Count of Database Pods. Applicable only for "ReadWriteMany" AccessMode
  replicas: 3

En la sección de nivel superior del archivo, el nombre del parámetro que define el nombre de la configuración ahora es sidb-test2.

La sección de persistencia define el tipo de almacenamiento persistente a utilizar. En este caso usaremos la clase oci-fss. El parámetro accessMode ahora se define como ReadWriteMany porque ejecutaremos varios pods que pueden acceder al volumen. Solo un pod mantendrá la base de datos activa, los demás están en espera. El parámetro volumeName es un enlace al volumen persistente nfs-vol-1 que definimos anteriormente.

Finalmente, el parámetro replicas especifica cuántos pods queremos tener en funcionamiento. Ejecutaremos un pod en cada nodo del clúster, por lo que estableceremos este parámetro en 3.

Tarea 3: Lanzamiento y seguimiento de la creación de la base de datos

Aplique el archivo de configuración para iniciar la creación de la base de datos:

kubectl apply -f https://objectstorage.us-ashburn-1.oraclecloud.com/p/LNAcA6wNFvhkvHGPcWIbKlyGkicSOVCIgWLIu6t7W2BQfwq2NSLCsXpTL9wVzjuP/n/c4u04/b/livelabsfiles/o/developer-library/singleinstancedatabase-fss.yaml

Puede utilizar el siguiente conjunto de comandos para verificar el proceso de creación de la base de datos en el laboratorio anterior:

kubectl get singleinstancedatabase sidb-test2
kubectl describe singleinstancedatabase sidb-test2
kubectl get pod
kubectl describe pod sidb-test2-<your_id>

Tenga en cuenta que verá 3 pods, seleccione 1 para verificar el inicio correcto del pod.

Algunos comandos adicionales que pueden ser útiles para depurar cualquier problema:

kubectl logs sidb-test2-<your_id>
kubectl get pod -n oracle-database-operator-system
kubectl logs -n oracle-database-operator-system oracle-database-operator-controller-manager-<your-id>

Por ejemplo:

$ kubectl get pod -n oracle-database-operator-system
NAME                                                          READY   STATUS    RESTARTS   AGE
oracle-database-operator-controller-manager-5747ccc95-5bs4b   1/1     Running   0          4h7m
oracle-database-operator-controller-manager-5747ccc95-wh6vv   1/1     Running   0          4h7m
oracle-database-operator-controller-manager-5747ccc95-wnfj9   1/1     Running   0          4h7m

Al final del siguiente comando, SuccessAttachVolume muestra que se reconoce el volumen NFS:

$ kubectl describe pod sidb-test1-u9wze
Error from server (NotFound): pods "sidb-test1-u9wze" not found
[opc@instance-20230405-1333-kubectl ~]$ kubectl describe pod sidb-test1-7c7pn
Name:             sidb-test1-7c7pn
Namespace:        default
Priority:         0
Service Account:  default
Node:             10.0.10.43/10.0.10.43
Start Time:       Wed, 05 Apr 2023 06:09:10 +0000
Labels:           app=sidb-test1
                  version=
Annotations:      <none>
Status:           Pending
IP:
IPs:              <none>
Controlled By:    SingleInstanceDatabase/sidb-test1
Init Containers:
  init-permissions:
    Container ID:
    Image:         container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
      -c
      chown 54321:54321 /opt/oracle/oradata || true
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kc7jd (ro)
  init-wallet:
    Container ID:
    Image:         container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Port:          <none>
    Host Port:     <none>
    Command:
      /bin/sh
    Args:
      -c
      if [ ! -f $ORACLE_BASE/oradata/.${ORACLE_SID}${CHECKPOINT_FILE_EXTN} ] || [ ! -f ${ORACLE_BASE}/oradata/dbconfig/$ORACLE_SID/.docker_enterprise ]; then while [ ! -f ${WALLET_DIR}/ewallet.p12 ] || pgrep -f $WALLET_CLI > /dev/null; do sleep 0.5; done; fi
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Environment:
      ORACLE_SID:  ORCL1
      WALLET_CLI:  mkstore
      WALLET_DIR:  /opt/oracle/oradata/dbconfig/$(ORACLE_SID)/.wallet
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kc7jd (ro)
Containers:
  sidb-test1:
    Container ID:
    Image:          container-registry.oracle.com/database/enterprise:latest
    Image ID:
    Ports:          1521/TCP, 5500/TCP
    Host Ports:     0/TCP, 0/TCP
    State:          Waiting
      Reason:       PodInitializing
    Ready:          False
    Restart Count:  0
    Readiness:      exec [/bin/sh -c if [ -f $ORACLE_BASE/checkDBLockStatus.sh ]; then $ORACLE_BASE/checkDBLockStatus.sh ; else $ORACLE_BASE/checkDBStatus.sh; fi ] delay=20s timeout=20s period=60s #success=1 #failure=3
    Environment:
      SVC_HOST:             sidb-test1
      SVC_PORT:             1521
      CREATE_PDB:           true
      ORACLE_SID:           ORCL1
      WALLET_DIR:           /opt/oracle/oradata/dbconfig/$(ORACLE_SID)/.wallet
      ORACLE_PDB:           orclpdb1
      ORACLE_CHARACTERSET:  AL32UTF8
      ORACLE_EDITION:       enterprise
      INIT_SGA_SIZE:
      INIT_PGA_SIZE:
      SKIP_DATAPATCH:       true
    Mounts:
      /opt/oracle/oradata from datamount (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kc7jd (ro)
Conditions:
  Type              Status
  Initialized       False
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  datamount:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  sidb-test1
    ReadOnly:   false
  oracle-pwd-vol:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  admin-secret
    Optional:    true
  kube-api-access-kc7jd:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason                  Age                From                     Message
  ----     ------                  ----               ----                     -------
  Warning  FailedScheduling        47s (x2 over 62s)  default-scheduler        0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.
  Normal   Scheduled               45s                default-scheduler        Successfully assigned default/sidb-test1-7c7pn to 10.0.10.43
  Normal   SuccessfulAttachVolume  28s                attachdetach-controller  AttachVolume.Attach succeeded for volume "ocid1.volume.oc1.ap-tokyo-1.abxhiljrljffpdycnmwlwssndvw73kuym4u4dx4nlv3surth33yd7lw3dzxa"
  Normal   Pulling                 16s                kubelet                  Pulling image "container-registry.oracle.com/database/enterprise:latest"

Una vez que la base de datos esté en funcionamiento, puede regresar a la consola OCI, navegar al menú del sistema de archivos y verificar que la utilización del volumen haya aumentado, generalmente 4 GiB (por lo que parece que cada POD tiene el software de la base de datos instalado y el NFS compartido). anteriores son solo archivos de datos).
inserte la descripción de la imagen aquí

Obtenga la cadena de conexión:

$ kubectl get singleinstancedatabase sidb-test2 -o "jsonpath={.status.pdbConnectString}" && echo -e "\n"

150.230.105.36:1521/ORCLPDB1

Conéctese usando sqlplus:

sqlplus sys/[email protected]:1521/ORCLPDB1 as sysdba

Laboratorio 5: Conmutación por error a otro nodo y reimplementación de la base de datos

Introducción

En esta práctica de laboratorio, usaremos la base de datos con la persistencia del volumen NFS que configuramos en la práctica de laboratorio anterior y verificaremos que la conmutación por error ocurra en un nodo de clúster diferente.

  • Primero crearemos una tabla e insertaremos un registro
  • A continuación, detendremos manualmente el pod que ejecuta la base de datos y verificaremos si está presente en otro nodo.
  • Nos volveremos a conectar a la base de datos para verificar que nuestros datos todavía existen.

Objetivo: demostrar la conmutación por error de la base de datos

Tarea 1: Insertar algunos registros en la base de datos

Obtenga la cadena de conexión:

kubectl get singleinstancedatabase sidb-test2 -o "jsonpath={.status.pdbConnectString}" && echo -e "\n"

Conectarse a la base de datos:

sqlplus sys/[email protected]:1521/ORCLPDB1 as sysdba

Insertar datos de prueba:

create table mytest (my_id int, mytext varchar(255) ) ;
insert into mytest values (10,'Hello World');
select * from mytest;

Verifique la dirección IP del pod activo:

kubectl get pods -o wide

La salida es la siguiente:

$ kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS        AGE   IP             NODE          NOMINATED NODE   READINESS GATES
sidb-test2-55zoj   0/1     Running   4 (5m53s ago)   27m   10.244.0.134   10.0.10.73    <none>           <none>
sidb-test2-n4upz   1/1     Running   1 (21m ago)     31m   10.244.0.5     10.0.10.213   <none>           <none>
sidb-test2-vht46   0/1     Running   5 (3m15s ago)   27m   10.244.1.5     10.0.10.253   <none>           <none>

Puede ver que el segundo pod para la base de datos sidb-test2 está en estado listo (porque su estado READY es 1/1), que es el pod donde la base de datos está activa. Tome nota de la dirección del nodo correspondiente (10.244.0.5 en el ejemplo anterior).

Debería ver 3 instancias del clúster con direcciones IP privadas correspondientes al resultado del comando anterior.

  • Haga clic en una instancia con un pod activo
  • Haga clic en el botón Detener para detener la instancia, luego haga clic en el botón Detener instancia
  • En Cloud Shell, puede ingresar el comando kubectl get nodes para detectar cuándo el clúster de kubernetes detecta que el nodo está detenido
  • Ahora vuelva a emitir el comando para visualizar los pods kubectl get pods -o widey observe que otro pod está activado, ejecutándose en otro nodo del clúster

Verifique que la base de datos todavía esté disponible

  • Vuelva a conectarse a la base de datos a través de sqlplus
  • Use select * from mytest para verificar que los datos estén disponibles;

Felicitaciones, probó la conmutación por error de la base de datos en los nodos del clúster.

Si desea liberar los recursos ocupados por esta base de datos (tres pods y un balanceador de carga en su clúster de Kubernetes), puede ejecutar el siguiente comando para eliminar la base de datos:

kubectl delete singleinstancedatabase.database.oracle.com sidb-test2

El volumen NFS que usa se crea por separado y persiste después de eliminar la instancia, por lo que debe eliminar manualmente el sistema de archivos y el punto de montaje a través de la consola OCI.

Ahora que completó este laboratorio, puede visitar la documentación en la página Base de datos de instancia única y Operador de base de datos de Oracle para Kubernetes para obtener más opciones.

error

$ sqlplus sys@150.230.105.36:1521/ORCL1 as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Thu Apr 6 01:37:29 2023
Version 21.9.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

ERROR:
ORA-12547: TNS:lost contact


Enter user-name:

Supongo que te gusta

Origin blog.csdn.net/stevensxiao/article/details/129953764
Recomendado
Clasificación