• Kubernetes Secret


    一、简介

    Secret主要作用是保管私密数据,如密码,OAuth Tokens和 ssh key等,将这些信息放在Secret中比放在Pod的定义中或者docker镜像中来说更加灵活和安全

    Secret有三种类型:

    • Opaque:base64 编码格式的secret,用来存储密码、密钥等;但数据也可以通过base64-decode解码得到原始数据,所以加密下很弱

    • kubernetes.io/dockerconfigjson:用来存储docker registry的认证信息

    • kubernetes.io/service-account-token:用于被ServiceAccount引用,ServiceAccount创建时kubernetes会默认创建对应的secret。Pod如果使用了ServiceAccount,对应的secret会自动挂载到Pod目录/run/secrets/kubernetes.io/serviceaccount中

    二、Opaque Secret

    Opaque 类型的数据是一个map类型,要求value是base64编码格式,比如创建一个用户名为admin,密码为admin123的Secret对象,首先需要把这个用户名和密码做base64编码

    # echo -n 'admin' | base64
    YWRtaW4=
    ​
    # echo -n 'admin123'|base64
    YWRtaW4xMjM=

    编写secret-demo.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YWRtaW4xMjM=

    创建secret

    # kubectl create -f secret-demo.yaml 
    secret/my-secret created

    查看secret

    # kubectl get secret my-secret -o wide
    NAME        TYPE     DATA   AGE
    my-secret   Opaque   2      20s
    ​
    ​
    # kubectl describe secret my-secret
    Name:         my-secret
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    ​
    Type:  Opaque
    ​
    Data
    ====
    password:  8 bytes
    username:  5 bytes

    三、使用Secret

    3.1 环境变量

    secret-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-pod1
    spec:
      containers:
      - name: secret-pod1
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox
        command:
        - sleep
        - "600"
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password 

    查看env环境变量

    # kubectl exec -it secret-pod1 -- env | grep -Ei 'username|password'
    USERNAME=admin
    PASSWORD=admin123

    3.2 volume挂载

    secret-pod2.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: secret-pod2
    spec:
      containers:
      - name: secret-pod2
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/busybox
        command: ['/bin/sh','-c','ls /etc/secrets']
        volumeMounts:
        - name: secrets
          mountPath: /etc/secrets
      volumes:
      - name: secrets
        secret:
          secretName: my-secret

    创建Pod

    # kubectl create -f secret-pod2.yaml 
    pod/secret-pod2 created

    查看日志输出

    # kubectl logs secret-pod2
    password
    username

    四、 Kubernetes.io/dockerconfigjson

    除了上面的Opaque这个类型外,还可以来创建用户docker registry 认证的 Secret,直接使用kubectl create 即可

    # kubectl create secret docker-registry myregistry --docker-server=DOCKER_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
    ​
    secret "myregistry" created

    五、Kubernetes.io/service-account-token

    另外一种Secret类型就是kubernetes.io/service-account-token,用于被serviceaccount引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的secret会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中。

     

     六、Secret 与 ConfigMap对比

    相同点:

    • key/value 的形式

    • 属于某个特定的 namespace

    • 可以导出到环境变量

    • 可以通过目录/文件形式挂载

    • 通过volume挂载的配置信息均可热更新

    不同点:

    • Secret可以被ServerAccount关联

    • Secret可以存储docker register的鉴权信息,用在ImagePullSecret参数中,用于拉去私有仓库的镜像

    • Secret支持base64加密

    • Secret分为 kubernetes.io / service-account-token、kubernetes.io/dockerconfigjson、Opaque三种类型,而ConfigMap不区分类型

    •  

  • 相关阅读:
    如何强制360浏览器以极速模式打开页面
    如何解决Android SDK无法下载Package的问题(.net)
    Xamarin 安装步骤
    使用require.js和backbone实现简单单页应用实践
    HBuilder之初体验
    ClassLoader&双亲委派&类初始化过程
    List remove ConcurrentModificationException源码分析
    二十九、简谈设计模式
    二十八、Java基础--------正则表达式
    二十七、JDK1.5新特性---Annotation
  • 原文地址:https://www.cnblogs.com/bigberg/p/13553373.html
Copyright © 2020-2023  润新知