仅当我将第二个常规容器添加到我的部署时,才会为 init 容器部署抛出错误

deployment throwing error for init container only when I add a second regular container to my deployment

您好,我目前正在尝试使用数据库 cloudsql 实例在 GKE 中部署 sonarqube 7.8-community。

这需要 2 个容器(一个用于 sonarqube,另一个用于 cloudproxy 以便连接到数据库)

然而,Sonarqube 容器也需要一个 init 容器来满足它一些特殊的内存要求。

当我仅使用 sonarqube 映像和 init 容器创建部署时,它工作正常,但这没有任何用处,因为我需要 cloudsql 代理容器连接到我的外部数据库。当我添加这个容器时,虽然部署突然出现以下错误

deirdrerodgers@cloudshell:~ (meta-gear-306013)$ kubectl create -f initsonar.yaml
The Deployment "sonardeploy" is invalid:spec.template.spec.initContainers[0].volumeMounts[0].name: Not found: "init-sysctl"

这是我包含初始容器和其他两个容器的完整 yaml 文件。我想知道问题是因为它不知道将 init 容器应用到哪个容器?

 apiVersion: apps/v1
 kind: Deployment
 metadata:
   labels:
     app: sonardeploy
   name: sonardeploy
   namespace: sonar
 spec:
   replicas: 1
   selector:
     matchLabels:
       app: sonardeploy
   strategy: {}
   template:
     metadata:
       labels:
         app: sonardeploy
     spec:
       initContainers:
         - name: init-sysctl
           image: busybox:1.32
           imagePullPolicy: IfNotPresent
           securityContext:
             privileged: true
           resources:
            {}
           command: ["sh",
                     "-e",
                     "/tmp/scripts/init_sysctl.sh"]
           volumeMounts:
             - name: init-sysctl
               mountPath: /tmp/scripts/
       volumes:
       - name: init-sysctl
         configMap:
           name: sonarqube-sonarqube-init-sysctl
           items:
             - key: init_sysctl.sh
               path: init_sysctl.sh
     spec:
       containers:
       - image: sonarqube:7.8-community
         name: sonarqube
         env:
           - name: SONARQUBE_JDBC_USERNAME
             valueFrom:
             secretKeyRef:
               name: sonarsecret
               key: username
           - name: SONARQUBE_JDBC_PASSWORD
             valueFrom:
             secretKeyRef:
               name: sonarsecret
               key: password
           - name: SONARQUBE_JDBC_URL
             value: jdbc:postgresql://localhost:5432/sonar
         ports:
           - containerPort: 9000
             name: sonarqube
       - name: cloudsql-proxy
         image: gcr.io/cloudsql-docker/gce-proxy:1.17
         command: ["/cloud_sql_proxy",
                   "-instances=meta-gear-306013:us-central1:sonardb=tcp:5432",
                   "-credential_file=/secrets/service_account.json"]
         securityContext:
           runAsNonRoot: true
         volumeMounts:
         - name: cloudsql-instance-credentials-volume
           mountPath: /secrets/
           readOnly: true
       volumes:
       - name: cloudsql-instance-credentials-volume
         secret:
           secretName: cloudsql-instance-credentials

您的 yaml 文件不正确。你有两个 spec: 块。应该只有一个。您需要将它们组合在一起。在 spec 块下应该是 initContainers 块,然后是 containers,最后是 volumes 块。查看下面正确的 yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: sonardeploy
  name: sonardeploy
  namespace: sonar
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonardeploy
  strategy: {}
  template:
    metadata:
      labels:
        app: sonardeploy
    spec:
      initContainers:
        - name: init-sysctl
          image: busybox:1.32
          imagePullPolicy: IfNotPresent
          securityContext:
            privileged: true
          resources:
           {}
          command: ["sh",
                    "-e",
                    "/tmp/scripts/init_sysctl.sh"]
          volumeMounts:
            - name: init-sysctl
              mountPath: /tmp/scripts/
      containers:
      - image: sonarqube:7.8-community
        name: sonarqube
        env:
          - name: SONARQUBE_JDBC_USERNAME
            valueFrom:
            secretKeyRef:
              name: sonarsecret
              key: username
          - name: SONARQUBE_JDBC_PASSWORD
            valueFrom:
            secretKeyRef:
              name: sonarsecret
              key: password
          - name: SONARQUBE_JDBC_URL
            value: jdbc:postgresql://localhost:5432/sonar
        ports:
          - containerPort: 9000
            name: sonarqube
      - name: cloudsql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.17
        command: ["/cloud_sql_proxy",
                  "-instances=meta-gear-306013:us-central1:sonardb=tcp:5432",
                  "-credential_file=/secrets/service_account.json"]
        securityContext:
          runAsNonRoot: true
        volumeMounts:
        - name: cloudsql-instance-credentials-volume
          mountPath: /secrets/
          readOnly: true
      volumes:
      - name: cloudsql-instance-credentials-volume
        secret:
          secretName: cloudsql-instance-credentials
      - name: init-sysctl
        configMap:
          name: sonarqube-sonarqube-init-sysctl
          items:
            - key: init_sysctl.sh
              path: init_sysctl.sh