K8S | Config应用配置

墨蓝 2024-03-23 18:53 121阅读 0赞

一、背景

在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多;

e723f04580b277b4da5695261331221b.png

应用环境:通常是指代码层面的依赖配置,以常用的Nacos来说,通常会涉及框架、组件、自定义等几个层面的配置管理;

运行环境:以微服务架构来说,实际环境中需要管理多个应用的服务发布,在整个过程中必然会存在很多配置的管理,比如应用的资源分配、不同环境交互时的身份认证、敏感信息的安全管理等;

不论是应用还是运行层面的配置,都会涉及到一个基本的逻辑:配置可以抽取出来单独管理,在流程中直接引入该配置即可;

二、ConfigMap

ConfigMap用来将非机密性的数据保存到键值对中,Pod可以将其用作环境变量、命令行参数或者存储卷中的配置文件,会将环境配置信息和容器镜像解耦,便于应用配置的修改;

1、创建

ConfigMap中data字段用来保存UTF-8字符串,binaryData用来保存二进制数据作为base64编码的字串;

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: app-config-map
  5. namespace: default
  6. data:
  7. active: test
  8. started: hello
  9. program: world

创建【ConfigMap】

  1. kubectl apply -f app-config-map.yaml

查看【ConfigMap】

  1. kubectl get cm/app-config-map -o yaml

K8S界面查看【ConfigMap】

2882c8e3da0e28c6dfc164ead4597aad.png

2、使用

用法一:使用「app-config-map」中的值来配置【Pod】,在env中定义多个环境变量,但是值从ConfigMap中读取;

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: auto-client-one
  5. spec:
  6. containers:
  7. - name: auto-client
  8. image: auto-client:1.1.3
  9. imagePullPolicy: Never
  10. ports:
  11. - containerPort: 8079
  12. env:
  13. - name: DATA_ACTIVE
  14. valueFrom:
  15. configMapKeyRef:
  16. name: app-config-map
  17. key: active
  18. - name: DATA_STARTED
  19. valueFrom:
  20. configMapKeyRef:
  21. name: app-config-map
  22. key: started
  23. - name: DATA_PROGRAM
  24. valueFrom:
  25. configMapKeyRef:
  26. name: app-config-map
  27. key: program

创建【Pod】

  1. kubectl create -f auto-client-one.yaml

用法二:在【Pod】配置中,直接使用envFrom引入「app-config-map」,从而完成环境变量的设置;

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: auto-client-two
  5. spec:
  6. containers:
  7. - name: auto-client
  8. image: auto-client:1.1.3
  9. imagePullPolicy: Never
  10. ports:
  11. - containerPort: 8079
  12. envFrom:
  13. - configMapRef:
  14. name: app-config-map

查看环境变量

  1. # 1、执行该命令
  2. kubectl exec -it auto-client-one -- bash
  3. # 2、输入命令:env
  4. env
  5. # 3、打印的环境变量,只留下【app-config-map】配置的参数
  6. DATA_ACTIVE=test
  7. DATA_PROGRAM=world
  8. DATA_STARTED=hello
  9. # 4、查看【DATA_STARTED】的变量值
  10. echo $DATA_STARTED

在【auto-client:1.1.3】容器镜像中,添加了一个输出环境变量的定时任务,通过查看运行日志,可以看到相关配置会被代码正确读取;

  1. @Component
  2. public class PrintEnvJob {
  3. private static final Logger LOG = LoggerFactory.getLogger(PrintEnvJob.class.getName()) ;
  4. @Scheduled(fixedDelay = 60000)
  5. public void systemData () {
  6. Map<String,String> envMap = System.getenv();
  7. for (Map.Entry<String, String> entry:envMap.entrySet()){
  8. String key = entry.getKey();
  9. String value = entry.getValue();
  10. LOG.info("【key:{},value:{}】",key,value);
  11. }
  12. }
  13. }

【auto-client-one】日志输出

8166e141a467c612371eaa329e2f7072.png

【auto-client-two】日志输出

cd67207f2cfaac9f3f10c646d933ae84.png

注意事项

  • ConfigMap在设计上不是用来保存大量数据的,因此保存的数据不可超过1MiB
  • ConfigMap并不提供保密或者加密功能,如果存储的数据是机密的,可以使用Secret对象,或者使用其它方式确保数据的私密性;
  • ConfigMap中可以通过将immutable字段设置为true创建不可变更的配置,如果要修改只能删除后重建;

三、Secret

Secret是一种包含少量敏感信息例如密码、令牌或密钥的对象,这样的信息可能会被放在Pod规约中或者镜像中,使用Secret意味着不需要在应用程序代码中包含敏感数据;

1、创建

将【auto-client:1.1.3】镜像推送到云端的docker私有仓库里,并且删除本地相关镜像,测试下面的流程;

4cf20771e94ec2d846c1ea9a156092d9.png

这里以最常见的镜像拉取场景来说,通常容器镜像文件是放在私有的云端仓库,K8S在访问时需要提供身份证明,可以通过Secret配置来处理该场景;

  1. kubectl create secret docker-registry secret名称】 --docker-server=【仓库地址】 --docker-username=【用户名】 --docker-password=【密码】 --namespace=【命名空间】 -o yaml > cloud-registry-secret.yaml

2、使用

在上面配置了镜像拉取的Secret对象,在Pod层面使用imagePullSecrets来引用该对象,当从私有仓库拉取容器镜像时,节点上的kubelet能够完成与镜像仓库的身份认证;

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: auto-client-deployment
  5. labels:
  6. app: auto-client
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: auto-client
  12. template:
  13. metadata:
  14. labels:
  15. app: auto-client
  16. spec:
  17. imagePullSecrets:
  18. - name: cloud-registry-secret
  19. containers:
  20. - name: auto-client
  21. image: 【仓库地址】/auto-client:1.1.3
  22. imagePullPolicy: Always
  23. ports:
  24. - containerPort: 8079

注意事项

  • 默认情况下Secret未加密地存储在etcd中,任何拥有权限的用户都可以检索或修改Secret信息;
  • 每个Secret的大小最多为1MiB,施加这一限制是为了避免用户创建非常大的Secret,进而导致API服务器和kubelet内存耗尽;

四、Pod与容器

在定义Pod时可以选择性地为每个容器设定所需要的资源数量,最常见的可设定资源是CPU和内存大小,或者其他类型的资源,这样有利于调度器给Pod选择合适的节点;

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: auto-client-rs-deployment
  5. labels:
  6. app: auto-client
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: auto-client
  12. template:
  13. metadata:
  14. labels:
  15. app: auto-client
  16. spec:
  17. containers:
  18. - name: auto-serve
  19. image: auto-client:1.1.3
  20. imagePullPolicy: Never
  21. ports:
  22. - containerPort: 8079
  23. resources:
  24. requests:
  25. cpu: "250m"
  26. memory: "128Mi"
  27. limits:
  28. cpu: "500m"
  29. memory: "256Mi"

注意事项

  • CPU和内存统称为计算资源,计算资源的数量是可测量的,可以被请求、被分配、被消耗;
  • requests为容器指定资源需求,limits为容器设置资源限制;
  • 如果Pod运行所在节点有足够的可用资源,容器可以使用超出对应资源request属性所设置的资源量,但是不可以使用超出其资源limit属性所设置的资源量;

五、参考源码

  1. 文档仓库:
  2. https://gitee.com/cicadasmile/butte-java-note
  3. 脚本仓库:
  4. https://gitee.com/cicadasmile/butte-auto-parent

发表评论

表情:
评论列表 (有 0 条评论,121人围观)

还没有评论,来说两句吧...

相关阅读

    相关 K8S | Config应用配置

    一、背景 在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多; ![e723f0458