Secret存在意义
Secret解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod spec中。Secret可以以Volume或者环境变量的方式使用
Secret有三种类型:
Service Account
:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到/run/secrets/kubernetes.io/serviceaccount
目录中
Opaque
:base64编码格式的Secret,用来存储密码、秘钥等
kubernetes.io/dockerconfigjson
:用来存储私有docker registry的认证信息
Service Account
Service Account用来访问kubernetes API,由kubernetes自动创建,并且会自动挂载到pod的/run/secrets/kubernetes.io/serviceaccount
目录中
1 2 3 4
| $ kubectl run nginx --image nginx deployemnt "nginx" create $ kubectl get pods $ kubectl exec nginx-xxxx ls /run/secrets/kubernetes.io/service
|
这里会进/bin/sh会发现没有这个目录,因为他没有和kubernetes API进行交互
可以进-n kube-system
名称空间的pod看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [root@k8s-master ~] NAME READY STATUS RESTARTS AGE coredns-5c98db65d4-gh2qc 1/1 Running 5 5d6h coredns-5c98db65d4-pczm8 1/1 Running 5 5d6h etcd-k8s-master 1/1 Running 5 5d6h kube-apiserver-k8s-master 1/1 Running 5 5d6h kube-controller-manager-k8s-master 1/1 Running 11 5d6h kube-flannel-ds-amd64-2lrvk 1/1 Running 6 5d6h kube-flannel-ds-amd64-bst48 1/1 Running 5 5d6h kube-flannel-ds-amd64-jdqq8 1/1 Running 5 5d6h kube-proxy-dm5p6 1/1 Running 4 5d6h kube-proxy-dwdvl 1/1 Running 5 5d6h kube-proxy-qhst5 1/1 Running 5 5d6h kube-scheduler-k8s-master 1/1 Running 10 5d6h [root@k8s-master ~] ca.crt namespace token
|
Service Account不常用
Opaque Secret
1 创建说明
Opaque类型的数据是一个map类型,要求value是base64编码格式:
1 2 3 4
| $ echo -n "admin" | base64 YWRtaW4= $ echo -n "1f2d1e2e67df" | base64 MWYyZDFlMmU2N2Rm
|
base64加密只是表面加密,可以用echo -n "YWRtaW4=" | base64 -d
**解密
secrets.yaml
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: MWYyZDFlMmU2N2Rm username: YWRtaW4=
|
1 2 3 4 5 6 7 8 9 10
| # 创建 [root@k8s-master ~]# kubectl apply -f secrets.yaml secret/mysecret created # 查看 [root@k8s-master ~]# kubectl get secret NAME TYPE DATA AGE basic-auth Opaque 1 22h default-token-89jrq kubernetes.io/service-account-token 3 5d7h mysecret Opaque 2 3s tls-secret kubernetes.io/tls 2 22h
|
默认情况下,每个namespace都有一个default-token
2 使用方式
a 将Secret挂载到Volume中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: v1 kind: Pod metadata: name: secret-test labels: name: secret-test spec: volumes: - name: secrets secret: secretName: mysecret containers: - name: db image: hub.test.com/library/myapp:v1 volumeMounts: - name: secrets mountPath: "/etc/secrets" readOnly: true
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 创建 [root@k8s-master secret]# kubectl create -f pod.yaml pod/secret-test created # 查看 [root@k8s-master secret]# kubectl get pods NAME READY STATUS RESTARTS AGE secret-test 1/1 Running 0 3s # 进容器查看 [root@k8s-master secret]# kubectl exec -it secret-test -- /bin/sh / # cd /etc/secrets/ /etc/secrets # ls password username /etc/secrets # cat * 1f2d1e2e67dfadmin
|
在创建的时候时候的base64加密,但是在容器中使用的是解密后的数据
b 将Secret导出到环境变量中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| apiVersion: extensions/v1beta1 kind: Deployment metadata: name: pod-deploy spec: replicas: 2 template: metadata: labels: app: pod-deploy spec: containers: - name: pod-1 image: hub.test.com/library/myapp:v1 ports: - name: http containerPort: 80 env: - name: TEST_USER valueFrom: secretKeyRef: name: mysecret key: username - name: TEST_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
|
1 2 3 4 5 6 7 8 9 10 11
| [root@k8s-master secret] deployment.extensions/deploy-test created
[root@k8s-master secret] NAME READY STATUS RESTARTS AGE deploy-test-869f8f7bc4-d8ltv 1/1 Running 0 3s secret-test 1/1 Running 0 12m [root@k8s-master secret] / 1f2d1e2e67df admin
|
kubernetes.io/dockerconfigjson
使用kubectl
创建docker registry认证的secret
1 2
| $ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL secret "myregistrykey" created.
|
在创建Pod的时候,通过imagePullSecrets
来引用刚创建的myregistrykey
举个栗子
1
| $ kubectl create secret docker-registry myregistrykey --docker-server=hub.test.com --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@123.com
|
设置harbor仓库为私有

创建pod.yaml
1 2 3 4 5 6 7 8 9 10
| apiVersion: v1 kind: Pod metadata: name: foo spec: containers: - name: foo image: hub.test.com/private/myapp:v1 imagePullSecrets: - name: myregistrykey
|
1 2 3
| [root@k8s-master registry] pod/pod-registry-test created
|