一,Secret
Secret
对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret
中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。
注意:
Kubernetes Secret 默认情况下存储为 base64-编码的、非加密的字符串。 默认情况下,能够访问 API 的任何人,或者能够访问 Kubernetes 下层数据存储(etcd) 的任何人都可以以明文形式读取这些数据。 为了能够安全地使用 Secret,我们建议你(至少):
- 为 Secret 启用静态加密;
- 启用 RBAC 规则来限制对 Secret 的读写操作。 要注意,任何被允许创建 Pod 的人都默认地具有读取 Secret 的权限。
Secret类型
Secret 有三种类型:
Opaque: base64 编码格式的 Secret,用来存储密码、密钥等;但数据也通过 base64 —decode 解码得到原始数据,所有加密性很弱。
kubernetes.io/dockerconfigjson: 用来存储私有 docker registry 的认证信息。
kubernetes.io/service-account-token: 用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
备注:serviceaccount 用来使得 Pod 能够访问 Kubernetes API
创建一个secret
Opaque secret
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式
root@master:~# echo admin |base64
YWRtaW4K
root@master:~# echo 123456|base64
MTIzNDU2Cg==
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
name: YWRtaW4K
password: MTIzNDU2Cg==
创建secret
root@master:~# kubectl apply -f secret.yaml
root@master:~# kubectl apply -f secret.yaml
secret/mysecret created
root@master:~# kubectl get secret
NAME TYPE DATA AGE
default-token-9ptzj kubernetes.io/service-account-token 3 6h59m
mysecret Opaque 2 8s
root@master:~# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque
Data
====
name: 6 bytes
password: 7 bytes
Opaque Secret的使用有两种方式:
1,以 Volume 方式
2,以环境变量方式
将 Secret 挂载到 Volume 中
vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
containers:
- image: ikubernetes/myapp:v1
name: myapp
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
ports:
- name: http
containerPort: 80
root@master:~# kubectl apply -f secret-pod.yaml
pod/myapp created
root@master:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 6s
root@master:~# kubectl exec -it myapp -- /bin/sh
/ # ls /etc/secrets/
name password
/ # cat /etc/secrets/name
admin
/ # cat /etc/secrets/password
123456
/ #
以环境变量的方式传递
root@master:~# cat secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: MYSECRET
valueFrom:
secretKeyRef:
name: mysecret
key: name
- name: SECRET
valueFrom:
secretKeyRef:
name: mysecret
key: password
登录容器查看
root@master:~# kubectl exec -it secret -- /bin/sh
/ # env |grep SECRET
MYSECRET=admin
SECRET=123456
将secret将键名映射到相应的路径
root@master:~# cat pods-secret.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
name: db
name: db
spec:
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: password
mode: 511
path: tst/psd
- key: name
mode: 511
path: tst/usr
containers:
- image: nginx
name: db
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
ports:
- name: cp
containerPort: 80
登录容器验证
root@master:~# kubectl exec -it db -- /bin/sh
# cat /etc/secrets/tst/psd
123456
# cat /etc/secrets/tst/usr
admin
#
官方文档
https://v1-19.docs.kubernetes.io/zh/docs/concepts/configuration/secret/
网友评论