共计 6416 个字符,预计需要花费 17 分钟才能阅读完成。
我最新最全的文章都在 南瓜慢说 www.pkslow.com,欢送大家来喝茶!
1 简介
配置是程序绕不开的话题,在 Kubernetes
中应用 ConfigMap
来配置,它实质其实就是键值对。本文解说如何通过 5 种形式创立ConfigMap
,通过 4 种形式应用ConfigMap
。
2 创立 ConfigMap
按大类可分为两种形式,细分共有五种形式:
(一)kubectl create configmap
创立
- (1)通过命令行参数字面间接创立
- (2)通过指定文件创建
- (3)通过指定目录创立
- (4)通过指定环境变量配置文件创立
(二)yaml
文件创建
2.1 通过命令 kubectl create configmap
创立
2.1.1 从字面创立
命令如下:
$ kubectl create configmap pkslow-literal \
--from-literal=pkslow.name=Larry \
--from-literal=pkslow.age=18 \
--from-literal=pkslow.webSite=www.pkslow.com
通过参数 --from-literal
间接指定键值对。这种形式比拟实用于长期测试应用,而且不适宜配置很多的状况。
查看内容如下:
$ kubectl get configmaps pkslow-literal -o yaml
:
apiVersion: v1
data:
pkslow.age: "18"
pkslow.name: Larry
pkslow.webSite: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-literal
namespace: default
2.1.2 从文件创建
application.yaml 文件内容如下:
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
application-uat.yaml 文件内容如下:
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
命令如下:
$ kubectl create configmap pkslow-file \
--from-file=application.yaml \
--from-file=application-uat.yaml
通过参数 --from-file
来指定文件。查看内容如下:
$ kubectl get configmaps pkslow-file -o yaml
:
apiVersion: v1
data:
application-uat.yaml: |-
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
application.yaml: |-
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-file
namespace: default
能够看到它的 key
为文件名,因为咱们没有指定,所以默认为文件名。须要指定则如下:
$ kubectl create configmap pkslow-file \
--from-file=app=application.yaml \
--from-file=uat=application-uat.yaml
2.1.3 从目录创立
命令如下:
$ kubectl create configmap pkslow-directory --from-file=./
如上一种形式没有太大差异,只是 --from-file
前面的参数是目录,而不是文件。
2.1.4 从环境变量配置文件创立
配置文件 pkslow.env 内容如下:
PKSLOW_NAME=Larry
PKSLOW_AGE=18
PKSLOW_WEBSITE=www.pkslow.com
创立命令如下:
$ kubectl create configmap pkslow-env --from-env-file=pkslow.env
查看内容如下:
kubectl get configmaps pkslow-env -o yaml
:
apiVersion: v1
data:
PKSLOW_AGE: "18"
PKSLOW_NAME: Larry
PKSLOW_WEBSITE: www.pkslow.com
kind: ConfigMap
metadata:
name: pkslow-env
namespace: default
仔细的敌人应该能发现,这种形式如之前的从文件创建很不一样。它的 (key, value)
不是(文件名,文件内容)
,而是文件中一个个的配置。
2.2 通过 yaml
文件创建
通过 yaml
文件创建就很惯例了,跟一般的 kubernetes
资源创立没有什么区别。先筹备 yaml
文件如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: pkslow-yaml
data:
PKSLOW_AGE: "18"
PKSLOW_NAME: Larry
PKSLOW_WEBSITE: www.pkslow.com
application-uat.yaml: |-
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
application.yaml: |-
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
再通过以下文件创建:
$ kubectl apply -f configmap.yaml
3 Pod 应用 ConfigMap
在 Pod
中应用 ConfigMap
有以下四种形式:
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷外面增加一个文件,让利用来读取
- 编写代码在 Pod 中运行,应用 Kubernetes API 来读取 ConfigMap
其中第 1 种和第 2 种形式相似,只是启动命令增加环境变量,所以还是要把 ConfigMap
映射为容器的环境变量。
第 4 种形式要拜访API
,能够应用相干的库,如Spring Cloud Kubernetes
,这里不再介绍。
所以咱们次要解说第 2、3 种形式。
3.1 Pod 的环境变量映射
把 ConfigMap
的值映射到环境变量,次要有两种形式,valueFrom
和envFrom
。
3.1.1 valueFrom 一一映射
通过 valueFrom
来配置环境变量,Pod
的环境变量名与 ConfigMap
不用雷同。
apiVersion: v1
kind: Pod
metadata:
name: pkslow-env-value-from
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "env"]
env:
- name: PKSLOW_NAME
valueFrom:
configMapKeyRef:
name: pkslow-yaml
key: PKSLOW_NAME
- name: PKSLOW_WEBSITE
valueFrom:
configMapKeyRef:
name: pkslow-yaml
key: PKSLOW_WEBSITE
restartPolicy: Never
查看后果如下:
$ kubectl logs -f pkslow-env-value-from | grep PKSLOW
PKSLOW_WEBSITE=www.pkslow.com
PKSLOW_NAME=Larry
NOTE:当然也能够把 application-uat.yaml
这种文件映射成环境变量,但因为文件内容可能是多行的,咱们个别不会这样做。
3.1.2 envFrom 全副映射
通过 envFrom
会把 ConfigMap
的所有键值对都映射到 Pod
的环境变量中去。应用如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-env-env-from
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "env"]
envFrom:
- configMapRef:
name: pkslow-yaml
restartPolicy: Never
查看环境变量如下:
$ kubectl logs -f pkslow-env-env-from
PKSLOW_WEBSITE=www.pkslow.com
PKSLOW_AGE=18
PKSLOW_NAME=Larry
application.yaml=server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
application-uat.yaml=server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
显然看起来这种形式更简便,不必每个环境变量都配一遍,但它可能会带来脏数据,就看怎么应用了。
3.2 加载文件
3.2.1 通过 volume 加载
能够通过 volume
的形式把 ConfigMap
加载进Pod
,如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-volume
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "sleep 1000000"]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config
restartPolicy: Never
进入Pod
,查看内容如下:
$ kubectl exec -it pkslow-mount-volume -- /bin/sh
/ # cd /data/config/
/data/config # ls -lrt
total 0
lrwxrwxrwx 1 root root 23 Feb 21 17:10 application.yaml -> ..data/application.yaml
lrwxrwxrwx 1 root root 27 Feb 21 17:10 application-uat.yaml -> ..data/application-uat.yaml
lrwxrwxrwx 1 root root 21 Feb 21 17:10 PKSLOW_WEBSITE -> ..data/PKSLOW_WEBSITE
lrwxrwxrwx 1 root root 18 Feb 21 17:10 PKSLOW_NAME -> ..data/PKSLOW_NAME
lrwxrwxrwx 1 root root 17 Feb 21 17:10 PKSLOW_AGE -> ..data/PKSLOW_AGE
/data/config # cat PKSLOW_WEBSITE
www.pkslow.com
/data/config # cat application.yaml
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
如果只想要 ConfigMap
的局部内容,并自定义文件名,可通过 items
来配置,如下:
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-volume
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
items:
- key: application.yaml
path: app.yaml
- key: application-uat.yaml
path: uat.yaml
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "sleep 1000000"]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config
restartPolicy: Never
3.2.2 通过 subPath 加载
通过配置 subPath
字段,把文件一个一个加载到 Pod
中去。
apiVersion: v1
kind: Pod
metadata:
name: pkslow-mount-subpath
spec:
volumes:
- name: config-volume
configMap:
name: pkslow-yaml
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "sleep 1000000"]
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /data/config/dev.yaml
subPath: application.yaml
- name: config-volume
mountPath: /data/config/uat.yaml
subPath: application-uat.yaml
restartPolicy: Never
查看内容如下:
$ kubectl exec -it pkslow-mount-subpath -- /bin/sh
/ # cd /data/config/
/data/config # ls -lrt
total 8
-rw-r--r-- 1 root root 89 Feb 21 17:31 uat.yaml
-rw-r--r-- 1 root root 78 Feb 21 17:31 dev.yaml
/data/config # cat dev.yaml
server:
port: 8080
pkslow:
name: Larry
age: 18
webSite: www.pkslow.com
/data/config # cat uat.yaml
server:
port: 8080
pkslow:
name: LarryDpk
age: 20
webSite: https://www.pkslow.com
4 不可变的 ConfigMap
能够禁止批改ConfigMap
,益处有:
- 爱护利用,使之免受意外(不想要的)更新所带来的负面影响。
- 通过大幅升高对 kube-apiserver 的压力晋升集群性能,这是因为零碎会敞开 对已标记为不可变更的 ConfigMap 的监督操作。
此性能个性由 ImmutableEphemeralVolumes
个性门控 来管制。你能够通过将 immutable
字段设置为 true
创立不可变更的 ConfigMap。例如:
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
一旦某 ConfigMap 被标记为不可变更,则 无奈 逆转这一变动,也无奈更改 data
或 binaryData
字段的内容。你只能删除并重建 ConfigMap。因为现有的 Pod 会保护一个对已删除的 ConfigMap 的挂载点,倡议从新创立 这些 Pods。
5 总结
Secret
与 ConfigMap
的创立与应用也是相似的,不再具体介绍了。
代码请查看:https://github.com/LarryDpk/p…
欢送关注微信公众号 <南瓜慢说>,将继续为你更新 …
多读书,多分享;多写作,多整顿。