Kubernetes中的Secret资源可以用来存储密码、Token、秘钥等敏感数据。 将这些敏感信息保存在Secret中,相对于暴露到Pod、镜像中更加的安全和灵活。

1.Kubernetes Secret的类型

Kubernetes内置了三种类型的Secret:

1.1 Service Account Secret

为了能从Pod内部访问Kubernetes API,Kubernetes提供了Service Account资源。 Service Account会自动创建和挂载访问Kubernetes API的Secret,会挂载到Pod的 /var/run/secrets/kubernetes.io/serviceaccount目录中。 关于这种类型的Secret我们这里先不展开。

1.2 Opaque Secret

Opaue类型的Secret是一个map结构(key-value),其中vlaue要求以base64格式编码。

我们可以使用yaml文件手动创建Opaue Secret:

1echo -n "admin" | base64
2YWRtaW4=
3echo -n "1f2d1e2e67df" | base64
4MWYyZDFlMmU2N2Rm

secret.yaml:

1apiVersion: v1
2kind: Secret
3metadata:
4  name: mysecret
5type: Opaque
6data:
7  username: YWRtaW4=
8  password: MWYyZDFlMmU2N2Rm
1kubectl create -f ./secret.yaml
2secret "mysecret" created

也可以从文件创建Secret,将文件内容保存到Secret中,这种情况多用于秘钥证书和配置文件:

 1kubectl create secret generic etcd-tls-secret  \
 2  --from-file=/etc/etcd/ssl/etcd.pem \
 3  --from-file=/etc/etcd/ssl/etcd-key.pem  \
 4  --from-file=/etc/etcd/ssl/ca.pem \
 5  -n kube-system
 6
 7
 8kubectl describe secret etcd-tls-secret -n kube-system
 9Name:           etcd-tls-secret
10Namespace:      kube-system
11Labels:         <none>
12Annotations:    <none>
13
14Type:   Opaque
15
16Data
17====
18etcd-key.pem:   1675 bytes
19etcd.pem:       1489 bytes
20ca.pem:         1330 bytes

1.3 kubernetes.io/dockercfg Secret

kubernetes.io/dockercfg类型的Secret用于存放私有Docker Registry的认证信息。 当Kubernetes在创建Pod并且需要从私有Docker Registry pull镜像时,需要使用认证信息,就会用到kubernetes.io/dockercfg类型的Secret。

1kubectl create secret docker-registry regsecret \
2--docker-server=harbor.frognew.com \
3--docker-username=the-user \
4--docker-password=the-password \
5--docker-email=the-email \
6--namespace=the-namspace 

在创建Pod时需要在Pod的spec中按如下形式使用:

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: private-reg
 5spec:
 6  containers:
 7    - name: private-reg-container
 8      image: <your-private-image>
 9  imagePullSecrets:
10    - name: regsecret

2.使用Secret

在创建Opaque Secret完之后,我们有两种使用方式:

2.1 将Secret挂载为Volume

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: mypod
 5  namespace: myns
 6spec: 
 7  containers:
 8    - name: mypod
 9      image: reids
10      valueMounts:
11        - name: foo
12          mountPath: /etc/foo
13          readOnly: treu
14  volumes:
15    - name: foo
16      secret:
17        secretName: mysecret

2.2 将Secret导出为环境变量

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: secret-env-pod
 5spec:
 6  containers:
 7    - name: mycontainer
 8      image: redis
 9      env:
10        - name: SECRET_USERNAME
11          valueFrom:
12            secretKeyRef:
13              name: mysecret
14              key: username
15        - name: SECRET_PASSWORD
16          valueFrom:
17            secretKeyRef:
18              name: mysecret
19              key: password
20  restartPolicy: Never

参考