当前位置 博文首页 > Liusy01:k8s之Secret

    Liusy01:k8s之Secret

    作者:Liusy01 时间:2021-01-19 00:07


    导读

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

    Secret

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

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

     

    当然,也可以包含其他信息,

    例如:创建一个Secret

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

      

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

    Secret被创建之后,可以通过下列三种方式使用它:

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

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

      

    (2)通过挂载该Secret到Pod来使用它

    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来引用

    1、docker登陆私有仓库

    docker login localhost:5000
    

      

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

     

     

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

    cat ~/.docker/config.json | base64
    

      

     

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

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

      

    4、在创建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