运行 Kubernetes 上的 Oracle 12c

Run Oracle 12c on Kubernetes

我正在尝试 运行 Oracle 12c on Kubernetes。 当我第一次将它作为 docker 容器启动时,我必须等到它配置好。 它配置成功并在我添加的 configDBora.sh 中传递脚本。

但是如果我想以我创建的用户身份登录,我就不能那样做。我必须至少重启一次容器。

我如何在 Kubernetes 中做到这一点?没有停止命令。我还尝试将部署的副本更改为 0,但它会删除现有的 pod。

我可以将什么脚本添加到 configDBora.sh 或执行其他操作以在 kubernetes 上使用 oracle 重启容器?

configDBora.sh 中的脚本结尾是:

#A lot of scipt here
...
echo "$DB_PDB = \
  (DESCRIPTION = \
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) \
    (CONNECT_DATA = \
      (SERVER = DEDICATED) \
      (SERVICE_NAME = $DB_PDB.$DB_DOMAIN) \
    ) \
  ) \
" >> $TNS_ORA

# start listener
lsnrctl start

# clean
unset DB_PASSWD
history -w
history -c

echo ""
echo "DONE!"

# end

部署神谕:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert
    kompose.version: 1.26.0 (40646f47)
  creationTimestamp: null
  labels:
    io.kompose.service: oracle
  name: oracle
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: oracle
  strategy: {}
  template:
    metadata:
      annotations:
        kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert
        kompose.version: 1.26.0 (40646f47)
      creationTimestamp: null
      labels:
        io.kompose.service: oracle
    spec:
      containers:
        - env:
            - name: ORACLE_MEM
              value: "2000"
            - name: ORACLE_PDB
              value: ORCLPDB
            - name: ORACLE_PWD
              value: Admin123
            - name: ORACLE_SID
              value: ORCLCDB
          image: maxprimeaery/oracle-12c-base:5.0
          name: oracle
          ports:
            - containerPort: 1521
#          resources:
#            limits:
#              memory: "1073741824"
      restartPolicy: Always
status: {}

服务:

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: C:\ProgramData\chocolatey\lib\kubernetes-kompose\tools\kompose.exe convert
    kompose.version: 1.26.0 (40646f47)
  creationTimestamp: null
  labels:
    io.kompose.service: oracle
  name: oracle
spec:
  type: LoadBalancer
  ports:
    - name: "1521"
      port: 1521
      targetPort: 1521
  selector:
    io.kompose.service: oracle
status:
  loadBalancer: {}

在这种情况下,您可以尝试重新启动您的部署:

kubectl rollout restart deployment <deployment_name>

它将在不中断服务的情况下执行容器的关闭和重启。 请检查 What is Kubectl Rollout Restart? 以获取有关此方法的更多信息。

编辑: 这是 Kubernetes 应该工作的方式 - 通过在容器重新启动后立即用新的 pod 自动替换 pod。修改里面的 pod 并不常见,但是你可以尝试通过应用这样的命令来强制重启特定 pod 内的容器:

kubectl exec -it <pod_name> -c <container_name> -- /sbin/reboot

或者强制终止容器,具体取决于您的容器设置:

kubectl exec -it <pod_name> -c <container_name> -- /bin/sh -c "kill 1"

一旦容器终止,它将在同一个 pod 中几秒钟后重新启动。

唯一的问题是 Oracle 的 12c 版本。

我将我的数据库移动到 Oracle 19c 企业版,我的问题就解决了。使用 Oracle 19c,我不需要使用 oracle 重新启动 pod,但我需要更多的 ram 和 rom 内存。