【问题标题】:mount kubernetes ssh secret in container在容器中挂载 kubernetes ssh secret
【发布时间】:2022-01-22 07:33:14
【问题描述】:

无法将 Kubernetes 机密装载到 ${HOME}/.ssh/id_rsa 路径。

以下是我使用

创建的secrets.yaml
  kubectl create secret generic secret-ssh-auth --type=kubernetes.io/ssh-auth --from-file=ssh-privatekey=keys/id_rsa
apiVersion: v1
data:
  ssh-privatekey: abcdefgh
kind: Secret
metadata:
  name: secret-ssh-auth
  namespace: app
type: kubernetes.io/ssh-auth
---
apiVersion: v1
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
  name: mysecret
  namespace: app
type: Opaque

以下是我的deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-helm-test
  labels:
    helm.sh/chart: helm-test-0.1.0
    app.kubernetes.io/name: helm-test
    app.kubernetes.io/instance: nginx
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: helm-test
      app.kubernetes.io/instance: nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: helm-test
        app.kubernetes.io/instance: nginx
    spec:
      serviceAccountName: nginx-helm-test
      securityContext:
        {}
      containers:
        - name: helm-test
          securityContext:
            {}
          image: "nginx:1.16.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {}
          env:
            - name: HOME
              value: /root
          volumeMounts:
            - mountPath: ${HOME}/.ssh/id_rsa
              name: sshdir
              readOnly: true
            - name: foo
              mountPath: /etc/foo
              readOnly: true
      volumes:
        - name: sshdir
          secret:
            secretName: secret-ssh-auth
        - name: foo
          secret:
            secretName: mysecret    


我只想在${HOME}/.ssh/id_rsa 中挂载ssh-privatekey 值,但由于某种原因,上述挂载没有发生

但同时,我能够在/etc/foo/username 中正确看到foo 秘密。老实说已经筋疲力尽,但仍然想完成这个

我做错了什么?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:
    kubectl create secret generic secret-ssh-auth \
    --from-file=ssh-privatekey=keys/id_rsa
    

    如您所示,创建一个 Secret,但数据密钥是 sss-privatekey,它是从 keys/id_rsa 创建的。

    当您进行卷挂载时,您将文件 (!) 引用为 ssh-privatekey

          containers:
          - name: ...
              volumeMounts:
                - mountPath: /for/example/secrets
                  name: sshdir
                  readOnly: true
          volumes:
            - name: sshdir
              secret:
                secretName: secret-ssh-auth
    

    密钥是/for/example/secrets/ssh-privatekey

    通常,您会将主机文件重新映射到密钥中类似命名的文件,以减少混淆,即

    kubectl create secret generic secret-ssh-auth \
    --from-file=id_rsa=keys/id_rsa
    

    【讨论】:

      【解决方案2】:

      K8s Secret type: kubernetes.io/ssh-auth(即 ssh-key-secret)不能作为SSH 的挂载点开箱即用,因为它将它挂载在文件名ssh-privatekey 下。要解决此问题,您必须做几件事:

      1. 您需要在卷定义中通过secret:items:key projectionssh-privatekey 键挂载到id_rsa 文件名。
      2. 挂载秘密,使其不是组/世界可读的,因为default mode/permissions0644(即将defaultMode: 0400 添加到您的VolumeMount)。

      我认为您需要更改 deployment.yaml 以解决此问题:

      ...
                volumeMounts:
                  - mountPath: ${HOME}/.ssh
                    name: sshdir
                    readOnly: true
            volumes:
              - name: sshdir
                secret:
                  secretName: secret-ssh-auth
                  defaultMode: 0400
               items:
                 - key: ssh-privatekey
                   path: id_rsa
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        相关资源
        最近更新 更多