在 K8S 中可以通过 configmap 保存应用的配置,这样就将配置和运行代码分开了。
简介
ConfigMap 在 K8S 中用于管理配置,配置以 KeyValue 方式传递,用来保存非保密信息(包括单个属性或者配置文件),如果要进行加密则需要通过 Secret 保存,使用有如下的好处:
- 配置隔离,如果保存在镜像中,那么每次修改都需要重新打包镜像。
- 配置共享,当采用微服务时,有些配置项是共用的,那么就可以比较好的维护。
示例
----- 配置内容如下
# vim hello_configmap.yaml
apiVersion: v1 # 通过 kubectl explain ConfigMap 命令查看即可
kind: ConfigMap
metadata:
name: test-conf
namespace: default # 可以指定某个Namespace使用,对应的Pod也就需要在该NS内
data:
HTTP_PORT: "30000" # 必须是字符串,不支持整数
config_file: |
http.ssl: true
http.port: 30000
----- 创建、查看配置
# kubectl create -f hello_configmap.yaml
# kubectl get configmaps test-conf
# kubectl delete configmaps test-conf
创建好配置之后,可以通过环境变量使用。
# vim test_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
spec:
containers:
- name: test-container
image: alpine:latest
imagePullPolicy: Never
command: ["/usr/bin/nc", "-vlp", "$(SVR_PORT)"] # 引用环境变量需要$()而非${}
env:
- name: HELLO
value: WORLD # 直接配置环境变量
- name: SVR_PORT
valueFrom:
configMapKeyRef: # 环境变量从ConfigMap中获取
name: test-conf
key: HTTP_PORT
restartPolicy: Never # 失败后无需重启
----- 根据YAML创建Pod
# kubectl create -f test_pod.yaml
----- 查看暴露的环境变量
# kubectl exec -it test-pod -- /usr/bin/env
也可以挂载到容器内部的某个文件或者目录。
# vim test_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: test
spec:
containers:
- name: test-container
image: alpine:latest
imagePullPolicy: Never
command: ["/usr/bin/nc", "-vlp", "3000"]
volumeMounts:
- name: test-volume
mountpath: /app/config
volumes:
- name: test-volume
configMap:
name:test-conf
items:
- key: config_file
path: config.yaml
----- 根据YAML创建Pod
# kubectl create -f test_pod.yaml
----- 登录对应的Pod,然后可以查看 /app/config/config.yaml 文件
# kubectl exec test-pod -i --tty -- /bin/sh
常用命令
----- 指定文件或者目录创建,可以使用多次
kubectl create configmap YourConfigName --from-file=file.yaml --from-file=your/path
----- 命令行中以KV形式创建,同样允许多次使用
kubectl create configmap YourConfigName --from-literal=key=value
----- 通过环境文件形式创建,内部格式每行以 env=value 的方式保存,指定多次则最后一个生效
kubectl create configmap YourConfigName --from-env-file=env.txt
----- 查看某个Namespace的配置,如果不指定则默认所有
kubectl get configmaps -n YourNameSpace
----- 可以通过YAML格式输出
kubectl get configmaps YourConfigMapName -o yaml
----- 查看详细信息
kubectl describe configmaps YourConfigMapName
----- 如果要修改,可以通过 edit 在线修改或者直接将某个文件替换
kubectl edit configmaps YourConfigMapName
kubectl replace -f YourConfigMapFile.yaml
更多的命令行使用可以通过 kubectl create configmap -h
命令查看。