【云原生丨Kubernetes系列18】深入学习资源对象 Secret 的使用

前言

在上一篇文章中我们认识了新的资源对象 Secert 以及它的适用场景,并且学习了 Secret 的环境变量配置等,接下来通过本篇文章带大家深入学习Secret 的使用。

【云原生丨Kubernetes系列18】深入学习资源对象 Secret 的使用_第1张图片

文章目录

  • 前言
  • 验证Volume 挂载
  • kubernetes.io/dockerconfigjson
  • kubernetes.io/service-account-token
  • Secret 与 ConfigMap 对⽐

验证Volume 挂载

我们⽤⼀个 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 中的⽅法去测试下。


kubernetes.io/dockerconfigjson

除了上⾯的 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 ,我们会在后⾯的私有仓库搭建的课程中跟⼤家详细说明的。

kubernetes.io/service-account-token

另外⼀种 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 对⽐

最后我们来对⽐下 Secret 和 ConfigMap 这两种资源对象的异同点:

相同点:

  • key/value的形式
  • 属于某个特定的namespace
  • 可以导出到环境变量
  • 可以通过⽬录/⽂件形式挂载
  • 通过 volume 挂载的配置信息均可热更新

不同点:

  • Secret 可以被 ServerAccount 关联
  • Secret 可以存储 docker register 的鉴权信息,⽤在 ImagePullSecret 参数中,⽤于拉取私有仓库的镜像
  • Secret ⽀持 Base64 加密
  • Secret 分为 kubernetes.io/service-account-token、kubernetes.i/dockerconfigjson、Opaque 三种类型,⽽ Configmap 不区分类型

【云原生丨Kubernetes系列18】深入学习资源对象 Secret 的使用_第2张图片

你可能感兴趣的:(云原生,从入门到进阶,kubernetes,云原生,学习)