(9)Kubernetes之Secret & Configmap

 

Secret

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名、密码或者密钥。将这 些信息直接保存在容器镜像中显然不妥,Kubemetes提供的解决方案是Secret

Secret会以密文的方式存储数据,避免了直接在配置文件中保存敏感信息。Secret会以 Volume的形式被mountPod,容器可通过文件的方式使用Secret中的敏感数据;此外, 容器也可以环境变量的方式使用这些数据。

Secret可通过命令行或YAML创建。比如希望Secret中包含如下信息:用户名admin、 密码 123456

有四种方法创建Secret

(1) 通过 -from-literal 

(2) 通过 -from-file 

(3) 通过 -from-env-file 

(4) 通过 YAML

(9)Kubernetes之Secret & Configmap_第1张图片

文件中的敏感数据必须是通过base64编码后的结果。

 

查看

# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-7zxpn   kubernetes.io/service-account-token   3      64d
mysecret              Opaque                                2      87s

--------------------------------------------------------------------------
# kubectl get secret mysecret
NAME       TYPE     DATA   AGE
mysecret   Opaque   2      3m56s
--------------------------------------------------------------------------

# kubectl describe  secret mysecret
Name:         mysecret
Namespace:    default
Labels:       
Annotations:  

Type:  Opaque

Data
====
password:  12 bytes
username:  5 bytes
--------------------------------------------------------------------------

# kubectl get secret mysecret -o yaml
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2019-12-12T12:01:08Z"
  name: mysecret
  namespace: default
  resourceVersion: "1807327"
  selfLink: /api/v1/namespaces/default/secrets/mysecret
  uid: a74b1683-fd2e-4b7c-983a-86e8e57939de
type: Opaque

 


在pod中使用Secret

1、volume方式

1.1、将Secret挂载到Volume中

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

进入Pod查看挂载的Secret:

# ls /etc/secrets
password  username
# cat  /etc/secrets/username
admin
# cat  /etc/secrets/password
1f2d1e2e67df

也可以只挂载Secret中特定的key:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

在这种情况下:

  • username 存储在/etc/foo/my-group/my-username中
  • password未被挂载

1.2、将Secret设置为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

 需要注意的是,环境变量读取Secret很方便,但无法支撑Secret动态更新。


ConfigMap

Secret可以为Pod提供密码、Token私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以用ConfigMap。

ConfigMap的创建和使用方式与Secret非常类似,主要的不同是数据以明文的形式存放。

(1) 通过 -from-literal 

(2) 通过 -from-file 

(3) 通过 -from-env-file 

(4) 通过 YAML

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
data:
  config1: xxx
  config2: yyy

1.1 volume方式使用

(9)Kubernetes之Secret & Configmap_第2张图片

1.2 环境变量方式使用

(9)Kubernetes之Secret & Configmap_第3张图片

 

你可能感兴趣的:(#,kubernetes)