Oracle LiveLabs实验:Oracle Database Kubernetes Operator

概述

本实验向您展示如何使用 Oracle Database Kubernetes Operator在 Kubernetes 集群中部署和运行 Oracle Database。

有关 Operator 提供的其他部署选项的更多详细信息,请参阅 Oracle Database Operator for Kubernetes 文档(例如运行自治数据库或在 CDB 上运行本地 PDB)

此实验申请地址在这里

实验帮助在这里

在本实验中,我们将使用两种类型的持久存储:

  • 一个动态块卷,一旦数据库被删除,它将被自动删除,
  • 静态 NFS 文件系统,允许在 kubernetes 集群的节点之间进行自动故障转移。

目标

  • 在 Oracle Cloud Infrastructure 上设置 Oracle Kubernetes Engine 实例
  • 安装数据库 Kubernetes Operator
  • 使用动态块卷在 Kubernetes 上配置和启动数据库实例
  • 连接到数据库并删除实例
  • 创建 NFS 共享文件系统
  • 使用文件系统配置和启动具有多个 Pod 的数据库
  • 通过停止最初运行数据库的节点来验证节点故障转移
  • 销毁环境

预计研讨会持续时间:1 小时

Lab 1: Set up an Oracle Kubernetes Engine instance on OCI

Introduction

本实验将引导您完成在 Oracle 云基础设施上创建托管 Kubernetes 环境的步骤。

Oracle Cloud Infrastructure Container Engine for Kubernetes 是一种完全托管、可扩展且高度可用的服务,可用于将容器应用程序部署到云中。 当您的开发团队想要可靠地构建、部署和管理云原生应用程序时,请使用 Container Engine for Kubernetes(有时缩写为 OKE)。 您指定应用程序所需的计算资源,OKE 在现有 OCI 租约中的 Oracle 云基础设施上配置这些资源。

在本实验中,您将:

  • 创建 OKE(Oracle Kubernetes Engine)实例。
  • 打开 OCI Cloud Shell 并配置 kubectl 以与 Kubernetes 集群交互。

Task 1: Create an OKE cluster

快速创建(Quick Create)功能使用默认设置,根据需要使用新的网络资源创建快速集群。 这种方法是创建新集群的最快方法。 如果您接受所有默认值,只需单击几下即可创建一个新集群。 自动为集群创建新的网络资源,以及一个节点池和三个工作节点。本实验将使用Quick Create方式。

以下需显式设置,其余均使用默认值:

  • Kubernetes API Endpoint: Public Endpoint
  • Node Type: Managed
  • Kubernetes Worker Nodes: Public Workers

以下为部分截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总共耗时12分钟(这个时间比较稳定),其中创建cluster用3分钟,创建node pool用3分钟。最终状态如下:
在这里插入图片描述
注意,这里创建了3个子网,一个用于Kubenetes API,一个用于负载均衡,还有一个用于3个K8S node,图上没有显示,是以oke-nodesubnet开头的。

为何专门指出,是因为在后续NFS的实验中,Mount Target锁使用的子网需要与K8S node的子网一致,否则K8S node无法访问到NFS。这个错误导致我浪费了至少6个小时的时间

Task 2: Configure kubectl (Kubernetes Cluster CLI)

我没有Cloud Shell Access的权限,所以用了Local Access的方法。过程详见Setting Up Local Access to Clusters

先创建一个OCI实例,安装OCI CLI,过程略。

然后配置OCI CLI,过程略:

oci setup config

验证OCI CLI配置成功:

oci iam region list

通过OCI CLI创建kubeconfig:

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

安装kubectl,详见这里

确认kubectl可以访问到cluster

$ 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

Lab 2: Install the Oracle Database Kubernetes Operator

Introduction

Operator 是一个特定于应用程序的控制器,它扩展了 Kubernetes 以创建、配置和管理复杂应用程序的实例。 Oracle 数据库 Kubernetes Operator管理 kubernetes 集群上数据库部署的管理和操作。

Task 1: Prepare to pull the DB Docker image

要从 Oracle Container Registry 访问包含 Oracle 21c 企业版数据库的预配置 docker 镜像,您需要登录并接受所需的开发人员许可协议。这个操作只需做一次。

登录Oracle Container Registry ,中间一系列操作省略。

最终获得数据库企业版的Pull Command for Latest,但我们现在无需运行他:

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

Task 2: Install the operator using the 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

获取安装状态:

$ 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>

确保其状态就绪,例如READY为1/1,STATUS为Running

否则由于Oracle Database Kubernetes Operator未就绪,后续可能出现错误。例如:

$ 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

Lab 3: Deploy a SingleInstance Database with a dynamically allocated Block Volume

Introduction

动态持久性
在本实验中,我们将使用 Dynamic Persistence Provisioning,这是一种通过指定存储类自动配置的持久卷。 由于我们在 Oracle OCI 上运行,我们将使用 oci-bv 存储类。 此存储类有助于动态配置 OCI 块卷。 此类支持的访问模式是 ReadWriteOnce。 对于其他云提供商,您可以类似地使用他们的动态配置存储类。

我们还将动态配置卷的回收策略指定为删除。 在这种情况下,当相应的数据库部署被删除时,卷也会被删除。

目标:
创建在 Kubernetes 上运行的数据库,使用块卷作为持久性存储

Task 1: Store passwords in Kubernetes Secrets

创建数据库时,我们需要一些密码:

  • 用于从 Oracle 容器存储库中提取 DB docker 容器的 Oracle 帐户密码
  • 我们将要创建的数据库的管理员密码

首先要安装docker,参见这里

使用Oracle网站用户名和口令登录:

docker login container-registry.oracle.com

登录成功后,会产生.docker目录:

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

创建secret,在用户HOME目录执行,即.docker目录的父目录:

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

创建数据库管理员的口令:

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

将 Your-DB-Password 替换为您选择的密码,长度应为 12 个字符,包含字母、数字和大写字母。

Task 2: Create the DB Config file for the Operator

要由 Operator 开始创建数据库,我们必须创建一个描述所需数据库设置的配置文件。 对于本实验,我们将使用文件 singleinstancedatabase-create.yaml,其中包含准备用于本实验这一部分的配置。

此文件内容如下,不需要修改:

#
# 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

在文件的顶层部分,参数 kind 指的是要创建的数据库类型,在这种情况下,我们将在 Kubernetes 集群上运行的容器中启动一个数据库,称为单实例数据库。 其他可能的选择是在 OCI 上使用自治数据库、使用外部容器数据库等。 参数名称定义了我们将要创建的 oracle 数据库名称,以及用于通过各种 kubectl 命令引用数据库的名称。

secretName 定义包含数据库密码的秘密名称。 您可以使用参数 keepSecret 指定在创建后删除此机密以增强安全性。

Image部分指定从何处拉取数据库容器Image。 在这种情况下,我们使用默认Image,您可以构建自定义图像并引用该Image。 参数 pullSecrets 指的是我们存储容器存储库凭据的Secret名称,在本例中为 Oracle 容器存储库。

persistence 部分定义了要使用的持久存储类型。 在这种情况下,我们将使用类 oci 来使用 OCI 块卷。 参数 accessMode 指定这是一个块卷,只能安装在集群的单个节点上。 在下一个实验中,我们将使用可以同时安装在多个节点上的 NFS 卷。

最后,参数 replicas 指定了我们想要启动和运行的 pod 数量。 由于这是一个基于块的卷,只能安装在我们使用的集群的单个节点上 。

Task 3: Launch and track the DB creation

启动数据库的创建是通过在集群上应用配置文件的单个命令完成的。 接下来,操作员将启动必要的操作来启动数据库,这在新环境中大约需要 15 分钟——例如,必须从容器存储库中复制Image。

在本节中,我们将解释一些命令,这些命令允许您跟踪此创建过程中发生的事情以及如何调试您可能遇到的问题。

应用配置文件以启动数据库创建:

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

验证实例定义已提交给Operator:

$ 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

我们可以使用以下命令查看更多详细信息:

$ 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

我们看到Operator正在等待 pod 可用。

我们可以检查将启动数据库的 pod 的状态,并遵循创建过程的不同步骤:

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

要获得有关创建的更多详细信息,您可以发出以下命令,将 pod 的确切名称替换为您环境中的名称:

$ 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

此时在OCI Console中的Block Storage和Load Balancer中可以看到为其创建的100GB块存储和负载均衡器。

现在 pod 应该正在运行,但还没有准备好:重新发出以下命令:

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

反复运行以下语句:

$ kubectl describe singleinstancedatabase sidb-test1

直到状态变为Healthy:

$ 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>

或用以下命令确认:

$ 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

Task 4: Connect to the Database

好的,看起来我们的数据库确实已启动并正在运行! 让我们尝试连接到企业管理器……

单击上面输出中的链接,使用你的 IP 地址,在我的例子中是 https://131.186.59.114:5500/em。

输入用户名sys及其口令,输入PDB名称orclpdb1,然后连上了。
在这里插入图片描述

获取数据库连接串:

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

使用easy connect方式连接(这里需要预先安装sqlplus),或者使用任一带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

如果您想要释放此数据库占用的资源(Kubernetes集群中的Pod、块卷和负载平衡器),您可以发出以下命令删除数据库并自动删除相关资源:

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

确认删除:

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

Lab 4: Deploy a SingleInstance Database with a static NFS filesystem

Introduction

静态持久性
在本实验中,我们将为我们的数据库使用静态持久性选项之一,因此我们将手动创建一个持久性卷并在我们的数据库配置文件中引用它。

您可以为此使用块卷,但结果与第一个实验中的一样:该卷只能安装在单个节点上,因此没有故障转移选项。

因此,我们将使用一个 NFS 卷,它可以同时安装在所有 3 个节点上,并允许我们演示当一个节点出现故障时会发生什么。

目标:创建在 Kubernetes 上运行的数据库,使用 NFS 卷作为持久性存储

Task 1: Prepare your NFS persistent volume

创建Mount Point和Export,过程略。唯一需要注意的是,选择网络时需要选择OKE的网络,以及K8S node所在的子网
在这里插入图片描述

请记下安装点的 IP 地址,您将在稍后的设置中需要此信息。 在本例中,地址是 :10.0.10.120

记下Export Path:稍后您将在数据库配置文件中需要此信息: /FileSystem-20230405-0739-26

NFS卷创建后,此时的空间使用率为0。
在这里插入图片描述

拷贝文件系统的OCID,后续会用到。本例为ocid1.filesystem.oc1.ap_tokyo_1.aaaaaaaaaaafmqvpnzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia

最后设置网络访问策略,以允许对NFS的访问。过程略。

接下来我们需要创建一个指向我们刚刚创建的配置的 kubernetes 持久卷。

创建文件pv.yaml,内容如下:

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"

volumeHandle的格式为:"<OCID of the file system>:<Mount Target IP Address>:/<Export Path>",需要替换为相应的值。

现在使用 kubectl 应用配置:

kubectl apply -f pv.yaml

Task 2: Creating the DB Config file for the Operator

要由 Operator 开始创建数据库,我们必须创建一个描述所需数据库设置的配置文件。 在本实验中,我们将使用文件 singleinstancedatabase_fss.yaml,其中包含准备好用于本部分实验的配置。

此文件无需修改,其内容为:

#
# 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

在文件的顶层部分,定义配置名称的参数名称现在是 sidb-test2。

persistence 部分定义了要使用的持久存储类型。 在这种情况下,我们将使用类 oci-fss。 参数 accessMode 现在定义为 ReadWriteMany,因为我们将运行多个都可以访问该卷的 pod。 只有一个 pod 将保存活动数据库,其他的处于备用状态。 参数 volumeName 是指向我们之前定义的持久卷 nfs-vol-1 的链接。

最后,参数 replicas 指定了我们想要启动和运行的 pod 数量。 我们将在集群的每个节点上运行一个 pod,因此我们将此参数设置为 3。

Task 3: Launching and tracking the DB creation

应用配置文件以启动数据库创建:

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

您可以使用下面的一组命令来验证在上一个实验中创建数据库的过程:

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

请注意,您将看到 3 个 pod,选择 1 以验证 pod 的正确启动。

一些可能对调试任何问题有用的额外命令:

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>

例如:

$ 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

下面这个命令的尾部,SuccessfulAttachVolume显示可以识别到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"

数据库启动并运行后,您可以返回到 OCI 控制台,导航到文件系统菜单并验证卷的利用率是否增加,通常是 4 GiB(这么看来,每一个POD都安装了数据库软件,而共享的NFS上只是数据文件)。
在这里插入图片描述

获取连接串:

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

150.230.105.36:1521/ORCLPDB1

使用sqlplus连接:

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

Lab 5: Failover to another node and redeploy the DB

Introduction

在本实验中,我们将使用具有我们在上一个实验中设置的 NFS 卷持久性的数据库,并验证故障转移是否发生在不同的集群节点上。

  • 首先我们将创建一个表并插入一条记录
  • 接下来,我们将手动停止运行数据库的 pod,并检查它是否出现在另一个节点上
  • 我们将重新连接到数据库以验证我们的数据仍然存在

目标:演示数据库故障转移

Task 1: Insert some records in the database

获取连接串:

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

连接数据库:

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

插入测试数据:

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

检查活动 pod 的 IP 地址:

kubectl get pods -o wide

输出如下:

$ 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>

您可以看到 sidb-test2 数据库的第二个 pod 处于就绪状态(因为其READY状态为1/1),这是数据库处于活动状态的 pod。 记下对应的节点地址(上例中为10.244.0.5)。

您应该会看到集群的 3 个实例,其私有 IP 地址与上一个命令的输出相对应。

  • 单击具有活动 pod 的实例
  • 单击停止按钮停止实例,然后单击停止实例按钮
  • 在Cloud Shell中,可以输入命令kubectl get nodes来检测kubernetes集群检测到节点停止的时刻
  • 现在重新发出命令以可视化 pod kubectl get pods -o wide 并注意到另一个 pod 已激活,在集群的另一个节点上运行

验证数据库仍然可用

  • 通过sqlplus重新连接数据库
  • 使用 select * from mytest 验证数据是否可用;

恭喜,您测试了跨集群节点的数据库故障转移!

如果你想释放这个数据库占用的资源(你的 Kubernetes 集群中的三个 pod 和一个负载均衡器),你可以发出以下命令来删除数据库:

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

您使用的 NFS 卷是单独创建的,并且在删除实例后仍然存在,因此您应该通过 OCI 控制台手动删除文件系统和挂载点。

您已完成本实验,您可以访问单实例数据库与 Oracle Database Operator for Kubernetes 页面上的文档以获取更多选项。

错误

$ 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:

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/129953764
今日推荐