淘先锋技术网

首页 1 2 3 4 5 6 7

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
#