在 kubernetes 的多容器 pod 环境中,如何在第一个容器 postgres 数据库启动后 运行 将 keycloak 作为第二个容器?

How to run a keycloak as second container after first container postgres Database start up at multi-container pod environment of kubernetes?

在多容器 pod 中:

第 1 步:部署第一个容器 Postgres 数据库并创建模式

第 2 步:等待 Postgres pod 出现

step-3:然后开始部署第二个容器keycloak

我已经将下面的部署文件写到 运行 :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: idms
  namespace: default
  labels:
    app: idms
spec:
  replicas: 1
  selector:
    matchLabels:
      app: idms
  template:
    metadata:
      labels:
        app: idms
    spec:
      containers:
       - name: postgres
         image: registry.prod.srv.da.nsn-rdnet.net/edge/postgres:12.3-alpine
         imagePullPolicy: "IfNotPresent"
         ports:
           - containerPort: 5432
         lifecycle:
            postStart:
              exec:
                command: ["/bin/bash","-c","sleep 5 && PGPASSWORD=$POSTGRES_PASSWORD psql $POSTGRES_DB -U $POSTGRES_USER -c \'CREATE SCHEMA IF NOT EXISTS keycloak;\'"]  
         envFrom:
           - configMapRef:
               name: postgres-config
       - name: keycloak
         image: quay.io/keycloak/keycloak:10.0.1
         env:
          - name: KEYCLOAK_USER
            value: "admin"
          - name: KEYCLOAK_PASSWORD
            value: "admin"
          - name: REALM
            value: "ntc"
          - name: PROXY_ADDRESS_FORWARDING
            value: "true"
          - name: DB_ADDR
            value: "localhost"
          - name: DB_PORT
            value: "5432"
          - name: DB_DATABASE
            value: "postgresdb"
          - name: DB_USER
            value: "xxxxxxxxx"
          - name: DB_PASSWORD
            value: "xxxxxxxxx"
          - name: DB_SCHEMA
            value: "keycloak"    
          - name: KEYCLOAK_IMPORT
            value: "/opt/jboss/keycloak/startup/elements/realm.json"
         volumeMounts:
           - mountPath: /var/lib/postgresql/data
             name: postgredb 
           - mountPath: /opt/jboss/keycloak/startup/elements
             name: elements 
         ports:
          - name: http
            containerPort: 8080
          - name: https
            containerPort: 8443
         readinessProbe:
            httpGet:
              path: /auth/realms/master
              port: 8080
      volumes:
        - name: elements
          configMap:
            name: keycloak-elements
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim   

但 keycloak 是从 H2 嵌入式数据库开始的,而不是 Postgres。如果我在部署文件的 Postgres 上使用 init-container nslookup,如下所示:

initContainers:
      - name: init-postgres
        image: busybox
        command: ['sh', '-c', 'until nslookup postgres; do echo waiting for postgres; sleep 2; done;']

pod 卡在“podinitialization”

您忘记添加

- name: DB_VENDOR
  value: POSTGRES

在部署 YAML 文件中,由于该 keycloak 默认使用 H2 数据库模式。

YAML 参考文件:https://github.com/harsh4870/Keycloack-postgres-kubernetes-deployment/blob/main/keycload-deployment.yaml