k8s之Secret


导读

上一篇说了ServiceAccount,这一篇就来看一下Secret。node

Secret

Secret的主要做用是保管私密数据,好比密码、OAuth Tokens、SSH Keys等信息。docker

上一篇说到,默认的Secret主要包含三个东西,分别是token、ca.crt、namespacejson

 

固然,也能够包含其余信息,api

例如:建立一个Secretbash

apiVersion: v1
kind: Secret
metadata:
  name: secret
type: Opaque
data:
  password: base64
  username: base64

  

在data域中的各子域的值必须是BASE64编码值。并发

Secret被建立以后,能够经过下列三种方式使用它:编码

(1)为Pod指定Service Account来自动使用该Secretspa

apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
  - name: pod
    image: image
  serviceAccountName: serviceaccount

  

(2)经过挂载该Secret到Pod来使用它3d

apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
  - name: pod
    image: image
    volumeMounts:
    - name: foo
      mountPath: "/data"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: secretname

  

 

(3)在Docker镜像下载时使用,经过设置spec.imagePullSecrets来引用blog

一、docker登录私有仓库

docker login localhost:5000

  

输入用户名和密码,若是是第一次登录,则会建立用户,相关信息会被写入~/.docker/config.json文件中

 

 

二、用BASE64编码~/.docker/config.json的内容

cat ~/.docker/config.json | base64

  

 

三、将第二步的输出结果做为secret的data.dockercfg域的内容,由此建立一个Secret

apiVersion: v1
kind: Secret
metadata:
  name: base64secret
data:
  .dockercfg: ewoJImF1dGhzIjogewoJCSJsb2NhbGhvc3Q6NTAwMCI6IHsKCQkJImF1dGgiOiAiYkdsMWMzazZNVEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuMTIgKGxpbnV4KSIKCX0KfQ==
type: kubernetes.io/dockercfg

  

四、在建立Pod时引用该Secret

apiVersion: v1
kind: Pod
metadata:
  name: k8sdemo
spec:
  containers:
  - name: k8sdemo
    image: cnode-1:5000/k8sdemo:v1.3
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
  imagePullSecrets:
  - name: base64secret

  

 

在使用Mount方式挂载Secret时,Container中Secret的data域的各个域的key值做为目录的文件,Value值被BASE64编码后存在相应的文件中

该Container中可经过相应的查询命令查看所生成的文件和文件中的内容,以下所示:

 

能够经过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

相关文章
相关标签/搜索