doina

一个小菜鸟运维工程师.

kubernetes 特殊存储卷Secret

理解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文件也会对应的删除。
点赞

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据