Kubernetes提供Secret资源用于解决密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。
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
中。常用的应用主要使用Opaque类型的Secret,本次我们主要介绍该类型
[root@k8s-node1 dinghh]# cat passwd-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: passwd-secret
type: Opaque
data:
username: dXNlcm5hbWUK
password: cGFzc3dvcmQK
其中username和password是根据base64加密
[root@k8s-node1 dinghh]# echo username | base64
dXNlcm5hbWUK
[root@k8s-node1 dinghh]# echo password | base64
cGFzc3dvcmQK
创建secret
[root@k8s-node1 dinghh]# kubectl create -f passwd-secret.yaml
secret/passwd-secret created
[root@k8s-node1 dinghh]# kubectl get secrets passwd-secret -oyaml
apiVersion: v1
data:
password: cGFzc3dvcmQK
username: dXNlcm5hbWUK
kind: Secret
metadata:
creationTimestamp: "2019-07-02T06:20:40Z"
name: passwd-secret
namespace: default
resourceVersion: "995896"
selfLink: /api/v1/namespaces/default/secrets/passwd-secret
uid: 83644454-9c91-11e9-ad16-fa163e17fab9
type: Opaque
可以看到通过describe secret是可以看到secret中的具体数据的,通过base64解码则可以看到原始数据
[root@k8s-node1 dinghh]# echo dXNlcm5hbWUK | base64 --decode
username
[root@k8s-node1 dinghh]# echo cGFzc3dvcmQK | base64 --decode
password
kubectl create secret generic
根据配置文件、目录或指定的literal-value创建secret。
secret可以保存为一个或多个key/value信息。
当基于配置文件创建secret时,key将默认为文件的基础名称,value默认为文件内容。如果基本名称的key无效,则可以指定另一个key。
当基于目录创建secret时,key还是文件的基础名称,目录中有效的key的每个文件都被打包到secret中,除了常规文件之外的任何目录条目都被忽略(例如subdirectories, symlinks, devices, pipes, etc)。
基于文件创建(更多创建方式参考:http://docs.kubernetes.org.cn/556.html)
[root@k8s-node1 dinghh]# echo username > username
[root@k8s-node1 dinghh]# echo password > password
[root@k8s-node1 dinghh]# kubectl create secret generic test-secret --from-file=./username --from-file=./password
secret/test-secret created
[root@k8s-node1 dinghh]# kubectl get secrets test-secret -oyaml
apiVersion: v1
data:
password: cGFzc3dvcmQK
username: dXNlcm5hbWUK
kind: Secret
metadata:
creationTimestamp: "2019-07-02T06:52:47Z"
name: test-secret
namespace: default
resourceVersion: "1000413"
selfLink: /api/v1/namespaces/default/secrets/test-secret
uid: 00824b62-9c96-11e9-ad16-fa163e17fab9
type: Opaque
可以看到指定文件创建时会自动进行base64加密
通过volumeMount方式将secret挂载到pod容器中
创建一个pod
[root@k8s-node1 dinghh]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
k8s-app: nginx
version: master
name: nginx
spec:
containers:
- image: nginx:master
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: dashboard
protocol: TCP
resources: {}
volumeMounts:
- mountPath: /etc/secrets
name: passwd-secret
readOnly: true
restartPolicy: Always
volumes:
- name: passwd-secret
secret:
defaultMode: 420
secretName: passwd-secret
[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml
pod/nginx created
通过yaml可以看到通过volumeMounts方式将secret挂载到容器的/etc/secret目录
进入容器查看
[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml
pod/nginx created
[root@k8s-node1 dinghh]# kubectl exec -it nginx bash
[root@nginx /]# cd /etc/secrets/
[root@nginx secrets]# ll
total 0
lrwxrwxrwx 1 root root 15 Jul 2 15:00 password -> ..data/password
lrwxrwxrwx 1 root root 15 Jul 2 15:00 username -> ..data/username
[root@nginx secrets]# cat username
username
[root@nginx secrets]# cat password
password
可以看到将secret中的key作为文件名称写在指定目录下,并且文件中的内容是base64解密之后的
创建pod
[root@k8s-node1 dinghh]# cat nginx-env.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
k8s-app: nginx
version: master
name: nginx-env
spec:
containers:
- env:
- name: USERNAME_ENV
valueFrom:
secretKeyRef:
name: passwd-secret
key: username
- name: PASSWORD_ENV
valueFrom:
secretKeyRef:
name: passwd-secret
key: password
image: 192.168.133.20:30050/kube-system/aistack-dashboard:master
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: dashboard
protocol: TCP
resources: {}
restartPolicy: Always
[root@k8s-node1 dinghh]# kubectl create -f nginx-env.yaml
pod/nginx-env created
可以看到在该Pod中定义了两个环境变量分别引用passwd-secret中的对应的key
进入容器查看
[root@k8s-node1 dinghh]# kubectl exec -it nginx-env bash
[root@nginx-env /]# echo $USERNAME_ENV
username
[root@nginx-env /]# echo $PASSWORD_ENV
password