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:
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:
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.
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 .
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.
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).
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 wide
y 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: