官网有关信息https://kubernetes.io/zh/docs/concepts/configuration/secret/
概述
什么是Secret
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。
Secret 类似于 ConfigMap 但专门用于保存机密数据。
注意: 默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret; 这包括间接访问,例如创建 Deployment 的能力。
为了安全地使用 Secret,请至少执行以下步骤:
- 为 Secret 启用静态加密;
- 启用或配置 RBAC 规则来限制读取 Secret 的数据(包括通过间接方式)。
- 在适当的情况下,还可以使用 RBAC 等机制来限制允许哪些主体创建新 Secret 或替换现有 Secret。
Secret 的类型
创建 Secret 时,你可以使用 Secret 资源的 type 字段, 或者与其等价的 kubectl 命令行参数(如果有的话)为其设置类型。 Secret 的 type 有助于对不同类型机密数据的编程处理。
Kubernetes 提供若干种内置的类型,用于一些常见的使用场景。 针对这些类型,Kubernetes 所执行的合法性检查操作以及对其所实施的限制各不相同。
内置类型 | 用法 |
---|
Opaque | 用户定义的任意数据 | kubernetes.io/service-account-token | 服务账号令牌 | kubernetes.io/dockercfg ~/.dockercfg | 文件的序列化形式 | kubernetes.io/dockerconfigjson ~/.docker/config.json | 文件的序列化形式 | kubernetes.io/basic-auth | 用于基本身份认证的凭据 | kubernetes.io/ssh-auth | 用于 SSH 身份认证的凭据 | kubernetes.io/tls | 用于 TLS 客户端或者服务器端的数据 | bootstrap.kubernetes.io/token | 启动引导令牌数据 |
示例
要求
- 在namespace istio-system 里面有secret db1-test,把它的username和password存到不同的文件中。
- 在namespace istio-system 里面新建secret db2-test,username:production、password:Kvm123
- 创建一个pod,通过volume挂载secret
Pod name: secret-pod Namespace: istio-system Container name: dev-container Volume name: secret-volume Mount path: /etc/secret
实验步骤
- 查看现有namespace istio-system的db1-test
root@master-01:~/tmp# kubectl get secrets db1-test -n istio-system -o yaml apiVersion: v1 data: password: Vk13YXJlMSE= username: dnNwaGVyZQ== kind: Secret metadata: creationTimestamp: “2021-10-21T13:34:26Z” name: db1-test namespace: istio-system resourceVersion: “344387” uid: aa427ece-fe9a-4249-a72a-74bda68317b3 type: Opaque
- 把Secret中的username和password导入文件
root@master-01:~/tmp# echo “dnNwaGVyZQ==” | base64 -d > old-user.txt root@master-01:~/tmp# echo “Vk13YXJlMSE=” | base64 -d > old-pass.txt root@master-01:~/tmp# cat old-user.txt vsphere root@master-01:~/tmp# cat old-pass.txt VMware1!
- 创建新的Secret
root@master-01:~/tmp# kubectl create secret generic db2-test --from-literal=username=production --from-literal=password=Kvm123 -n istio-system secret/db2-test created root@master-01:~/tmp# kubectl get secrets -n istio-system db2-test -o yaml apiVersion: v1 data: password: S3ZtMTIz username: cHJvZHVjdGlvbg== kind: Secret metadata: creationTimestamp: “2021-10-21T14:43:28Z” name: db2-test namespace: istio-system resourceVersion: “350271” uid: 4a7b64d8-47d6-46af-bbd3-9647d2a9c883 type: Opaque
- 编写Pod的yaml文件
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
namespace: istio-system
spec:
containers:
- name: dev-container
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db2-test
- 应用pod的yaml文件并查看
root@master-01:~/tmp# kubectl get po secret-pod -n istio-system -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
......
creationTimestamp: "2021-10-21T14:47:02Z"
name: secret-pod
namespace: istio-system
......
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: dev-container
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/secret
name: secret-volume
readOnly: true
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-vlxrp
readOnly: true
......
nodeName: worker-02
preemptionPolicy: PreemptLowerPriority
priority: 0
......
volumes:
- name: secret-volume
secret:
defaultMode: 420
secretName: db2-test
- name: kube-api-access-vlxrp
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
|