Secret资源的功能类似于ConfigMap,但它专用于存放敏感数据,如密码、数字证书、私钥、令牌和ssh key等。

一、概述

Secret对象存储数据以键值方式存储数据,再pod资源中通过环境变量或存储卷进行数据访问。Secret对象仅会被分发至调用了此对象的pod资源所在的工作节点,且只能由节点将其存储于内存中。另外,Secret对象的数据的存储及打印格式为base64编码的字符串,因此用户在创建对象时也要提供此种编码格式的数据。不过,在容器中以环境变量或存储卷的方式访问时,他们会被自动解码为明文格式。

在master节点上,Secret对象以非加密的格式存储于etcd中,因此管理员必须加以精心管控以确保敏感数据的机密性,必须确保etcd集群节点间以及与APIserver的安全通信,etcd服务的访问授权,还包括用户访问APIServer时的授权,因为拥有创建pod资源的用户都可以使用Secret资源并能够通过pod中的容器访问其数据。

Secret对象主要有两种用途,一是作为存储卷注入到pod上,由容器应用程序所使用,二是用于kubelet为pod里的容器拉取镜像时向私有仓库提供认证信息。Secret资源主要有四种类型组成:

1、Opaque:自定义数据内容;base64编码,用来存储密码、密钥、信息、证书等数据,类型标识符为generic

2、kubernetes.io/service-account-token:ServiceAccount的认证信息,可在创建service account时由kubernetes自动创建

3、kubernetes.io/dockerconfigjson: 用来存储Docker镜像仓库的认证信息,类型标识符为docker-registry

4、kubernetes.io/tls:用于为ssl通信模式存储证书和私钥文件,命令式创建时类型标识符为tls。

二、创建Secret资源

1、命令式创建

$ kubectl -n testing create secrete generic mysql-auth --from-literal=username=root --from-literal=password=123456
[root@master secret]# kubectl -n testing get secret
NAME                  TYPE                                  DATA   AGE
default-token-hs2jc   kubernetes.io/service-account-token   3      24d
mysql-auth            Opaque                                2      15s
[root@master secret]# kubectl -n testing describe secret mysql-auth
Name:         mysql-auth
Namespace:    testing
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  6 bytes
username:  4 bytes
[root@master secret]# kubectl -n testing get secret mysql-auth -o yaml
apiVersion: v1
data:
  password: MTIzNDU2
  username: cm9vdA==
kind: Secret
metadata:
  creationTimestamp: "2019-08-20T05:38:39Z"
  name: mysql-auth
  namespace: testing
  resourceVersion: "275852"
  selfLink: /api/v1/namespaces/testing/secrets/mysql-auth
  uid: c37a3fc1-c30c-11e9-8f53-000c29b9991f
type: Opaque

[root@master secret]# echo cm9vdA== | base64 -d
root

对于本身业已存储于文件中的数据,也可在创建generic格式secret对象时使用--from-file选项从文件中直接进行加载,例如创建用于ssh认证的secret对象时:

$ kubectl -n testing create secret generic ssh-key --from-file=prikey=/root/.ssh/id_rsa --from-file=pubkey=/root/.ssh/id_rsa.pub

另外,若要基于私钥和数字证书文件创建用于ssl/tls通信的secret对象,则需要使用--cert=--key=选项来进行,其类型标识符为TLS:

$ kubectl -n testing create secret tls nginx-ssl --key=./nginx.key --cert=./nginx.crt
[root@master secret]# kubectl -n testing describe secret nginx-ssl
Name:         nginx-ssl
Namespace:    testing
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  1233 bytes
tls.key:  1675 bytes

无论用户提供的证书和私钥文件使用的是什么名称,它们一律会被转换为分别以tls.key和tls.crt为其键名。

 2、清单式创建

secret资源对象除了标准的apiVersion、kind、metadata字段外,还有:

data:key:value格式的数据,通常是敏感信息,数据格式需是以base64格式编码的字符串,因此,需要事先完成编码。

stringData:以明文格式定义的key:value数据,非base64编码,而是在创建为secret对象时自动进行编码并保存于data字段中;stringData字段中的明文不会被api server输出,不过若是使用apply命令创建,那么注解信息中还是可能会直接输出这些信息的

type:仅是为了便于编程方式处理secret数据而提供的类型标识。

apiVersion: v1
kind: Secret
metadata:
  name: redis-sct
  namespace: testing
stringData:
  username: redis
  password: 123pass
type: Opaque

根据此配置清单,使用apply命令创建后,用describe命令会输出未转换为base64编码的字符,若使用create命令创建,则输出base64编码后的字符。

三、secret存储卷

类似于pod消费configmap对象的方式,secret对象可以注入为环境变量,也可以存储为卷形式挂载使用。不过,容器应用通常会在发生错误时将所有环境变量保存于日志信息中,甚至有些应用在启动时即会将运行环境打印到日志中;另外,容器应用调用第三方程序为子进程时,这些子进程能够继承并使用父进程的所有环境变量。有鉴于此,使用环境变量引用secret对象中的敏感信息实在算不上明智之举。

在pod中使用secret存储卷的方式,除了其类型及引用标识要替换为secret及secretName之外,几乎完全类似于ConfigMap存储卷,包括支持使用挂载整个存储卷、只挂载存储卷中的指定键值以及独立挂载存储卷中的键等使用方式。

apiVersion: v1
kind: Pod
metadata:
  name: vol-sct-pod
  namespace: testing
spec:
  containers:
  - name: nginx
    image: nginx:1.12-alpine
    volumeMounts:
    - name: ngx-crt
      mountPath: /etc/nginx/ssl
      readOnly: true
  volumes:
  - name: ngx-crt
    secret:
      secretName: nginx-ssl
/etc/nginx/ssl # ls -l
total 0
lrwxrwxrwx    1 root     root            14 Aug 20 07:10 tls.crt -> ..data/tls.crt
lrwxrwxrwx    1 root     root            14 Aug 20 07:10 tls.key -> ..data/tls.key
/etc/nginx/ssl # pwd
/etc/nginx/ssl

四、imagePullSecret资源对象

imagePullSecret资源可用于辅助kubelet从需要认证的私有镜像仓库获取镜像,它通过将secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程。使用imagePullSecret的方式有两种:一是创建docker-registry类型的secret对象,并在定义pod资源时明确通过imagePullSecret字段给出;另一个是创建docker-registry类型的secret对象,将其添加到某特定的serviceaccount对象中,那些使用该serviceaccount资源创建的pod对象,以及默认使用该serviceaccount的pod对象都将会直接使用imagePullSecret中的认证信息。

kubectl -n testing create secret  docker-registry test-reg --docker-username=cabel --docker-password=123456 --docker-email=zhangcaibao@163.com
apiVersion: v1
kind: Pod
metadata:
  name: sct-image
  namespace: testing
spec:
  imagePullSecrets:
  - name: test-reg
  containers:
  - name: vpn
    image: cabel/openvpn:v2.4
posted on 2019-08-20 11:47  自然洒脱  阅读(1215)  评论(0编辑  收藏  举报