Secret存在的意义
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。
Secret 可以以 Volume 或 环境变量的方式使用,也就意味着,我们有一些密码要被我们的pod所使用的时候,完全可以先存储在我们的 secret中,当pod启动的时候挂载进去即可
Secret 有三种类型:
- Service Account(SA):用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
- Opaque:base64编码格式的Secret,用来存储密码、密钥等
- kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
1.Service Account (不常用)
1 |
Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 这么一个 /run/secrets/kubernetes.io/serviceaccount 目录下 |
访问任意一个pod查看
1 |
kubectl exec -it my-nginx-795c744bfc-cc6vf /bin/bash |

1 2 3 |
ca.crt 是证书信息 namespace 当前在哪个命名空间下 token 认证信息 |
2.Opaque :base64编码格式的Secret,用来存储密码、密钥等 (常用)
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
例如我们要把某个密码加密保存
那么先把这个密码转成base64位,然后再写入我们的配置文件中
1 2 3 4 5 6 7 8 9 |
账号: echo -n "admin" | base64 YWRtaW4= 密码: echo -n "1f2d1e2e67df" | base64 MWYyZDFlMmU2N2Rm |
创建一个secret
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: MWYyZDFlMmU2N2Rm username: YWRtaW4= |
创建成功后查看
1 |
kubectl get secret |

k8s会为每个命名空间下创建一个sa,用于pod的挂载
接下来将创建好的secret挂载到pod中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: v1 kind: Pod metadata: labels: name: seret-test name: seret-test spec: volumes: - name: secrets secret: secretName: mysecret # 读取哪个secrect? containers: - image: hub.atshooter.com/k8s/nginx:v1.0 name: db volumeMounts: - name: secrets mountPath: "/etc/secrets" 将mysecret挂载到容器的/etc/secrets目录下 readOnly: true |
创建后查看pod /etc/secrets 目录下是否多了2个文件

查询已然多了2个文件,查看文件内容是解密后的,secret 用户名和密码,虽然创建时候用base64加密保存的,但是在使用中他会自动解密
接下来将 Secret 导出到环境变量中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: pod-deployment spec: replicas: 2 template: metadata: labels: app: pod-deployment spec: containers: - name: pod-1 image: hub.atshooter.com/k8s/nginx:v1.0 ports: - containerPort: 80 env:#环境变量 - name: TEST_USER valueFrom: secretKeyRef: name: mysecret key: username - name: TEST_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password |
创建成功后登录pod查看pod环境变量

3.kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息(常用)
例如:docker去下载镜像,如果是私有镜像,那么需要输入仓库的账号密码,我们就可以用secret来事先设置好它登录私有仓库的账号和密码,其实就是认证秘钥。
使用 Kuberctl 创建 docker registry 认证 secret
1 2 3 4 5 6 7 8 |
kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 格式: 创建类型为:docker-registry 名称为 myregistrykey --docker-server=私有仓库地址 --docker-username=docker用户名 --docker-password=docker密码 --docker-email=docker邮箱 secret "myregistrykey" 执行: kubectl create secret docker-registry myregistrykey --docker-server=hub.shooter.com --docker-username=admin --docker-passwd=Harbor12345 --docker-email=tuolv@126.com |
1 2 3 4 5 6 7 8 9 10 |
apiVersion: v1 kind: Pod metadata: name: foo spec: containers: - name: foo image: hub.atshooter.com/k8s/nginx:v1.0 imagePullSecrets: #如果下载镜像要认证,就加上这2行,认证规则调用secret名称为myregistrykey - name: myregistrykey #认证规则名称与你创建的要对应 |
- 本文固定链接: https://www.yoyoask.com/?p=2280
- 转载请注明: shooter 于 SHOOTER 发表