Secret(用户端)

简介

当需要存储一些非敏感配置数据时可以使用 ConfigMap,当你想要存储一些敏感数据时使用 Secret,例如(passwords, OAuth tokens, ssh keys, credentials 等)

例如有以下 Secret

Secret(加密字典) - 图1

高级模式详情如下:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: example-secret
  5. labels:
  6. wayne-app: example
  7. wayne-ns: demo
  8. app: example-secret
  9. type: Opaque
  10. data:
  11. username: YWRtaW4=
  12. password: MWYyZDFlMmU2N2Rm
注意: 在表单上 Secret 的值直接填写明文,但在高级模式下 Secret 的 value 必须经过 base64。普通模式下填写明文平台会自动转换。

使用方式:

1. 通过环境变量使用

Secret(加密字典) - 图2

高级模式使用示例:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: secret-env-pod
  5. spec:
  6. containers:
  7. - name: mycontainer
  8. image: redis
  9. env:
  10. - name: SECRET_USERNAME
  11. valueFrom:
  12. secretKeyRef:
  13. name: example-secret #指定 secret 名称
  14. key: username #要使用的 key
  15. - name: SECRET_PASSWORD
  16. valueFrom:
  17. secretKeyRef:
  18. name: example-secret
  19. key: password
  1. $ echo $SECRET_USERNAME
  2. admin
  3. $ echo $SECRET_PASSWORD
  4. 1f2d1e2e67df

2. 挂载到文件

仅支持高级模式

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: mypod
  5. namespace: default
  6. spec:
  7. containers:
  8. - image: redis
  9. name: mypod
  10. volumeMounts:
  11. - mountPath: /etc/foo
  12. name: foo
  13. readOnly: true
  14. volumes:
  15. - name: foo
  16. secret:
  17. defaultMode: 420 #0644 默认文件权限,由于 json 文件不支持八进制,使用 json 时应使用十进制
  18. secretName: example-secret

运行结果:在 /etc/foo/ 目录下生成两个文件 username 和 password

  1. foo/
  2. |-- password -> ..data/password
  3. `-- username -> ..data/username
  4. #cat username admin
  5. #cat password 1f2d1e2e67df
注意: 自动更新: 当 Secrets 被更新时,已经挂载的 pod 不会立即更新,而要等待 kubelete 检查周期,kubelet 会定期检查 secret 变化并更新它。

3. 拉取镜像

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: image-test-secret
  5. namespace: default
  6. type: kubernetes.io/dockerconfigjson
  7. data:
  8. .dockerconfigjson: ew0KCSJhdXRocyI6IHsNCgkJImltYWdlLXRlc3QiOiB7DQoJCQkiYXV0aCI6ICJjbTl2ZERweWIyOTAiLA0KCQkJImVtYWlsIjogIiINCgkJfQ0KCX0NCn0=

加密部分的明文为:

  1. {
  2. "auths": {
  3. "image-test": {
  4. "auth": "cm9vdDpyb290", # 密文为 "root:root"base64 的结果
  5. "email": ""
  6. }
  7. }
  8. }

部署文件使用如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: foo
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: foo
  9. image: janedoe/awesomeapp:v1
  10. imagePullSecrets:
  11. - name: image-test-secret

实际使用例子(挂载证书文件):

  1. kind: Secret
  2. apiVersion: v1
  3. metadata:
  4. name: client-certs
  5. namespace: default
  6. data:
  7. ca.pem: *** #实际使用请替换成经过 base64 加密后的内容
  8. kubernetes.pem: ***
  9. kubernetes-key.pem: ***

使用 deployment 部署:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: redis
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: redis
  10. template:
  11. metadata:
  12. labels:
  13. app: redis
  14. spec:
  15. containers:
  16. - name: redis
  17. image: redis
  18. ports:
  19. - containerPort: 8080
  20. volumeMounts:
  21. - mountPath: /etc/kubernetes/certs
  22. name: my-certs
  23. volumes:
  24. - name: my-certs
  25. secret:
  26. secretName: client-certs
  27. imagePullSecrets:
  28. - name: image-test-secret

360 搜索 私有云团队 提供技术支持

原文: https://github.com/Qihoo360/wayne/wiki/Wayne-portal-secret