参考文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/
这个和ConfigMap很相似,这里选两个做下测试,就不过多赘述了
简介
Secret 类似于 ConfigMap 但专门用于保存机密数据。
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret; 这包括间接访问,例如创建 Deployment 的能力。
为了安全地使用 Secret,请至少执行以下步骤:
- 为 Secret 启用静态加密。
- 以最小特权访问 Secret 并启用或配置 RBAC 规则。
- 限制 Secret 对特定容器的访问。
- 考虑使用外部 Secret 存储驱动。
有关管理和提升 Secret 安全性的指南,请参阅 Kubernetes Secret 良好实践。
Secret的资源类型
内置类型 | 用法 |
---|---|
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 | 启动引导令牌数据 |
可选类型参数
● generic: 通用类型
● tls:此类型仅用于存储私钥和证书
● docker-registry: 保存docker 仓库的认证信息
使用场景
● 设置容器的环境变量。
● 向 Pod 提供 SSH 密钥或密码等凭据。
● 允许 kubelet 从私有镜像仓库中拉取镜像。
Secret的使用
创建 Secret 有以下几种可选方式:
● 使用kubectl
● 使用配置文件
● 使用 Kustomize 工具
当你在 Pod 中引用 Secret 时,你可以将该 Secret 标记为可选,就像下面例子中所展示的那样。 如果可选的 Secret 不存在,Kubernetes 将忽略它。
例如:
yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: true
使用 kubectl 编辑 Secret
yaml
#这将打开默认编辑器,并允许你更新 data 字段中的 base64 编码的 Secret 值
kubectl edit secrets <secret-name>
#请编辑下面的对象。以"#"开头的行将被忽略,
#空文件将中止编辑。如果在保存此文件时发生错误,
#则将重新打开该文件并显示相关的失败。
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
#清理
kubectl delete secret db-user-pass
在 Pod 以文件形式使用 Secret
让 Kubernetes 将该 Secret 的值以 文件的形式呈现,该文件存在于 Pod 中一个或多个容器内的文件系统内。
创建一个可以通过卷访问 Secret 数据的 Pod。
yaml
#创建Secret - 和ConfigMap使用方式是不是很像?就中间加了个类型 generic/docker-registry/...
kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'
#pods/inject/secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
# name 必须与下面的卷名匹配
- name: secret-volume
mountPath: /etc/secret-volume
readOnly: true
# Secret 数据通过一个卷暴露给该 Pod 中的容器
volumes:
- name: secret-volume
secret:
secretName: test-secret
#创建 Pod
kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml
#确认 Pod 正在运行
kubectl get pod secret-test-pod
#获取一个 Shell 进入 Pod 中运行的容器
kubectl exec -i -t secret-test-pod -- /bin/bash
#Secret 数据通过挂载在 /etc/secret-volume 目录下的卷暴露在容器中。
#在 Shell 中,列举 /etc/secret-volume 目录下的文件:
#在容器中 Shell 运行下面命令
ls /etc/secret-volume
#在 Shell 中,显示 username 和 password 文件的内容:
#在容器中 Shell 运行下面命令
echo "$( cat /etc/secret-volume/username )"
echo "$( cat /etc/secret-volume/password )"
使用 Secret 数据定义容器变量
好,貌似中间件的账户密码什么的,是不是都可以这样玩儿了?