分布式环境中,基于负载、容错等需求的考虑,几乎所有的服务都需要在不同的机器节点上部署不止一个实例。随着程序日益复杂,程序的配置日益增多,而且配置文件的修改频率大于代码本身,这种情况下,有时候修改一个配置就不得不重新编译代码,分发上线。部署规则较大的场景中,是相当复杂、繁琐的
ConfigMap
作为分布式Kubernetes也提供了统一配置管理方案,基于ConfigMap对象实现了将配置文件从容器镜像中解耦,从而增强了容器应用的可移植性。
创建
apiVersion: v1
data:
# K V 形式存储
ca.crt: "xxxx"
kind: ConfigMap
metadata:
name: kube-root-ca.crt
namespace: base
环境变量使用
env:
- name: test
valueFrom:
configMapKeyRef:
name: configmap_name
key: map_key
# 引用正哥文件
envFrom:
# 前缀
- prefix: alibaba
configMapRef:
name: configmap_name
optional: false
挂载存储卷使用
volumes:
- name: test
configMap:
# 导出全部文件
name: configmap_name
# 指定配置
items:
- key: xxx.conf
path: xxxx.conf
# 权限0-777
mode: 0644
注意事项
- 以存储卷引用的方式ConfigMap 时候必须先与Pod存在,否则导致Pod无法正常启动的错误
- 当环境变量注入的ConfigMap中的键不存在时会被忽略
- ConfigMap 的名称空间级的资源,因此Pod必须与其在同一个命名空间
Secret
与ConfigMap功能类似,但它专用与存放敏感数据,例如:密码、数字证书、秘钥、令牌 在Secret 里数据都使用Base64编码字符串存储
创建
apiVersion: v1
data:
.dockerconfigjson: >-
eyJhdXRocyI6eyJyZWdpc3RyeS12cGMuY24tc2hhbmdoYWkuYWxpeXVuY3MuY29tIjp7InVzZXJuYW1lIjoiaWQtYWx5QGJpbGxiZWFyLmNuIiwicGFzc3dvcmQiOiIyMDIwYmlsbGJlYXIuY24iLCJhdXRoIjoiYVdRdFlXeDVRR0pwYkd4aVpXRnlMbU51T2pJd01qQmlhV3hzWW1WaGNpNWpiZz09In19fQ==
kind: Secret
metadata:
name: aliyun-shanghai
namespace: base
type: kubernetes.io/dockerconfigjson
环境变量使用
env:
- name: test
valueFrom:
secretKeyRef:
key: secretKeyName_Key
name: secretKeyName
挂载存储卷使用
volumes:
- name: volume-name
secret:
defaultMode: 420
secretName: secretKeyName
items:
- key: xxx.conf
path: xxxx.conf
# 权限0-777
mode: 0644
拉取镜像配置
containers:
image: 'registry-vpc.cn-shanghai.aliyuncs.com/shlx/billbear-book-client:dev'
imagePullPolicy: Always
name: billbear-book-client
imagePullSecrets:
- name: aliyun-shanghai
Ingress TLS 配置
spec:
ingressClassName: nginx
rules:
- host: xxx.com
http:
paths:
- backend:
service:
name: xxx-svc
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- xxx.com
secretName: secretName