美文网首页Kubernetes
kubernetes 特殊存储卷Secret

kubernetes 特殊存储卷Secret

作者: baiyongjie | 来源:发表于2019-03-28 16:14 被阅读6次

    理解Secrets

    Secret是用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。

    用户可以创建自己的secret,系统也会有自己的secret。

    Pod需要先引用才能使用某个secret,Pod有2种方式来使用secret:作为volume的一个域被一个或多个容器挂载;在拉取镜像的时候被kubelet引用。

    Secrets相当于加密后的配置中心,使用base64编码,并不是真正意义上的加密,只是相对于明文来讲的安全

    Secrets的三种类型

    # kubectl get secrets --all-namespaces 
    NAMESPACE       NAME                        TYPE                                  DATA   AGE
    cattle-system   cattle-credentials-466ab77  Opaque                                2      32d
    xxxx-dev        default-token-5hkt9         kubernetes.io/service-account-token   3      12d
    xxxx-dev        regsecret                   kubernetes.io/dockerconfigjson        1      12d
    
    • Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
    • kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
    • kubernetes.io/service-account-token:用于被 serviceaccount 引用。serviceaccout 创建时 Kubernetes 会默认创建对应的 secret。Pod 如果使用了 serviceaccount,对应的 secret 会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。

    创建Secrets的三种方法

    # kubectl create secret --help
    Available Commands:
      docker-registry Create a secret for use with a Docker registry
                      // 用于存储docker私有仓库的账号密码信息
      generic         Create a secret from a local file, directory or literal value
                      // 用于存储数据库密码等需要加密的信息
      tls             Create a TLS secret
                      // 用于证书使用
    

    创建Opaque类型的secret

    # 创建一个名为mysql-password,类型为generic,键值为root-password,密码为P@ssW0rd的secret
    # kubectl create secret generic mysql-password  --from-literal=root-password=P@ssW0rd
    secret/mysql-password created
    
    # 只显示了key, value没有显示,只显示8位字符
    # kubectl describe secrets mysql-password 
    Name:         mysql-password
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    root-password:  8 bytes
    
    # 导出格式为yaml的文件,可以看到root-password对于的值已经使用base64的方式加密
    # kubectl get secrets mysql-password -o yaml
    apiVersion: v1
    data:
      root-password: UEBzc1cwcmQ=
    kind: Secret
    metadata:
      creationTimestamp: "2019-03-28T05:38:16Z"
      name: mysql-password
      namespace: default
      resourceVersion: "9102868"
      selfLink: /api/v1/namespaces/default/secrets/mysql-password
      uid: af9cb76c-511b-11e9-acb5-8cec4b5f0fe5
    type: Opaque
    

    使用base64反解密

    # echo UEBzc1cwcmQ= | base64 -d
    P@ssW0rd
    

    创建kubernetes.io/dockerconfigjson类型的secret

    kubectl create -n NAMESPACES secret docker-registry SECRETNAME \
    --docker-server=private.docker.com \
    --docker-username=username \
    --docker-password=password \
    --docker-email=misterbyj@163.com
    
    ---
    -n 指定命名空间
    --docker-server   指定仓库地址
    --docker-username 用户名
    --docker-password 密码
    --docker-email    邮件地址
    

    查看yaml格式

    [root@k8sMaster01 deployment]# kubectl -n NAMESPACES get secret SECRETNAME --output=yaml      
    apiVersion: v1
    data:
      .dockerconfigjson: eyJhdXRocyI6eyJwcml2YXRlLndpbmNoYW5uZWwubmV0Ijp7InVzZXJuYW1lIjoid2luY2hhbm5lbCIsInBhc3N3b3JkIjoid2luY2hhbm5lbDIwMTgiLCJlbWFpbCI6ImJhaXlvbmdqaWVAd2luY2hhbm5lbC5uZXQiLCJhdXRoIjoiZDJsdVkyaGhibTVsYkRw
    kind: Secret
    metadata:
      creationTimestamp: 2018-12-27T11:29:27Z
      name: SECRETNAME
      namespace: NAMESPACES
      resourceVersion: "177507"
      selfLink: /api/v1/namespaces/NAMESPACES/secrets/SECRETNAME
      uid: ab7378a8-09ca-11e9-bed3-525400a92dc9
    type: kubernetes.io/dockerconfigjson
    

    修改Pod yaml文件

    # 新增加imagePullSecrets, 参数为刚创建的regsecret
    
          containers:
            name: base-config
            image: private.winchannel.net/winchannel/base-config:0.1.0-stable
          imagePullSecrets:
            - name: SECRETNAME
    

    Secret与ConfigMap对比

    相同点

    • key/value的形式
    • 属于某个特定的namespace
    • 可以导出到环境变量
    • 可以通过目录/文件形式挂载(支持挂载所有key和部分key)

    不同点

    • Secret可以被ServerAccount关联(使用)
    • Secret可以存储register的鉴权信息,用在ImagePullSecret参数中,用于拉取私有仓库的镜像
    • Secret支持Base64加密
    • Secret分为kubernetes.io/Service Account,kubernetes.io/dockerconfigjson,Opaque三种类型,Configmap不区分类型
    • Secret文件存储在tmpfs文件系统中,Pod删除后Secret文件也会对应的删除。

    相关文章

      网友评论

        本文标题:kubernetes 特殊存储卷Secret

        本文链接:https://www.haomeiwen.com/subject/ocfcbqtx.html