Kubernetes资源对象之Secret
2017-02-02
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