Secret概述与操作
1. Secret是什么
Configmap 一般是用来存放明文数据的,如配置文件,对于一些敏感
数据,如密码、私钥等数据时,要用 secret 类型。
Secret 解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据
暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。
要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为
volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取
镜像时使用。
secret 可选参数有三种:
generic: 通用类型,通常用于存储密码数据。
tls:此类型仅用于存储私钥和证书。
docker-registry: 若要保存 docker 仓库的认证信息的话,就必须使用此种类型来创
建。
Secret 类型:
Service Account:用于被 serviceaccount 引用。serviceaccout 创建时
Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的
secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录
中。
Opaque:base64 编码格式的 Secret,用来存储密码、秘钥等。可以通过 base64 –
decode 解码获得原始数据,因此安全性弱
kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。
2. Secret操作
2.1 通过环境变量引入 Secret
#把 mysql 的 root 用户的 password 创建成 secret
[root@master1 ~]# kubectl create secret generic mysql-password --from-literal=password=mack
secret/mysql-password created
You have new mail in /var/spool/mail/root
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-vqst8 kubernetes.io/service-account-token 3 10d
mysql-password Opaque 1 9s
nfs-provisioner-token-j24f6 kubernetes.io/service-account-token 3 5d
[root@master1 ~]# kubectl describe secret mysql-password
Name: mysql-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 4 bytes
[root@master1 ~]#
#password 的值是加密的, #但 secret 的加密是一种伪加密,它仅仅是将数据做了 base64 的编码.
#创建 pod,引用 secret
cat > /root/pod-secret.yaml <<END
apiVersion: v1
kind: Pod
metadata:
name: pod-secret
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
env:
- name: MYSQL_ROOT_PASSWORD #它是pod启动成功后,pod中容器的环境变量名
valueFrom:
secretKeyRef:
name: mysql-password #这是secret的对象名
key: password #它是secret中的key名
END
kubectl apply -f /root/pod-secret.yaml
[root@master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client-7d8bfb6fcf-txwxf 1/1 Running 9 3d22h
mysql-pod 1/1 Running 19 19h
mysql-pod-envfrom 1/1 Running 18 18h
mysql-pod-volume 1/1 Running 18 18h
nfs-provisioner-65475d58bc-nn67v 1/1 Running 0 3d22h
pod-secret 1/1 Running 0 7s
test-hostpath 2/2 Running 0 5d22h
test-nfs-volume 1/1 Running 0 5d21h
web-0 0/1 Pending 0 3d21h
[root@master1 ~]# kubectl exec -it pod-secret -- /bin/sh
/ # printenv
MY_NGINX_SERVICE_PORT=80
MY_NGINX_PORT=tcp://10.108.124.96:80
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-secret
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
MY_NGINX_NODEPORT_SERVICE_SERVICE_HOST=10.104.102.223
HOME=/root
MY_NGINX_PORT_80_TCP_ADDR=10.108.124.96
MY_NGINX_PORT_80_TCP_PORT=80
MY_NGINX_PORT_80_TCP_PROTO=tcp
MYSQL_ROOT_PASSWORD=mack #密码已经传入pod的容器中
MY_NGINX_NODEPORT_SERVICE_SERVICE_PORT=80
MY_NGINX_NODEPORT_SERVICE_PORT=tcp://10.104.102.223:80
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
MY_NGINX_PORT_80_TCP=tcp://10.108.124.96:80
MY_NGINX_NODEPORT_SERVICE_PORT_80_TCP_ADDR=10.104.102.223
TERM=xterm
NGINX_VERSION=1.12.2
MYSQL_PORT_3306_TCP_ADDR=10.102.58.92
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MY_NGINX_NODEPORT_SERVICE_PORT_80_TCP_PORT=80
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MY_NGINX_NODEPORT_SERVICE_PORT_80_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_SERVICE_HOST=10.102.58.92
MYSQL_PORT_3306_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
MY_NGINX_NODEPORT_SERVICE_PORT_80_TCP=tcp://10.104.102.223:80
MYSQL_PORT=tcp://10.102.58.92:3306
MYSQL_SERVICE_PORT=3306
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
MYSQL_PORT_3306_TCP=tcp://10.102.58.92:3306
MY_NGINX_SERVICE_HOST=10.108.124.96
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80
/ #
2.2 通过 volume 挂载 Secret
1 创建 Secret
手动加密,基于 base64 加密
[root@master1 ~]# echo -n 'mack' | base64 #用户名
bWFjaw==
[root@master1 ~]# echo -n 'mack123456' | base64 #密码
bWFjazEyMzQ1Ng==
解码
[root@master1 ~]# echo bWFjaw== | base64 -d
mack
2 创建 yaml 文件
cat > /root/secret.yaml <<END
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: bWFjaw==
password: bWFjazEyMzQ1Ng==
END
kubectl apply -f /root/secret.yaml
[root@master1 ~]# kubectl get secret
NAME TYPE DATA AGE
default-token-vqst8 kubernetes.io/service-account-token 3 10d
mysecret Opaque 2 10s
mysql-password Opaque 1 35m
nfs-provisioner-token-j24f6 kubernetes.io/service-account-token 3 5d
[root@master1 ~]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 10 bytes
username: 4 bytes
[root@master1 ~]#
3 将 Secret 挂载到 Volume 中
cat > /root/pod_secret_volume.yaml <<END
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-volume
spec:
containers:
- name: myqpp
image: janakiramm/myapp:v1
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: mysecret #在pod所在的命名空间内所使用的secret的名字
END
kubectl apply -f /root/pod_secret_volume.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
client-7d8bfb6fcf-txwxf 1/1 Running 9 3d22h
mysql-pod 1/1 Running 19 19h
mysql-pod-envfrom 1/1 Running 19 19h
mysql-pod-volume 1/1 Running 19 19h
nfs-provisioner-65475d58bc-nn67v 1/1 Running 0 3d23h
pod-secret 1/1 Running 0 35m
pod-secret-volume 1/1 Running 0 3s
test-hostpath 2/2 Running 0 5d22h
test-nfs-volume 1/1 Running 0 5d22h
web-0 0/1 Pending 0 3d22h
[root@node1 ~]# kubectl exec -it pod-secret-volume -- /bin/sh
# cd /etc/secret
# ls
password username
# cat password
mack123456# cat username
mack# ls -l
total 0
lrwxrwxrwx. 1 root root 15 Jun 6 07:13 password -> ..data/password
lrwxrwxrwx. 1 root root 15 Jun 6 07:13 username -> ..data/username
#