K8s新手系列之Secret资源

打印 上一主题 下一主题

主题 1616|帖子 1616|积分 4848

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
概述

官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/
在Kubernetes(k8s)中,Secret是一种用于存储和管理敏感信息(如密码、API密钥、TLS证书等)的资源对象。
Secret和ConfigMap类似,但是Secret专门用于保存机密数据。
如需学习ConfigMap请阅读这篇文章:K8s新手系列之ConfigMap资源
Secret的作用


  • 存储敏感数据:避免在Pod定义或容器镜像中明文存储敏感信息。
  • 与ConfigMap区分:ConfigMap用于非敏感设置数据,而Secret专为敏感数据设计(数据以Base64编码存储,但非加密)。
  • 安全共享:通过RBAC控制访问权限,确保只有授权的Pod和服务账号能使用Secret。
Secret的范例

创建 Secret 时,你可以使用 Secret 资源的 type 字段,或者与其等价的 kubectl 下令行参数为其设置范例。 设置Secret范例有助于对 Secret 数据举行编程处理。
Kubernetes 提供多少种内置的Secret范例,用于一些常见的使用场景。 针对这些范例,Kubernetes 所执行的合法性查抄操作以及对其所实施的限制各不雷同。
内置范例用法Opaque用户定义的任意数据kubernetes.io/service-account-token服务账命令牌kubernetes.io/dockerconfigjson存储Docker镜像仓库的认证信息。kubernetes.io/basic-auth用于基本身份认证的凭据kubernetes.io/ssh-auth用于 SSH 身份认证的凭据kubernetes.io/tls用于 TLS 客户端或者服务器端的数据bootstrap.kubernetes.io/token启动引导令牌数据创建Secret的留意事项

每个 Secret 的尺寸最多为 1MiB。施加这一限制是为了避免用户创建非常大的 Secret, 进而导致 API 服务器和 kubelet 内存耗尽。不过创建许多小的 Secret 也可能耗尽内存。 你可以使用资源配额来约束每个名称空间中 Secret(或其他资源)的个数。
在创建 Secret 编写设置文件时,你可以设置 data 或 stringData 字段。 data 和 stringData 字段都是可选的。data 字段中所有值都必须是 base64编码 的字符串。stringData 字段可以使用任何字符串作为其取值。
data 和 stringData 中的键名只能包含字母、数字、-、_ 或 . 字符。 stringData 字段中的所有键值对都会在内部被归并到 data 字段中。 如果某个主键同时出如今 data 和 stringData 字段中,stringData 所指定的键值具有高优先级。
Secret的创建方式

官方说明Secret可以通过三种方式来创建,分别是

  • kubectl工具
  • 资源清单文件
  • Kustomize工具(这里不做解说,有兴趣可查看官方文档)
kubectl创建Secret

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configmap-secret/managing-secret-using-kubectl/
语法及留意事项:
  1. # 从字面量进行创建
  2. kubectl create secret <secret-type> <secret-name> [--from-literal=key=value]
  3. # 使用文件进行创建,
  4. # 默认会将文件名当作secret的Key
  5. kubectl create secret <secret-type> <secret-name> [--from-literal=filepath]
  6. # 指定secret的key
  7. kubectl create secret <secret-type> <secret-name> [--from-literal=key=filepath]
复制代码
留意事项

通过kubectl创建Secret时,其secret范例只有三类。
  1. [root@master01 ~]# kubectl create secret --help
  2. Create a secret using specified subcommand.
  3. Available Commands:
  4.   docker-registry   Create a secret for use with a Docker registry
  5.   generic           Create a secret from a local file, directory, or literal value
  6.   tls               Create a TLS secret
复制代码

  • docker-registry:对应K8s内置范例的kubernetes.io/dockerconfigjson,存储Docker镜像仓库的认证信息。
  • generic:对应K8s内置范例的Opaque,存储用户定义的任意数据
  • tls:对应K8s内置范例的kubernetes.io/tls,存储TLS 客户端或者服务器端的数据
通过kubectl创建的secret,岂论是通过字面量创建还是通过文件创建,默认都会举行base64编码并存储到data字段中
kubectl创建generic范例的secret

从字面量举行创建
  1. # 创建secret
  2. [root@master01 ~]# kubectl create secret generic db-secret  --from-literal=username=root --from-literal=password=huangsir
  3. secret/db-secret created
  4. # 验证是否创建成功
  5. [root@master01 ~]# kubectl get secret
  6. NAME        TYPE     DATA   AGE
  7. db-secret   Opaque   2      10s
  8. # 查看secret的详细信息
  9. [root@master01 ~]# kubectl describe secret db-secret
  10. Name:         db-secret
  11. Namespace:    default
  12. Labels:       <none>
  13. Annotations:  <none>
  14. Type:  Opaque
  15. Data
  16. ====
  17. # 发现这里只显示字节数,并不现实具体的内容
  18. password:  8 bytes
  19. username:  4 bytes
  20. # 通过yaml查看
  21. [root@master01 ~]# kubectl get secret db-secret -o yaml
  22. apiVersion: v1
  23. data:
  24.   # 发现password和username字段都存储在data字段,并进行了加密
  25.   password: aHVhbmdzaXI=
  26.   username: cm9vdA==
  27. kind: Secret
  28. metadata:
  29.   creationTimestamp: "2025-05-03T06:40:25Z"
  30.   name: db-secret
  31.   namespace: default
  32.   resourceVersion: "138650"
  33.   uid: 2b45f560-94bc-4991-b095-7e7410178fe9
  34. type: Opaque
  35. # 解密查看password和username是否和创建时输入的一样
  36. [root@master01 ~]# echo aHVhbmdzaXI= | base64 -d
  37. huangsir
  38. [root@master01 ~]# echo cm9vdA== | base64 -d
  39. root
复制代码
如果我们创建时指定value已经是base64编码的数据,这个时候K8s会怎么处理呢?
  1. #创建secret
  2. [root@master01 ~]# kubectl create secret generic db-secret-base64  --from-literal=username="cm9vdA==" --from-literal=password="aHVhbmdzaXI="
  3. secret/db-secret-base64 created
  4. # 查看对应的资源
  5. [root@master01 ~]# kubectl get secret db-secret-base64 -o yaml
  6. apiVersion: v1
  7. data:
  8.   # 发现这里又进行了加密
  9.   password: YUhWaGJtZHphWEk9
  10.   username: Y205dmRBPT0=
  11. kind: Secret
  12. metadata:
  13.   creationTimestamp: "2025-05-03T06:52:58Z"
  14.   name: db-secret-base64
  15.   namespace: default
  16.   resourceVersion: "140369"
  17.   uid: 5f3b2ca6-abf7-4a62-9fbe-e541d41574d3
  18. type: Opaque
复制代码
通过上述发现,K8s默认会举行base64的编码,这个是K8s API强烈要求的,无法跳过的。
通过文件创建secret
  1. # 创建模拟数据
  2. [root@master01 ~]# mkdir -p /root/secret && echo 'root' >> /root/secret/username.txt && echo 'huangsir' >> /root/secret/password.txt
  3. # 通过文件创建secret
  4. [root@master01 ~]# kubectl create secret generic file-secret-1 \
  5. --from-file=/root/secret/username.txt \
  6. --from-file=/root/secret/password.txt
  7. # 查看创建的secret
  8. [root@master01 ~]# kubectl get secret file-secret-1 -o yaml
  9. apiVersion: v1
  10. data:
  11.   # 默认以文件名作为key
  12.   password.txt: aHVhbmdzaXIK
  13.   username.txt: cm9vdAo=
  14. kind: Secret
  15. metadata:
  16.   creationTimestamp: "2025-05-03T07:03:13Z"
  17.   name: file-secret-1
  18.   namespace: default
  19.   resourceVersion: "141776"
  20.   uid: 2e888891-8ade-46ff-a2f9-3d890d032d19
  21. type: Opaque
复制代码
通过文件创建secret时,指定key
  1. # 创建key
  2. [root@master01 ~]# kubectl create secret generic file-secret-2 \
  3. --from-file=name=/root/secret/username.txt \
  4. --from-file=password=/root/secret/password.txt
  5. # 查看生成的yaml
  6. [root@master01 ~]# kubectl get secret file-secret-2 -o yaml
  7. apiVersion: v1
  8. data:
  9.   # 这里已经是指定的key了
  10.   name: cm9vdAo=
  11.   password: aHVhbmdzaXIK
  12. kind: Secret
  13. metadata:
  14.   creationTimestamp: "2025-05-03T07:05:29Z"
  15.   name: file-secret-2
  16.   namespace: default
  17.   resourceVersion: "142087"
  18.   uid: b193e0d9-1c1e-43b6-aad4-ec35c40d77ea
  19. type: Opaque
复制代码
通过目录创建secret
  1. # 创建secret
  2. [root@master01 ~]# kubectl create secret generic file-secret-3 \
  3. --from-file=/root/secret/
  4. # 查看secret信息
  5. [root@master01 ~]# kubectl get secret file-secret-3 -o yaml
  6. apiVersion: v1
  7. data:
  8.   # 默认以文件名为key,文件内容为value
  9.   password.txt: aHVhbmdzaXIK
  10.   username.txt: cm9vdAo=
  11. kind: Secret
  12. metadata:
  13.   creationTimestamp: "2025-05-03T07:16:10Z"
  14.   name: file-secret-3
  15.   namespace: default
  16.   resourceVersion: "143557"
  17.   uid: 8cbe3e73-f8e7-4c9f-8a9c-fca51c482d33
  18. type: Opaque
复制代码
kubectl创建docker-registry范例的secret

docker-registry范例的secret重要是存储Docker镜像仓库的认证信息,当我们的镜像仓库为私有仓库且须要认证信息时,可以使用该范例的secret
通过字面量创建

示例:
  1. # 创建secret
  2. [root@master01 ~]# kubectl create secret docker-registry my-registry-secret \
  3.   --docker-server=registry.example.com \
  4.   --docker-username=admin \
  5.   --docker-password=mysecretpassword \
  6.   --docker-email=admin@example.com
复制代码
参数解析:

  • --docker-server:仓库的域名
  • --docker-username:仓库的用户名
  • --docker-password:仓库的密码
  • --docker-email:邮箱,可选项
查看上面创建号的secret
  1. [root@master01 ~]# kubectl get secret my-registry-secret -o yaml
  2. apiVersion: v1
  3. data:
  4.   .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5leGFtcGxlLmNvbSI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJteXNlY3JldHBhc3N3b3JkIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImF1dGgiOiJZV1J0YVc0NmJYbHpaV055WlhSd1lYTnpkMjl5WkE9PSJ9fX0=
  5. kind: Secret
  6. metadata:
  7.   creationTimestamp: "2025-05-03T07:23:18Z"
  8.   name: my-registry-secret
  9.   namespace: default
  10.   resourceVersion: "144535"
  11.   uid: fafbf6e5-82da-428f-ab4f-611c2e6db99f
  12. type: kubernetes.io/dockerconfigjson
复制代码
通过设置文件创建secret

首先须要生成Docker设置文件,确保已经登录到目的的镜像仓库
  1. docker login <镜像仓库域名> -u <username> -p <password>
复制代码
登录之后会生成 ~/.docker/config.json 文件
  1. [root@master01 ~]# cat ~/.docker/config.json
  2. {
  3.         "auths": {
  4.                 "sealos.hub:5000": {
  5.                         "auth": "YWRtaW46cGFzc3cwcmQ="
  6.                 }
  7.         }
  8. }
复制代码
从设置文件创建secret
  1. [root@master01 ~]# kubectl create secret docker-registry sealos-secret \
  2.   --from-file=.dockerconfigjson=/root/.docker/config.json
复制代码
查看已经创建好的secret
  1. [root@master01 ~]# kubectl get secret sealos-secret -o yaml
  2. apiVersion: v1
  3. data:
  4.   .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJzZWFsb3MuaHViOjUwMDAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2Y0dGemMzY3djbVE9IgoJCX0KCX0KfQ==
  5. kind: Secret
  6. metadata:
  7.   creationTimestamp: "2025-05-03T07:34:36Z"
  8.   name: sealos-secret
  9.   namespace: default
  10.   resourceVersion: "146085"
  11.   uid: 56fee5b2-93a4-48f4-8bad-66490539e4e1
  12. type: kubernetes.io/dockerconfigjson
复制代码
kubectl创建tls范例的secret

语法:
  1. kubectl create secret tls <Secret名称> \
  2.   --cert=<证书文件路径> \
  3.   --key=<私钥文件路径> \
  4.   [--namespace=<命名空间>]  # 可选,指定命名空间
复制代码
示例

假设我们已经有了公钥(tls.crt)和私钥(tls.key)文件
创建tls的secret
  1. [root@master01 ~/ssl]# kubectl create secret tls tls-secret \
  2.   --cert=/root/ssl/tls.crt \
  3.   --key=/root/ssl/tls.key
复制代码
查看secret
  1. [root@master01 ~/ssl]# kubectl get secret tls-secret -o yaml
  2. apiVersion: v1
  3. data:
  4.   # 公钥的内容
  5.   tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYvek....#已做截取
  6.   # 私钥的内容
  7.   tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSU....#已做截取
  8. kind: Secret
  9. metadata:
  10.   creationTimestamp: "2025-05-03T07:41:35Z"
  11.   name: tls-secret
  12.   namespace: default
  13.   resourceVersion: "147041"
  14.   uid: 49197d8b-7403-45a6-b4d0-9fad4b367f4f
  15. type: kubernetes.io/tls
复制代码
通过资源文件创建secret

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configmap-secret/managing-secret-using-config-file/
资源清单文件中包含 2 个键值对:data 和 stringData。 data 字段用来存储 base64 编码的任意数据。 提供 stringData 字段是为了方便,它允许 Secret 使用未编码的字符串。
data 和 stringData 的键必须由字母、数字、-、_ 或 . 组成。
同时指定 data 和 stringData

如果你在 data 和 stringData 中设置了同一个字段,则使用来自 stringData 中的值。
例如,定义以下 Secret:
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: mysecret
  5. type: Opaque
  6. data:
  7.   username: YWRtaW4=
  8. stringData:
  9.   username: administrator
复制代码
所创建的 Secret 对象如下:
  1. apiVersion: v1
  2. data:
  3.   username: YWRtaW5pc3RyYXRvcg==
  4. kind: Secret
  5. metadata:
  6.   creationTimestamp: 2018-11-15T20:46:46Z
  7.   name: mysecret
  8.   namespace: default
  9.   resourceVersion: "7579"
  10.   uid: 91460ecb-e917-11e8-98f2-025000000001
  11. type: Opaque
复制代码
创建Opaque范例的secret

Opaque范例是secret中默认的范例,当创建secret时,如果不指定type字段,则默认为Opaque范例是secret
示例:创建stringData的secret(不推荐使用)

创建stringData的secret的之后,K8s默认会将stringData转为data。默认会举行base64的编码操作,这个是K8s逼迫性的,不可修改
  1. # 定义资源文件
  2. [root@master01 ~/secret]# cat db-secret-1.yaml
  3. apiVersion: v1
  4. kind: Secret
  5. metadata:
  6.   name: db-secret-1
  7. stringData:
  8.   name: root
  9.   password: huangsir
  10. type: Opaque
  11. # 创建secret
  12. [root@master01 ~/secret]# kubectl apply -f db-secret-1.yaml
  13. secret/db-secret-1 created
  14. # 查看secret
  15. [root@master01 ~/secret]# kubectl get secret db-secret-1 -o yaml
  16. apiVersion: v1
  17. # 发现K8s默认将stringData转成了data类型的
  18. data:
  19.   # 进行了base64编码操作
  20.   name: cm9vdA==
  21.   password: aHVhbmdzaXI=
  22. kind: Secret
  23. metadata:
  24.   annotations:
  25.     kubectl.kubernetes.io/last-applied-configuration: |
  26.       {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"db-secret-1","namespace":"default"},"stringData":{"name":"root","password":"huangsir"}}
  27.   creationTimestamp: "2025-05-03T07:53:15Z"
  28.   name: db-secret-1
  29.   namespace: default
  30.   resourceVersion: "148645"
  31.   uid: ae13c565-6c0b-4071-bd9b-d48f1ed22a19
  32. type: Opaque
复制代码
示例:创建data的secret
  1. # 先进行base64编码操作
  2. [root@master01 ~/secret]# echo root-huangsir | base64
  3. cm9vdC1odWFuZ3Npcgo=
  4. [root@master01 ~/secret]# echo huangsir | base64
  5. aHVhbmdzaXIK
  6. # 定义资源文件
  7. [root@master01 ~/secret]# cat db-secret-2.yaml
  8. apiVersion: v1
  9. kind: Secret
  10. metadata:
  11.   name: db-secret-2
  12. # 定义data类型
  13. data:
  14.   # 注意value值要使用base64编码的字符串
  15.   name: cm9vdC1odWFuZ3Npcgo=
  16.   password: aHVhbmdzaXIK
  17. type: Opaque
  18. # 创建secret
  19. [root@master01 ~/secret]# kubectl get secret db-secret-2
  20. NAME          TYPE     DATA   AGE
  21. db-secret-2   Opaque   2      13s
  22. # 查看详细的资源信息
  23. [root@master01 ~/secret]# kubectl get secret db-secret-2 -o yaml
  24. apiVersion: v1
  25. data:
  26.   name: cm9vdC1odWFuZ3Npcgo=
  27.   password: aHVhbmdzaXIK
  28. kind: Secret
  29. metadata:
  30.   annotations:
  31.     kubectl.kubernetes.io/last-applied-configuration: |
  32.       {"apiVersion":"v1","data":{"name":"cm9vdC1odWFuZ3Npcgo=","password":"aHVhbmdzaXIK"},"kind":"Secret","metadata":{"annotations":{},"name":"db-secret-2","namespace":"default"},"type":"Opaque"}
  33.   creationTimestamp: "2025-05-03T08:01:11Z"
  34.   name: db-secret-2
  35.   namespace: default
  36.   resourceVersion: "149733"
  37.   uid: 60757c0c-64fa-4116-9058-d471ca0d6a8d
  38. type: Opaque
复制代码
创建dockerconfigjson范例的secret

假设你已经登录了docker的私有仓库,可以查看~/.docker/config.json文件
示例:
  1. [root@master01 ~]# cat ~/.docker/config.json
  2. {
  3.         "auths": {
  4.                 "sealos.hub:5000": {
  5.                         "auth": "YWRtaW46cGFzc3cwcmQ="
  6.                 }
  7.         }
  8. }
复制代码
对~/.docker/config.json内容举行base64编码
  1. [root@master01 ~]# cat ~/.docker/config.json | base64
  2. ewoJImF1dGhzIjogewoJCSJzZWFsb3MuaHViOjUwMDAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2
  3. Y0dGemMzY3djbVE9IgoJCX0KCX0KfQ==
复制代码
编写资源文件
  1. [root@master01 ~/secret]# cat sealos-secret.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5.   name: sealos-registry-1
  6. data:
  7.   .dockerconfigjson: |
  8.     ewoJImF1dGhzIjogewoJCSJzZWFsb3MuaHViOjUwMDAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2Y0dGemMzY3djbVE9IgoJCX0KCX0KfQ==
  9. type: kubernetes.io/dockerconfigjson
复制代码
查看创建好的secret信息
  1. [root@master01 ~/secret]# kubectl get secret sealos-registry-1 -o yaml
  2. apiVersion: v1
  3. data:
  4.   .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJzZWFsb3MuaHViOjUwMDAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2Y0dGemMzY3djbVE9IgoJCX0KCX0KfQ==
  5. kind: Secret
  6. metadata:
  7.   annotations:
  8.     kubectl.kubernetes.io/last-applied-configuration: |
  9.       {"apiVersion":"v1","data":{".dockerconfigjson":"ewoJImF1dGhzIjogewoJCSJzZWFsb3MuaHViOjUwMDAiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2Y0dGemMzY3djbVE9IgoJCX0KCX0KfQ==\n"},"kind":"Secret","metadata":{"annotations":{},"name":"sealos-registry-1","namespace":"default"},"type":"kubernetes.io/dockerconfigjson"}
  10.   creationTimestamp: "2025-05-03T08:16:08Z"
  11.   name: sealos-registry-1
  12.   namespace: default
  13.   resourceVersion: "151784"
  14.   uid: 1cd1377a-2d71-4a6f-9d5b-520d6806d942
  15. type: kubernetes.io/dockerconfigjson
复制代码
创建tls范例secret

假设你已经有了证书,我们可以对其证书举行base64编码
  1. # 编码公钥
  2. cat tls.crt | base64
  3. # 编码私钥
  4. cat tls.key | base64
复制代码
编写资源文件
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: secret-tls
  5. type: kubernetes.io/tls
  6. data:
  7.   # tls.crt,指定公钥文件
  8.   tls.crt: |
  9.     LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t
  10.   # tls.key,指定私钥文件
  11.   tls.key: |
  12.     RXhhbXBsZSBkYXRhIGZvciB0aGUgVExTIGNydCBmaWVsZA==
复制代码
创建其它范例的secret,可以参考官网文档

官网文档地址:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/
查看Secret

语法:
  1. kubectl get secret <secret-name> <选项>
复制代码
示例:
  1. # 查看默认名称空间下的secret
  2. [root@master01 ~/secret]# kubectl get secret
  3. NAME         TYPE                DATA   AGE
  4. db-secret    Opaque              2      4h10m
  5. tls-secret   kubernetes.io/tls   2      17m
  6. # 查看所有的secret
  7. [root@master01 ~/secret]# kubectl get secret -A
  8. NAMESPACE          NAME                           TYPE                            DATA   AGE
  9. calico-apiserver   calico-apiserver-certs         Opaque                          2      7d6h
  10. calico-system      node-certs                     Opaque                          2      7d6h
  11. calico-system      typha-certs                    Opaque                          2      7d6h
  12. default            db-secret                      Opaque                          2      4h10m
  13. default            tls-secret                     kubernetes.io/tls               2      17m
  14. kube-system        bootstrap-token-1438e6         bootstrap.kubernetes.io/token   6      7d6h
  15. tigera-operator    calico-apiserver-certs         Opaque                          2      7d6h
  16. tigera-operator    node-certs                     Opaque                          2      7d6h
  17. tigera-operator    sh.helm.release.v1.calico.v1   helm.sh/release.v1              1      7d6h
  18. tigera-operator    tigera-ca-private              Opaque                          2      7d6h
  19. tigera-operator    typha-certs                    Opaque                          2      7d6h
  20. # 以yaml文件查看
  21. [root@master01 ~/secret]# kubectl get secret db-secret -o yaml
  22. apiVersion: v1
  23. data:
  24.   password: cm9vdAo=
  25.   username: cm9vdAo=
  26. kind: Secret
  27. metadata:
  28.   annotations:
  29.     kubectl.kubernetes.io/last-applied-configuration: |
  30.       {"apiVersion":"v1","data":{"password":"cm9vdAo=","username":"cm9vdAo="},"kind":"Secret","metadata":{"annotations":{},"name":"db-secret","namespace":"default"},"type":"Opaque"}
  31.   creationTimestamp: "2025-05-03T08:32:46Z"
  32.   name: db-secret
  33.   namespace: default
  34.   resourceVersion: "154076"
  35.   uid: c7ddc9d8-0469-4e32-beec-4c0976f23999
  36. type: Opaque
复制代码
修改secret

通过kubectl方式修改

可以通过kubectl edit secret  -n 来举行修改其值,使用kubectl下令之后,会打开一个类似vim的编辑界面,修改之后使用:wq保存之后即可
通过资源文件修改

修改了资源文件之后,通过kubectl apply -f 应用即可。
secret雷同的key会举行覆盖,不同的key会举行添加,并不会举行删除多余的key
Pod使用secret

Secret 可以以数据卷的形式挂载,也可以作为环境变量袒露给 Pod 中的容器使用,当然Pod也可以以其它的方式使用secret,例如镜像拉取的密钥。
如果 Pod 依赖于某 Secret,该 Secret 必须先于 Pod 创建。
静态Pod不能使用secret资源
Pod以环境变量的方式使用secret

创建secret
  1. [root@master01 ~]# echo 'apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: db-secret
  5. data:
  6.   username: cm9vdAo=
  7.   password: cm9vdAo=
  8. type: Opaque' | kubectl apply -f -
复制代码
创建Pod
  1. [root@master01 ~]# echo 'apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: pod-evc-secret-1
  5. spec:
  6.   containers:
  7.   - name: busybox
  8.     image: busybox:latest
  9.     command: ["/bin/sh", "-c", "printenv"]
  10.     env:
  11.       - name: PASSWORD
  12.         valueFrom:
  13.           # 定义value从secret来
  14.           secretKeyRef:
  15.             # 指定secret的名称
  16.             name: db-secret
  17.             # 指定secret中的key
  18.             key: password
  19.       - name: USERNAME
  20.         valueFrom:
  21.           secretKeyRef:
  22.             name: db-secret
  23.             key: username' | kubectl apply -f -
复制代码
验证环境变量是否设定成功
  1. # secret注入到Pod之后会自动解码
  2. [root@master01 ~]# kubectl logs pod-evc-secret-1 | grep -E "USERNAME|PASSWORD"
  3. USERNAME=root
  4. PASSWORD=root
复制代码
设置Pod镜像拉取的secret

可以通过pod.spec.imagePullSecretsl来设置镜像的拉取密钥.
这里已经创建了的相关密钥
示例:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: foo
  5.   namespace: awesomeapps
  6. spec:
  7.   containers:
  8.     - name: foo
  9.       image: janedoe/awesomeapp:v1
  10.   # 指定镜像拉取密钥
  11.   imagePullSecrets:
  12.     # secret的key
  13.     - name: myregistrykey
复制代码
Pod以存储卷的方式使用secret

创建tls范例的secret
  1. [root@master01 ~]# kubectl create secret tls tls-secret \
  2.   --cert=/root/ssl/tls.crt \
  3.   --key=/root/ssl/tls.key
复制代码
创建Pod挂载Secret

方式一:将ConfigMap中所有的Key挂载到Pod指定的路径下,这种方式有以下几个地方须要留意:


  • 如果Pod挂载所在的目录中有其它的文件或目录,会将其删除
  • 如果指定Pod挂载的目录不存在,会主动创建
  • 挂载时会主动创建对应secret中的文件
示例:
  1. # 定义资源文件
  2. [root@master01 ~/secret]# cat pod-nginx.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: secret-nginx
  7. spec:
  8.   # 创建数据卷,指定类型为secret
  9.   volumes:
  10.   - name: secret-volume
  11.     secret:
  12.       # 指定secret的名称
  13.       secretName: tls-secret
  14.   containers:
  15.   - name: nginx
  16.     image: nginx
  17.     # 挂载数据卷
  18.     volumeMounts:
  19.       # 指定数据卷的名称
  20.     - name: secret-volume
  21.       # 设置指定
  22.       readOnly: true
  23.       # 挂载容器内的路径
  24.       mountPath: "/etc/tls/secret-volume"
  25. # 创建Pod
  26. [root@master01 ~/secret]# kubectl apply -f pod-nginx.yaml
  27. pod/secret-nginx created
  28. # 查看Pod内部的文件
  29. [root@master01 ~/secret]# kubectl exec -it secret-nginx -- ls -l /etc/tls/secret-volume
  30. total 0
  31. lrwxrwxrwx 1 root root 14 May  3 12:30 tls.crt -> ..data/tls.crt
  32. lrwxrwxrwx 1 root root 14 May  3 12:30 tls.key -> ..data/tls.key
复制代码
方式二:如果只想挂载ConfigMap中的部分键,并且指定挂载到Pod中的文件名,可以使用items和subPath字段来实现
  1. # 定义资源文件
  2. [root@master01 ~/secret]# cat pod-nginx-subpath.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: secret-nginx-subpath
  7. spec:
  8.   # 创建数据卷,指定类型为secret
  9.   volumes:
  10.   - name: secret-volume
  11.     secret:
  12.       # 指定secret的名称
  13.       secretName: tls-secret
  14.       items:
  15.       - key: tls.crt
  16.         path: nginx.crt
  17.   containers:
  18.   - name: nginx
  19.     image: nginx
  20.     # 挂载数据卷
  21.     volumeMounts:
  22.       # 指定数据卷的名称
  23.     - name: secret-volume
  24.       # 设置指定
  25.       readOnly: true
  26.       # 挂载容器内的路径
  27.       mountPath: "/etc/tls/secret-volume/nginx.crt"
  28.       # 当使用subPath属性时,则mountPath执行的不是目录,而是文件
  29.       # 必要条件:一定要让subPath的值和items列表中的path值相同
  30.       subPath: nginx.crt
  31. # 创建Pod
  32. [root@master01 ~/secret]# kubectl apply -f pod-nginx-subpath.yaml
  33. pod/secret-nginx-subpath created
  34. # 验证是否挂载正确
  35. [root@master01 ~/secret]# kubectl exec -it secret-nginx-subpath -- ls -l /etc/tls/secret-volume
  36. total 4
  37. -rw-r--r-- 1 root root 3818 May  3 12:40 nginx.crt
复制代码
设置不可变更的Secret

Kubernetes v1.21的版本中提供了一种将各个 Secret 和 ConfigMap 设置为不可变更的选项。
禁止更改现有 Secret 有下列好处:

  • 防止意外(或非预期的)更新导致应用程序中断
  • 对于大量使用 Secret 的集群而言,至少数万个不同的 Secret 供 Pod 挂载,通过将 Secret 标志为不可变,可以极大降低 kube-apiserver 的负载,提升集群性能。 kubelet 不须要监视那些被标志为不可更改的 Secret。
实现方式:可以通过将 Secret 的 immutable 字段设置为 true 创建不可更改的 Secret
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   ...
  5. data:
  6.   ...
  7. immutable: true
复制代码
注:一旦一个 Secret 或 ConfigMap 被标志为不可更改,撤销此操作或者更改 data 字段的内容都是不可能的。 只能删除并重新创建这个 Secret。现有的 Pod 将维持对已删除 Secret 的挂载点 -- 建议重新创建这些 Pod。
挂载的Secret内容会被主动更新

当Pod中使用的 Secret 被更新时,所对应的Pod中对应Key也会被更新。
留意以下两种方式不会被更新,须要重启Pod:

  • 以环境变量方式使用的 Secret 数据不会被主动更新。
  • 使用 Secret 作为 subPath 卷挂载的容器将不会收到 Secret 的更新。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表