分布式环境中,基于负载、容错等需求的考虑,几乎所有的服务都需要在不同的机器节点上部署不止一个实例。随着程序日益复杂,程序的配置日益增多,而且配置文件的修改频率大于代码本身,这种情况下,有时候修改一个配置就不得不重新编译代码,分发上线。部署规则较大的场景中,是相当复杂、繁琐的

ConfigMap

作为分布式Kubernetes也提供了统一配置管理方案,基于ConfigMap对象实现了将配置文件从容器镜像中解耦,从而增强了容器应用的可移植性。

创建

  1. apiVersion: v1
  2. data:
  3. # K V 形式存储
  4. ca.crt: "xxxx"
  5. kind: ConfigMap
  6. metadata:
  7. name: kube-root-ca.crt
  8. namespace: base

环境变量使用

  1. env:
  2. - name: test
  3. valueFrom:
  4. configMapKeyRef:
  5. name: configmap_name
  6. key: map_key
  7. # 引用正哥文件
  8. envFrom:
  9. # 前缀
  10. - prefix: alibaba
  11. configMapRef:
  12. name: configmap_name
  13. optional: false

挂载存储卷使用

  1. volumes:
  2. - name: test
  3. configMap:
  4. # 导出全部文件
  5. name: configmap_name
  6. # 指定配置
  7. items:
  8. - key: xxx.conf
  9. path: xxxx.conf
  10. # 权限0-777
  11. mode: 0644

注意事项

  • 以存储卷引用的方式ConfigMap 时候必须先与Pod存在,否则导致Pod无法正常启动的错误
  • 当环境变量注入的ConfigMap中的键不存在时会被忽略
  • ConfigMap 的名称空间级的资源,因此Pod必须与其在同一个命名空间

Secret

与ConfigMap功能类似,但它专用与存放敏感数据,例如:密码、数字证书、秘钥、令牌 在Secret 里数据都使用Base64编码字符串存储

创建

  1. apiVersion: v1
  2. data:
  3. .dockerconfigjson: >-
  4. eyJhdXRocyI6eyJyZWdpc3RyeS12cGMuY24tc2hhbmdoYWkuYWxpeXVuY3MuY29tIjp7InVzZXJuYW1lIjoiaWQtYWx5QGJpbGxiZWFyLmNuIiwicGFzc3dvcmQiOiIyMDIwYmlsbGJlYXIuY24iLCJhdXRoIjoiYVdRdFlXeDVRR0pwYkd4aVpXRnlMbU51T2pJd01qQmlhV3hzWW1WaGNpNWpiZz09In19fQ==
  5. kind: Secret
  6. metadata:
  7. name: aliyun-shanghai
  8. namespace: base
  9. type: kubernetes.io/dockerconfigjson

环境变量使用

  1. env:
  2. - name: test
  3. valueFrom:
  4. secretKeyRef:
  5. key: secretKeyName_Key
  6. name: secretKeyName

挂载存储卷使用

  1. volumes:
  2. - name: volume-name
  3. secret:
  4. defaultMode: 420
  5. secretName: secretKeyName
  6. items:
  7. - key: xxx.conf
  8. path: xxxx.conf
  9. # 权限0-777
  10. mode: 0644

拉取镜像配置

  1. containers:
  2. image: 'registry-vpc.cn-shanghai.aliyuncs.com/shlx/billbear-book-client:dev'
  3. imagePullPolicy: Always
  4. name: billbear-book-client
  5. imagePullSecrets:
  6. - name: aliyun-shanghai

Ingress TLS 配置

  1. spec:
  2. ingressClassName: nginx
  3. rules:
  4. - host: xxx.com
  5. http:
  6. paths:
  7. - backend:
  8. service:
  9. name: xxx-svc
  10. port:
  11. number: 80
  12. path: /
  13. pathType: ImplementationSpecific
  14. tls:
  15. - hosts:
  16. - xxx.com
  17. secretName: secretName