ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
注意:
ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。
使用
你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:
这些不同的方法适用于不同的数据使用方式。 对前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据。
[root@master demo]# vi configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
data:
username: zhangsan
password: yuanke
username: lisi
[root@master demo]# kubectl create -f configMap.yaml
configmap/test-config created
[root@master demo]# vi configMap.yaml
[root@master demo]# kubectl get configMaps
NAME DATA AGE
test-config 2 45s
[root@master demo]# kubectl describe configmaps test-config
Name: test-config
Namespace: default
Labels:
Annotations:
Data
====
password:
----
yuanke
username:
----
lisi
Events:
vim test-configMap-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-configmap-env-pod
spec:
containers:
- name: test-container
image: radial/busyboxplus
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","sleep 1000000"]
envFrom:
- configMapRef:
name: test-config
[root@master demo]# kubectl create -f test-configMap-env-pod.yaml
pod/test-configmap-env-pod created
[root@master demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-configmap-env-pod 1/1 Running 0 42s
[root@master demo]# kubectl exec -it test-configmap-env-pod -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=test-configmap-env-pod
TERM=xterm
username=lisi
password=yuanke
apiVersion: v1
kind: Pod
metadata:
name: test-configmap-env-pod
spec:
containers:
- name: test-container
image: radial/busyboxplus
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","echo ${MYSQLUSER} ${MYSQLPASSWD};sleep 1000000"]
env:
- name: MYSQLUSER
valueFrom:
configMapKeyRef:
name: test-config
key: username
- name: MYSQLPASSWD
valueFrom:
configMapKeyRef:
name: test-config
key: password
[root@master demo]# kubectl create -f test-configMap-env-pod.yaml
pod/test-configmap-env-pod created
[root@master demo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-configmap-env-pod 1/1 Running 0 5s
[root@master demo]# kubectl exec -it test-configmap-env-pod -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=test-configmap-env-pod
TERM=xterm
MYSQLUSER=lisi
MYSQLPASSWD=yuanke
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 使用 Secret 意味着你不需要在应用程序代码中包含机密数据。
由于创建 Secret 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secret(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secret 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。
Secret 类似于 ConfigMap 但专门用于保存机密数据。
注意:
默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret; 这包括间接访问,例如创建 Deployment 的能力。
为了安全地使用 Secret,请至少执行以下步骤:
Secret 的使用
Pod 可以用三种方式之一来使用 Secret:
您也可以先以 json 或 yaml 格式在文件中创建一个 secret 对象,然后创建该对象。
每一项必须是 base64 编码:
$ echo -n "admin" | base64
YWRtaW4=
$ echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
解密:
echo 'YWRtaW4=' | base64 --decode
返回admin
vim secret-env.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret-env
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
[root@master demo]# kubectl create -f secret-env.yaml
secret/mysecret-env created
[root@master demo]# kubectl get secrets
NAME TYPE DATA AGE
default-token-mp2h9 kubernetes.io/service-account-token 3 21d
mysecret-env Opaque 2 10s
tls-secret kubernetes.io/tls 2 23h
vim secret-pod-env1.yaml
apiVersion: v1
kind: Pod
metadata:
name: envfrom-secret
spec:
containers:
- name: test-nginx
image: nginx
envFrom:
- secretRef:
name: mysecret-env
[root@master secret]# kubectl apply -f secret-pod-env1.yaml
pod/envfrom-secret created
[root@master secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
envfrom-secret 1/1 Running 0 16s
[root@master secret]# kubectl exec -it envfrom-secret -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=envfrom-secret
TERM=xterm
password=1f2d1e2e67df
username=admin
vim secret-pod-env2.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-secret-env-pod
spec:
containers:
- name: test-container
image: radial/busyboxplus
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","echo ${MYSQLUSER} ${MYSQLPASSWD};sleep 1000000"]
env:
- name: MYSQLUSER
valueFrom:
secretKeyRef:
name: mysecret-env
key: username
- name: MYSQLPASSWD
valueFrom:
secretKeyRef:
name: mysecret-env
key: password
[root@master secret]# kubectl apply -f secret-pod-env2.yaml
pod/test-secret-env-pod created
[root@master secret]# kubectl get pod
NAME READY STATUS RESTARTS AGE
test-secret-env-pod 1/1 Running 0 5s
[root@master secret]# kubectl exec -it test-secret-env-pod -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=test-secret-env-pod
TERM=xterm
MYSQLUSER=admin
MYSQLPASSWD=1f2d1e2e67df