【问题标题】:Can't mount secret to volume in /etc无法将秘密挂载到 /etc 中的卷
【发布时间】:2017-06-14 16:57:50
【问题描述】:

我有一个 K8s 部署,它将一个秘密挂载到 /etc/google-cloud-account 中,其中包含要从应用程序使用的 Google auth JSON 文件。当我尝试运行部署时,我的 pod 出现以下错误:

1m  1m  1   kubelet, gke-development-cluster-default-pool-17f531d7-sj4x spec.containers{api}    Normal  Created     Created container with docker id 36b85ec8415a; Security:[seccomp=unconfined]
1m  1m  1   kubelet, gke-development-cluster-default-pool-17f531d7-sj4x spec.containers{api}    Warning Failed      Failed to start container with docker id 36b85ec8415a with error: Error response from daemon: rpc error: code = 2 desc = "oci runtime error: could not synchronise with container process: mkdir /var/lib/docker/overlay/b4aa81194f72ccb54d88680e766a921ea26f7a4df0f4b32d6030123896b2b203/merged/etc/google-cloud-account: read-only file system"
1m  1m  1   kubelet, gke-development-cluster-default-pool-17f531d7-sj4x             Warning FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "api" with RunContainerError: "runContainer: Error response from daemon: rpc error: code = 2 desc = \"oci runtime error: could not synchronise with container process: mkdir /var/lib/docker/overlay/b4aa81194f72ccb54d88680e766a921ea26f7a4df0f4b32d6030123896b2b203/merged/etc/google-cloud-account: read-only file system\""

2m  13s 11  kubelet, gke-development-cluster-default-pool-17f531d7-sj4x spec.containers{api}    Warning BackOff     Back-off restarting failed docker container

有问题的部署如下所示:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  # ...
spec:
  replicas: {{ .Values.api.replicaCount }}
  template:
    # ...
    spec:
      containers:
        - name: {{ .Values.api.name }}
          # ...
          volumeMounts:
            - name: google-cloud-account
              mountPath: /etc/google-cloud-account
      volumes:
        - name: google-cloud-account
          secret:
            secretName: {{ template "fullname" . }}
            items:
              - key: google-cloud-credentials
                path: credentials.json

我不知道容器中的/etc 将如何成为只读文件系统,也不知道如何更改它。

【问题讨论】:

  • 尝试将其安装在其他地方。我很确定 GKE 在后台使用 CoreOS。它是一个只读 FS,所以你应该挂载在 /usr/local/ 之类的东西下,应该是 R/W
  • @MrE 请参阅下面的答案。它与另一个卷挂载有关。
  • 编辑问题以实际包含有问题的部分可能会很好......

标签: kubernetes google-kubernetes-engine kubernetes-helm


【解决方案1】:

事实证明,错误是由另一个卷安装引起的。我在最终代码中省略了它,但我的部署看起来更像以下内容:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  # ...
spec:
  replicas: {{ .Values.api.replicaCount }}
  template:
    # ...
    spec:
      containers:
        - name: {{ .Values.api.name }}
          # ...
          volumeMounts:
            - name: google-cloud-account
              mountPath: /etc/google-cloud-account
            - name: odbc
              mountPath: /etc
      volumes:
        - name: google-cloud-account
          secret:
            secretName: {{ template "fullname" . }}
            items:
              - key: google-cloud-credentials
                path: credentials.json
        - name: odbc
          configMap:
            name: {{ template "fullname" . }}
            items:
              - key: odbc.ini
                path: odbc.ini

安装odbc 接管了整个/etc 目录。为了解决这个问题,我将odbc volumeMount 更改为:

- name: odbc
  mountPath: /etc/odbc.ini
  subPath: odbc.ini

这使得/etc 中的其他所有内容都完好无损。

【讨论】:

  • 这也与将单个配置文件拖放到已经有文件的应用程序目录中的事情有关
【解决方案2】:

Dave Long's answer 的替代品是projected volumes

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  # ...
spec:
  replicas: {{ .Values.api.replicaCount }}
  template:
    # ...
    spec:
      containers:
        - name: {{ .Values.api.name }}
          # ...
          volumeMounts:
            - name etc
              mountPath: /etc
            - name: google-cloud-account
              mountPath: /etc/google-cloud-account
            - name: odbc
              mountPath: /etc
      volumes:
        - name: config
          projected:
            sources:
            - secret:
                name: {{ template "fullname" . }}
                items:
                  - key: google-cloud-credentials
                    path: google-cloud-account/credentials.json
            - configMap:
                name: {{ template "fullname" . }}
                items:
                  - key: odbc.ini
                    path: odbc.ini

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 2020-03-22
    • 2021-05-15
    • 2021-11-22
    • 2023-03-14
    • 1970-01-01
    • 2017-09-19
    • 2015-10-01
    相关资源
    最近更新 更多