Kubernetes资源对象--Secret

Secret是为了解决密码,token或秘钥等比较敏感的数据的配置问题,避免了直接将这些数据暴露在镜像或者Pod Spec中。

1.Secret的类型

Secret有三种类型:

  • Opaque
    基于base64编码,用来存储密码等,但是可以通过base64 --decode解码,加密性很弱。
  • kubernetes.io/dockerconfigjson
    用来存储私有docker registry的认证信息。
  • kubernetes.io/service-account-token
    用于被serviceaccount引用,用于集群间组件通信的令牌。
    以下以Opaque类型为主做记录。

2.创建Secret

有四种方式可以创建Secret

  • 通过--from-literal
    kubectl create secret generic mysecret --from-literal=username=admin --from--literal=password=123456
    一个--from-literal对应一个条目
  • 通过--from-file
echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret1 --from-file=./username --from-file=./password

一个文件对应一个条目

  • 通过--from-env-file
cat << EOF > env.txt
username=admin
password=123456
EOF

kubectl create secret generic mysecret2 --from-env-file=env.txt

env.txt中每一行key=value对应一个条目

  • 通过yaml文件
apiVersion: v1
kind: Secret
metadata:
  name: mysecret3
data:
  username: YWRtaW4=
  password: MTIzNDU2

其中data中的敏感数据必须是base64编码后的结果。


3.使用Secret

有两种方式使用Secret,分别为Volume和环境变量

3.1 Pod中Volume挂载使用Secret

创建yaml配置文件volume_secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume_secret
spec:
  containers:
  - name: volume_secret
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/test; sleep 30000
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: mysecret3

执行创建应用,然后进入busybox中:
kubectl exec -it volume_secret sh
查看/etc/secrets/username,/etc/secrets/password可得到Secret

可以看出,kubernetes会再指定的路径/etc/secrets为Secret中每一个条目数据创建一个文件,文件名就是条目的key,文件内容就是条目的value。

也可以指定存放数据的文件名,比如将上面的yaml文件修改为:
在最后添加:

      secretName: mysecret3
      items:
      - key: username
        path: /etc/test/my_username
      - key: password
        path: /etc/test/my_password

Volume方式使用的Secret支持动态更新,当Secret更新后,容器中的数据也会相应的更新。

3.2 环境变量方式使用Secret

创建env_secret.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: env-secret
spec:
  containers:
  - name: env-secret
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/test; sleep 30000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret3
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret3
            key: password

执行应用进入容器中查看,通过环境变量SECRET_USERNAME和SECRET_PASSWORD可以读取到Secret的数据。

与volume不同的是,环境变量的方式读取Secret很方便,但是不能动态更新

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容