Kubernetes-Secret使用说明

Kubernetes提供Secret资源用于解决密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。

Secret类型

  • Opaque:base64编码格式的Secret,用来存储密码、密钥等;但数据也通过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中。

常用的应用主要使用Opaque类型的Secret,本次我们主要介绍该类型

Secret的创建方式

1. 通过yaml文件创建

[root@k8s-node1 dinghh]# cat passwd-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: passwd-secret 
type: Opaque 
data: 
  username: dXNlcm5hbWUK
  password: cGFzc3dvcmQK

其中username和password是根据base64加密

[root@k8s-node1 dinghh]# echo username | base64
dXNlcm5hbWUK
[root@k8s-node1 dinghh]# echo password | base64
cGFzc3dvcmQK

创建secret

[root@k8s-node1 dinghh]# kubectl create -f passwd-secret.yaml 
secret/passwd-secret created

[root@k8s-node1 dinghh]# kubectl get secrets passwd-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:20:40Z"
  name: passwd-secret
  namespace: default
  resourceVersion: "995896"
  selfLink: /api/v1/namespaces/default/secrets/passwd-secret
  uid: 83644454-9c91-11e9-ad16-fa163e17fab9
type: Opaque

可以看到通过describe secret是可以看到secret中的具体数据的,通过base64解码则可以看到原始数据

[root@k8s-node1 dinghh]# echo dXNlcm5hbWUK | base64 --decode
username
[root@k8s-node1 dinghh]# echo cGFzc3dvcmQK | base64 --decode
password

2. 通过kubectl指定配置文件等参数来创建

kubectl create secret generic

根据配置文件、目录或指定的literal-value创建secret。

secret可以保存为一个或多个key/value信息。

当基于配置文件创建secret时,key将默认为文件的基础名称,value默认为文件内容。如果基本名称的key无效,则可以指定另一个key。

当基于目录创建secret时,key还是文件的基础名称,目录中有效的key的每个文件都被打包到secret中,除了常规文件之外的任何目录条目都被忽略(例如subdirectories, symlinks, devices, pipes, etc)。

基于文件创建(更多创建方式参考:http://docs.kubernetes.org.cn/556.html)

[root@k8s-node1 dinghh]# echo username > username 
[root@k8s-node1 dinghh]# echo password > password

[root@k8s-node1 dinghh]# kubectl create secret generic test-secret --from-file=./username --from-file=./password 
secret/test-secret created

[root@k8s-node1 dinghh]# kubectl get secrets test-secret -oyaml
apiVersion: v1
data:
  password: cGFzc3dvcmQK
  username: dXNlcm5hbWUK
kind: Secret
metadata:
  creationTimestamp: "2019-07-02T06:52:47Z"
  name: test-secret
  namespace: default
  resourceVersion: "1000413"
  selfLink: /api/v1/namespaces/default/secrets/test-secret
  uid: 00824b62-9c96-11e9-ad16-fa163e17fab9
type: Opaque

可以看到指定文件创建时会自动进行base64加密

Secret的使用

1. 在文件中使用

通过volumeMount方式将secret挂载到pod容器中

创建一个pod

[root@k8s-node1 dinghh]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx
spec:
  containers:
  - image: nginx:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
    volumeMounts:
    - mountPath: /etc/secrets
      name: passwd-secret
      readOnly: true
  restartPolicy: Always
  volumes:
  - name: passwd-secret
    secret:
      defaultMode: 420
      secretName: passwd-secret

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created

通过yaml可以看到通过volumeMounts方式将secret挂载到容器的/etc/secret目录

进入容器查看

[root@k8s-node1 dinghh]# kubectl create -f nginx.yaml 
pod/nginx created
[root@k8s-node1 dinghh]# kubectl exec -it nginx bash
[root@nginx /]# cd /etc/secrets/
[root@nginx secrets]# ll
total 0
lrwxrwxrwx 1 root root 15 Jul  2 15:00 password -> ..data/password
lrwxrwxrwx 1 root root 15 Jul  2 15:00 username -> ..data/username
[root@nginx secrets]# cat username 
username
[root@nginx secrets]# cat password 
password

可以看到将secret中的key作为文件名称写在指定目录下,并且文件中的内容是base64解密之后的

2. 在环境变量中使用

创建pod

[root@k8s-node1 dinghh]# cat nginx-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    k8s-app: nginx
    version: master
  name: nginx-env
spec:
  containers:
  - env:
    - name: USERNAME_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: username
    - name: PASSWORD_ENV
      valueFrom:
        secretKeyRef:
          name: passwd-secret
          key: password
    image: 192.168.133.20:30050/kube-system/aistack-dashboard:master
    imagePullPolicy: IfNotPresent
    name: nginx
    ports:
    - containerPort: 80
      name: dashboard
      protocol: TCP
    resources: {}
  restartPolicy: Always

[root@k8s-node1 dinghh]# kubectl create -f nginx-env.yaml 
pod/nginx-env created

可以看到在该Pod中定义了两个环境变量分别引用passwd-secret中的对应的key

进入容器查看

[root@k8s-node1 dinghh]# kubectl exec -it nginx-env bash
[root@nginx-env /]# echo $USERNAME_ENV
username
[root@nginx-env /]# echo $PASSWORD_ENV
password

 

你可能感兴趣的:(Docker,Kubernetes)