k8s 挂载Secret中key为容器中的文件

内容纲要

背景

使用Kubernetes作为容器编排工具时,有时我们需要将敏感数据传递给应用。在许多场景下,我们可以直接使用环境变量传递这些配置信息。然而,有些应用的配置可能只能通过文件进行,不能直接通过环境变量传值。对于这种情况,Kubernetes 提供了 Secrets 对象,它可以将这些敏感信息如密码、密钥、令牌等作为文件内容挂载到Pod的文件系统中。

详解

以下是一个 Kubernetes Deployment 的示例配置,展示了如何将信息作为文件内容通过Secret对象挂载到容器:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-volume
  name: nginx-deployment1
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-volume
  template:
    metadata:
      labels:
        app: nginx-volume
    spec:
      containers:
      - image: nginx:1.14.0
        ports:
        - containerPort: 80
        name: nginx-volume
        volumeMounts:
        - name: oauth-client-id
          mountPath: /etc/nginx/clientId
          subPath: clientId
        - name: oauth-client-secret
          mountPath: /etc/nginx/clientSecret
          subPath: clientSecret
      volumes:
      - name: oauth-client-id
        secret: 
          secretName: oauth-secret
          items:
          - key: clientId
            path: clientId
      - name: oauth-client-secret
        secret: 
          secretName: oauth-secret
          items:
          - key: clientSecret
            path: clientSecret

如上配置中,用到了两个挂载点:/etc/nginx/clientId/etc/nginx/clientSecret,它们分别对应Secret对象 oauth-secret 下的 clientIdclientSecret

root@localhost:/root# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
nginx-deployment1-5f4dc9b48f-t8lp2   1/1     Running   0          6d
===========================================================================
root@localhost:/root# kubectl exec -it po/nginx-deployment1-5f4dc9b48f-t8lp2  -- bash
===========================================================================
root@nginx-deployment1-5f4dc9b48f-t8lp2:/# ls /etc/nginx | grep client
clientId  clientSecret  
===========================================================================
root@nginx-deployment1-5f4dc9b48f-t8lp2:/# 

volumeMounts 中的 name 要与 volumes 中的 name 对应, mountPath 指的是容器中文件的路径, subPath 是可选的,当在同一卷中使用多个 secret 的多个 key 时,可以使用 subPath

oauth-secretvolumes 下定义,指定了 secretNameitemsitems 是个数组,定义了需要使用的 key 和在Pod中创建文件的 path

总结

Kubernetes的Secrets提供了一个在容器中使用敏感信息的安全、灵活的方式。你可以通过定义Secret和在Pod的特定路径挂载该Secret来将敏感数据以文件内容形式暴露给你的应用,从而避免在配置文件或者镜像中硬编码敏感信息。这可以提高你应用的安全性,也为管理这些敏感信息提供了更多的灵活性。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部