欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

034.Kubernetes集群安全-Secret

程序员文章站 2022-03-16 21:35:23
一 secret概述1.1 secret作用Secret对象,主要作用是保管私密数据,比如密码、OAuth Tokens、SSH Keys等信息。将这些私密信息放在Secret对象中比直接放在Pod或Docker Image中更安全,也更便于使用和分发。二 secret使用2.1 secret创建[ ......

一 secret概述

1.1 secret作用

secret对象,主要作用是保管私密数据,比如密码、oauth tokens、ssh keys等信息。将这些私密信息放在secret对象中比直接放在pod或docker image中更安全,也更便于使用和分发。

二 secret使用

2.1 secret创建

[root@k8smaster01 study]# kubectl create namespace myns
[root@k8smaster01 study]# echo -n "value-1" | base64
dmfsdwutmq==
[root@k8smaster01 study]# echo -n "value-2" | base64
dmfsdwutmg==
[root@k8smaster01 study]# vi secrets.yaml

  1 apiversion: v1
  2 kind: secret
  3 metadata:
  4   name: mysecret
  5   namespace: myns
  6 type: opaque
  7 data:
  8   password: dmfsdwutmg0k
  9   username: dmfsdwutmq0k
[root@k8smaster01 study]# kubectl create -f secrets.yaml

注意:data域的各子域的值必须为base64编码值,如上password域和username域都为base64编码。

2.2 secret引用

创建完secret之后,可通过如下三种方式引用:
  • 在创建pod时,通过为pod指定service account来自动使用该secret。
  • 通过挂载该secret到pod来使用它。
  • 在docker镜像下载时使用, 通过指定pod的spc.imagepullsecrets来引用它。
示例1:挂载方式
[root@k8smaster01 study]# vi mysecretpod.yaml
  1 apiversion: v1
  2 kind: pod
  3 metadata:
  4   name: mypod
  5   namespace: myns
  6 spec:
  7   containers:
  8   - name: mycontainer
  9     image: redis
 10     volumemounts:
 11     - name: foo
 12       mountpath: "/etc/foo"
 13       readonly: true
 14   volumes:
 15   - name: foo
 16     secret:
 17       secretname: mysecret
[root@k8smaster01 study]# kubectl create -f mysecretpod.yaml
如上例创建的secret,被挂载到一个叫作mycontainer的container中,在该container中可通过相应的查询命令查看所生成的文件和文件中的内容。
[root@k8smaster01 study]# kubectl exec -ti mypod -n myns ls /etc/foo #查看挂载后的secret
password username
[root@k8smaster01 study]# kubectl exec -ti mypod -n myns cat /etc/foo/username
value-1
[root@k8smaster01 study]# kubectl exec -ti mypod -n myns cat /etc/foo/password
value-2
示例2:镜像中引用,通常用于拉取需要验证账号密码的私有仓库的镜像。
[root@k8smaster01 ~]# docker login --username=x120952576@126.com registry.cn-hangzhou.aliyuncs.com
password:【阿里云仓库密码】
[root@k8smaster01 ~]# cat ~/.docker/config.json                     #查看是否写入登录信息
[root@k8smaster01 ~]# base64 -w 0 ~/.docker/config.json                     #将登录信息文件转化为base64编码
[root@k8smaster01 ~]# vim mysecretaliyun.yaml                               #创建secret内容

  1 apiversion: v1
  2 kind: secret
  3 metadata:
  4   name: myregsecret
  5   namespace: default
  6 data:
  7     .dockerconfigjson: ewojimf1dghzijogewojcsjyzwdpc3ryes5jbi1oyw5nemhvds5hbgl5dw5jcy5jb20ioib7cgkjcsjhdxroijogim
  8 verxlnrgsxtwpvm05rqxhnall1wti5de9uzznnemmwtlrjeetnpt0icgkjfqojfswkcsjidhrwsgvhzgvycyi6ihskcqkivxnlci1bz2vudci6icj
  9 eb2nrzxitq2xpzw50lze4ljaxxxxxxxxxxxxxxx
 10 type: kubernetes.io/dockerconfigjson
[root@k8smaster01 ~]# kubectl create -f mysecretaliyun.yaml
[root@k8smaster01 ~]# vi mytestpod.yaml #创建pod中使用imagepullsecrets引用

  1 apiversion: v1
  2 kind: pod
  3 metadata:
  4   name: mypodaliyun
  5 spec:
  6   containers:
  7   - name: mongo
  8     image: registry.cn-hangzhou.aliyuncs.com/xhypn/mongo:3.6
  9   imagepullsecrets:
 10     - name: myregsecret
[root@k8smaster01 ~]# kubectl create -f mytestpod.yaml
[root@k8smaster01 ~]# kubectl get pods
mypodaliyun 1/1 running 0 48s
[root@k8smaster01 ~]# kubectl describe pods mypodaliyun

三 secret其他注意点

3.1 secret注意点

每个单独的secret大小不能超过1mb,kubernetes不鼓励创建大的secret,因为如果使用大的secret,则将大量占用api server和kubelet的内存。当然,创建许多小的secret也能耗尽api server和kubelet的内存。
在使用mount方式挂载secret时,container中secret的data域的各个域的key值作为目录中的文件,value值被base64编码后存储在相应的文件中。secret使用场景之一就是通过secret保管其他系统的敏感信息(比如数据库的用户名和密码),并以mount的方式将secret挂载到container中,然后通过访问目录中文件的方式获取该敏感信息。
当pod被api server创建时,api server不会校验该pod引用的secret是否存在。一旦这个pod被调度,则kubelet将试着获取secret的值。如果secret不存在或暂时无法连接到api server,则kubelet按一定的时间间隔定期重试获取该secret,并发送一个event来解释pod没有启动的原因。一旦secret被pod获取,则kubelet将创建并挂载包含secret的volume。只有所有volume都挂载成功,pod中的container才会被启动。在kubelet启动pod中的container后,container中和secret相关的volume将不会被改变,即使secret本身被修改。为了使用更新后的secret,必须删除旧pod,并重新创建一个新pod。