在上一篇文章中我们认识了新的资源对象 Secert 以及它的适用场景,并且学习了 Secret 的环境变量配置等,接下来通过本篇文章带大家深入学习Secret 的使用。
我们⽤⼀个 Pod 来验证下 Volume 挂载,创建⼀个 Pod ⽂件:(secret2-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: secret2-pod
spec:
containers:
- name: secret2
image: busybox
command: ["/bin/sh", "-c", "ls /etc/secrets"]
volumeMounts:
- name: secrets
mountPath: /etc/secrets
volumes:
- name: secrets
secret:
secretName: mysecret
创建 Pod :
$ kubectl create -f secret-pod2.yaml
pod "secret2-pod" created
然后我们查看输出⽇志:
$ kubectl logs secret2-pod
password
username
可以看到 secret 把两个key挂载成了两个对应的⽂件。当然如果想要挂载到指定的⽂件上⾯,是不是也可以使⽤上⼀节课的⽅法:在 secretName 下⾯添加 items 指定 key 和 path,这个⼤家可以参考 ConfigMap 中的⽅法去测试下。
除了上⾯的 Opaque 这种类型外,我们还可以来创建⽤户 docker registry 认证的 Secret ,直接使⽤ kubectl create 命令创建即可,如下:
$ kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --dockerusername=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistry" created
然后查看 Secret 列表:
$ kubectl get secret
NAME TYPE DATA AGE
default-token-n9w2d kubernetes.io/service-account-token 3 33d
myregistry kubernetes.io/dockerconfigjson 1 15s
mysecret Opaque 2 34m
注意看上⾯的 TYPE 类型, myregistry 是不是对应的 kubernetes.io/dockerconfigjson ,同样的可以使⽤ describe 命令来查看详细信息:
$ kubectl describe secret myregistry
Name: myregistry
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 152 bytes
同样的可以看到 Data 区域没有直接展示出来,如果想查看的话可以使⽤ -o yaml 来输出展示出来:
$ kubectl get secret myregistry -o yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiL
CJwYXNzd29yZCI6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZ
TWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0=
kind: Secret
metadata:
creationTimestamp: 2018-06-19T16:01:05Z
name: myregistry
namespace: default
resourceVersion: "3696966"
selfLink: /api/v1/namespaces/default/secrets/myregistry
uid: f91db707-73d9-11e8-a101-525400db4df7
type: kubernetes.io/dockerconfigjson
可以把上⾯的 data.dockerconfigjson 下⾯的数据做⼀个 base64 解码,看看⾥⾯的数据是怎样的呢?
$ echo eyJhdXRocyI6eyJET0NLRVJfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI
6IkRPQ0tFUl9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSR
TlEUzBWU1gxQkJVMU5YVDFKRSJ9fX0= | base64 -d
{"auths":{"DOCKER_SERVER":{"username":"DOCKER_USER","password":"DOCKER_PASSWORD","email":"
DOCKER_EMAIL","auth":"RE9DS0VSX1VTRVI6RE9DS0VSX1BBU1NXT1JE"}}}
如果我们需要拉取私有仓库中的 docker 镜像的话就需要使⽤到上⾯的 myregistry 这个 Secret :
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: 192.168.1.100:5000/test:v1
imagePullSecrets:
- name: myregistrykey
我们需要拉取私有仓库镜像 192.168.1.100:5000/test:v1 ,我们就需要针对该私有仓库来创建⼀个如上的 Secret ,然后在 Pod 的 YAML ⽂件中指定imagePullSecrets ,我们会在后⾯的私有仓库搭建的课程中跟⼤家详细说明的。
另外⼀种 Secret 类型就是 kubernetes.io/service-account-token ,⽤于被 serviceaccount 引⽤。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使⽤了 serviceaccount,对应的secret会⾃动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount ⽬录中。
这⾥我们使⽤⼀个 nginx 镜像来验证⼀下,⼤家想⼀想为什么不是呀 busybox 镜像来验证?当然也是可以的,但是我们就不能在 command ⾥⾯来验证了,因为token是需要 Pod 运⾏起来过后才会被挂载上去的,直接在 command 命令中去查看肯定是还没有 token ⽂件的。
$ kubectl run secret-pod3 --image nginx:1.7.9
deployment.apps "secret-pod3" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
...
secret-pod3-78c8c76db8-7zmqm 1/1 Running 0 13s
...
$ kubectl exec secret-pod3-78c8c76db8-7zmqm ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token
$ kubectl exec secret-pod3-78c8c76db8-7zmqm cat /run/secrets/kubernetes.io/serviceaccount/
token
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZ
XRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWN
jb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbjl3MmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2Nvd
W50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2V
ydmljZS1hY2NvdW50LnVpZCI6IjMzY2FkOWQxLTU5MmYtMTFlOC1hMTAxLTUyNTQwMGRiNGRmNyIsInN1YiI6InN5c
3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.0FpzPD8WO_fwnMjwpGIOphdVu4K9wUINwpXpBOJA
Q-Tawd0RTbAUHcgYy3sEHSk9uvgnl1FJRQpbQN3yVR_DWSIlAtbmd4dIPxK4O7ZVdd4UnmC467cNXEBqL1sDWLfS5f
03d7D1dw1ljFJ_pJw2P65Fjd13reKJvvTQnpu5U0SDcfxj675-Z3z-iOO3XSalZmkFIw2MfYMzf_WpxW0yMFCVkUZ8
tBSTegA9-NJZededceA_VCOdKcUjDPrDo-CNti3wZqax5WPw95Ou8RJDMAIS5EcVym7M2_zjGiqHEL3VTvcwXbdFKx
sNX-1VW6nr_KKuMGKOyx-5vgxebl71QQ
最后我们来对⽐下 Secret 和 ConfigMap 这两种资源对象的异同点:
相同点:
不同点: