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:
echo -n "admin" | base64
YWRtaW4=
echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rmsecret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rmkubectl create -f ./secret.yaml
secret "mysecret" created也可以从文件创建Secret,将文件内容保存到Secret中,这种情况多用于秘钥证书和配置文件:
kubectl create secret generic etcd-tls-secret \
--from-file=/etc/etcd/ssl/etcd.pem \
--from-file=/etc/etcd/ssl/etcd-key.pem \
--from-file=/etc/etcd/ssl/ca.pem \
-n kube-system
kubectl describe secret etcd-tls-secret -n kube-system
Name: etcd-tls-secret
Namespace: kube-system
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
etcd-key.pem: 1675 bytes
etcd.pem: 1489 bytes
ca.pem: 1330 bytes1.3 kubernetes.io/dockercfg Secret
kubernetes.io/dockercfg类型的Secret用于存放私有Docker Registry的认证信息。 当Kubernetes在创建Pod并且需要从私有Docker Registry pull镜像时,需要使用认证信息,就会用到kubernetes.io/dockercfg类型的Secret。
kubectl create secret docker-registry regsecret \
--docker-server=harbor.frognew.com \
--docker-username=the-user \
--docker-password=the-password \
--docker-email=the-email \
--namespace=the-namspace 在创建Pod时需要在Pod的spec中按如下形式使用:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regsecret2.使用Secret
在创建Opaque Secret完之后,我们有两种使用方式:
2.1 将Secret挂载为Volume
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: myns
spec:
containers:
- name: mypod
image: reids
valueMounts:
- name: foo
mountPath: /etc/foo
readOnly: treu
volumes:
- name: foo
secret:
secretName: mysecret2.2 将Secret导出为环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never