美文网首页云原生
38-存储-Secret

38-存储-Secret

作者: 紫荆秋雪_文 | 来源:发表于2022-02-15 18:33 被阅读0次
k8s系统存储挂载原理.png

一、Secret特点

  • secret 卷用来给 Pod 传递敏感信息,例如密码、OAuth令牌和SSH密钥
  • 将secret存储在kubernetes API 服务器上,然后以文件的形式挂载到 Pod 中,无需直接与 kubernetes 耦合
  • secret 卷由 tmpfs (基于 RAM 的文件系统)提供存储
  • 使用前必须先在kubernetes API 中创建secret
  • 容器以subPath卷挂载方式挂载 Secret 时,将感知不到 Secret 的更新

二、Secret

1、Secret 概览

Pod可以通过下面三种方式来使用 Secret

  • 作为挂载到一个或多个容器上的 卷 中的文件
  • 作为 容器的环境变量
  • 由 kubectl 在为 Pod 拉取镜像时使用

2、编写 Secret 配置文件注意点

  • data字段中所有键值都必须是 base64编码的字符串
  • stringData字段,可以使用任何字符串作为其取值

3、Secret 类型 Secret-type类型.png

三、创建Secret,type为Opaque

1、不知如何书写secret yaml文件时,使用下面命令

kubectl explain secret

2、无需base64编码

apiVersion: v1
kind: Secret
metadata:
  name: secret-01
  namespace: raven
stringData:
  username1: admin
  password1: 123456
  username2: admin2
  password2: 123456-2
  username3: admin3
  password3: 123456-3

3、secret创建成功

image.png

4、检查 Secret

kubectl get secret secret-01 -n raven -oyaml

5、使用secret-01

  • 创建一个使用 Secret 的 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  secret-deployment
  namespace: raven
  labels:
    app: secret-deployment
spec:
  selector:
    matchLabels:
      app: secret-use-pod
  replicas: 1
  template:
    metadata:
      labels:
        app:  secret-use-pod
    spec:
      containers:
      - name:  nginx
        image:  nginx
        ports:
          - containerPort:  80
        volumeMounts: 
          - name: "secret-01" # 必须要与volumes.name 相同
            mountPath: "/app" # 容器中挂载卷的位置
            readOnly: true
      volumes:
        - name: secret-01 # 卷名称
          secret:
            secretName: secret-01 # 创建的 Secret 名称
  • 容器中app目录 image.png

6、修改Secret后,Pod有感知

四、创建Secret,type为Opaque带base64编码

1、给“admin” base64编码

echo -n 'admin' | base64

结果: YWRtaW4=

2、创建需要base-64的Secret

apiVersion: v1
kind: Secret
metadata:
  name: secret-opaque-base64
  namespace: raven
type: Opaque
data:
  username1: YWRtaW4x
  password1: cHcxMTE=
  username2: YWRtaW4y
  password2: cHcyMjI=
  username3: YWRtaW4z
  password3: cHczMzM=

3、创建使用Secret的 Pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  secret-deployment-base64
  namespace: raven
  labels:
    app: secret-deployment-base64
spec:
  selector:
    matchLabels:
      app: secret-use-pod-base64
  replicas: 1
  template:
    metadata:
      labels:
        app:  secret-use-pod-base64
    spec:
      containers:
      - name:  nginx
        image:  nginx
        ports:
          - containerPort:  80
        volumeMounts: 
          - name: app-base64 # 必须要与volumes.name 相同
            mountPath: "/app" # 容器中挂载卷的位置
            readOnly: true
      volumes:
        - name: app-base64 # 卷名称
          secret:
            secretName: secret-opaque-base64 # 创建的 Secret 名称

4、进入容器查看挂载卷 image.png

5、Pod 感知 Secret 修改

  • 编译 Secret 并且重新apply image.png
  • Pod 感知Secret 修改 image.png

五、Secret 其他特性

1、将 Secret 键名映射到特定路径

使用 spec.volumes[].secret.items 字段修改每个键对应的目标路径

  • yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  secret-deployment-base64
  namespace: raven
  labels:
    app: secret-deployment-base64
spec:
  selector:
    matchLabels:
      app: secret-use-pod-base64
  replicas: 1
  template:
    metadata:
      labels:
        app:  secret-use-pod-base64
    spec:
      containers:
      - name:  nginx
        image:  nginx
        ports:
          - containerPort:  80
        volumeMounts: 
          - name: app-base64 # 必须要与volumes.name 相同
            mountPath: "/app" # 容器中挂载卷的位置
            readOnly: true
      volumes:
        - name: app-base64 # 卷名称
          secret:
            secretName: secret-opaque-base64 # 创建的 Secret 名称
            items:
              - key: username1
                path: items/un
  • 使用 spec.volumes[].secret.items 后,只有在items中指定的键会被映射 image.png
  • 在容器中文件的路径为spec.containers.volumeMounts.mountPath + spec.volumes.secret.items.path
/app/items/un

2、Secret 文件权限,目前无法修改

默认 Secret文件为只读.png

3、以环境变量的形式使用 Secrets

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  secret-deployment-base64
  namespace: raven
  labels:
    app: secret-deployment-base64
spec:
  selector:
    matchLabels:
      app: secret-use-pod-base64
  replicas: 1
  template:
    metadata:
      labels:
        app:  secret-use-pod-base64
    spec:
      containers:
      - name:  nginx
        image:  nginx
        ports:
          - containerPort:  80
        volumeMounts: 
          - name: app-base64 # 必须要与volumes.name 相同
            mountPath: "/app" # 容器中挂载卷的位置
            readOnly: true
        env:
          - name: UN1
            valueFrom:
              secretKeyRef:
                name: secret-opaque-base64
                key: username1
      volumes:
        - name: app-base64 # 卷名称
          secret:
            secretName: secret-opaque-base64 # 创建的 Secret 名称
            items:
              - key: username1
                path: items/un
获取环境变量.png

4、Secret 更新之后对应的环境变量不会被更新

  • 修改 Secret
apiVersion: v1
kind: Secret
metadata:
  name: secret-opaque-base64
  namespace: raven
type: Opaque
data:
  username1: YWRtaW4xMTE=
  password1: cHcxMTE=
  username2: YWRtaW4y
  password2: cHcyMjI=
  username3: YWRtaW4z
  password3: cHczMzM=
  • 环境变量不更新 环境变量不更新.png
  • 挂载可更新 image.png

相关文章

网友评论

    本文标题:38-存储-Secret

    本文链接:https://www.haomeiwen.com/subject/pmkllrtx.html