Kubernetes 仅当我向部署中添加第二个常规容器时,init容器的部署引发错误

Kubernetes 仅当我向部署中添加第二个常规容器时,init容器的部署引发错误,kubernetes,deployment,sonarqube,init,Kubernetes,Deployment,Sonarqube,Init,您好,我目前正在尝试使用DB cloudsql实例在GKE中部署sonarqube 7.8-community 这需要2个容器(一个用于sonarqube,另一个用于cloudproxy,以便连接到DB) 然而,Sonarqube容器也需要一个init容器来满足一些特殊的内存需求 当我仅使用sonarqube映像和init容器创建部署时,它可以正常工作,但这没有任何用处,因为我需要cloudsql代理容器连接到外部数据库。当我添加这个容器时,部署突然出现以下错误 deirdrerodgers@c

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

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

然而,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"
这是包含init容器和其他两个容器的完整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
下,block应该是
initContainers
block,然后是
containers
,最后是
volumes
block。查看下面正确的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   

您有两个
spec:
块;把它们结合在一起。在这种情况下,您应该有
initContainers:
containers:
,以及一个
卷:
,列出了两个卷(按任意顺序)。@DavidMaze这是有效的!非常感谢。