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不区分类型

  •  

posted @ 2020-08-24 13:31  Bigberg  阅读(209)  评论(0编辑  收藏  举报