K8S | Config应用配置

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 不论是应用还是运行层面的配置,都会涉及到一个基本的逻辑:配置可以抽取出来单独管理,在流程中直接引入该配置即可;

绕不开的Config配置;

一、背景

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

1.png

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

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

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

二、ConfigMap

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

1、创建

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-map
  namespace: default
data:
  active: test
  started: hello
  program: world

创建【ConfigMap】

kubectl apply -f app-config-map.yaml

查看【ConfigMap】

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

K8S界面查看【ConfigMap】

2.png

2、使用

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

apiVersion: v1
kind: Pod
metadata:
  name: auto-client-one
spec:
  containers:
    - name: auto-client
      image: auto-client:1.1.3
      imagePullPolicy: Never
      ports:
        - containerPort: 8079
      env:
        - name: DATA_ACTIVE
          valueFrom:
            configMapKeyRef:
              name: app-config-map
              key: active
        - name: DATA_STARTED
          valueFrom:
            configMapKeyRef:
              name: app-config-map
              key: started
        - name: DATA_PROGRAM
          valueFrom:
            configMapKeyRef:
              name: app-config-map
              key: program

创建【Pod】

kubectl create -f auto-client-one.yaml

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

apiVersion: v1
kind: Pod
metadata:
  name: auto-client-two
spec:
  containers:
    - name: auto-client
      image: auto-client:1.1.3
      imagePullPolicy: Never
      ports:
        - containerPort: 8079
      envFrom:
        - configMapRef:
            name: app-config-map

查看环境变量

# 1、执行该命令
kubectl exec -it auto-client-one -- bash

# 2、输入命令:env
env

# 3、打印的环境变量,只留下【app-config-map】配置的参数

DATA_ACTIVE=test
DATA_PROGRAM=world
DATA_STARTED=hello

# 4、查看【DATA_STARTED】的变量值
echo $DATA_STARTED

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

@Component
public class PrintEnvJob {
   
   

    private static final Logger LOG = LoggerFactory.getLogger(PrintEnvJob.class.getName()) ;

    @Scheduled(fixedDelay = 60000)
    public void systemData () {
   
   
        Map<String,String> envMap = System.getenv();
        for (Map.Entry<String, String> entry:envMap.entrySet()){
   
   
            String key = entry.getKey();
            String value = entry.getValue();
            LOG.info("【key:{},value:{}】",key,value);
        }
    }
}

【auto-client-one】日志输出

3.png

【auto-client-two】日志输出

4.png

注意事项

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

三、Secret

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

1、创建

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

5.png

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

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

2、使用

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auto-client-deployment
  labels:
    app: auto-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auto-client
  template:
    metadata:
      labels:
        app: auto-client
    spec:
      imagePullSecrets:
        - name: cloud-registry-secret
      containers:
        - name: auto-client
          image: 【仓库地址】/auto-client:1.1.3
          imagePullPolicy: Always
          ports:
            - containerPort: 8079

注意事项

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

四、Pod与容器

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: auto-client-rs-deployment
  labels:
    app: auto-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auto-client
  template:
    metadata:
      labels:
        app: auto-client
    spec:
      containers:
        - name: auto-serve
          image: auto-client:1.1.3
          imagePullPolicy: Never
          ports:
            - containerPort: 8079
          resources:
            requests:
              cpu: "250m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "256Mi"

注意事项

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

五、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note

脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5天前
|
弹性计算 Kubernetes 安全
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
26 8
|
13天前
|
Kubernetes Go 网络安全
Kubernetes 中使用consul-template渲染配置
Kubernetes 中使用consul-template渲染配置
25 1
Kubernetes 中使用consul-template渲染配置
|
11天前
|
Kubernetes Cloud Native API
自动扩缩容:Kubernetes Autoscaler的神奇魔法,让你的应用在云海中遨游!
【8月更文挑战第8天】在云原生环境中,容器化与微服务架构普及的同时,应用管理复杂度也随之提升。自动扩缩容作为解决资源动态调整的关键技术,可根据负载变化自动增减资源,从而优化成本和性能。本文以Kubernetes为例,介绍其Autoscaler组件如HPA如何基于CPU使用率等指标自动调整Pod数量,并探讨如何利用自定义指标实现更灵活的自动扩缩容策略,以满足现代应用的弹性需求。
34 9
|
5天前
|
Kubernetes Cloud Native API
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
Kubernetes云原生问题之Kubernetes帮助业务应用较少关注底层基础设施差异如何解决
19 1
|
7天前
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
10天前
|
Kubernetes 网络协议 Python
运维开发.Kubernetes探针与应用
运维开发.Kubernetes探针与应用
31 2
|
11天前
|
存储 Kubernetes 网络安全
[k8s]使用nfs挂载pod的应用日志文件
[k8s]使用nfs挂载pod的应用日志文件
|
16天前
|
弹性计算 运维 负载均衡
基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
【8月更文挑战第3天】基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
|
19天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:Kubernetes在微服务架构中的应用Python编程之旅:从基础到进阶
【7月更文挑战第31天】随着云计算技术的迅猛发展,云原生概念应运而生,它代表了一种构建和运行应用程序的全新方式。本文将通过实际代码示例,深入探讨Kubernetes这一云原生关键技术如何在微服务架构中发挥其强大的作用。我们将从容器化开始,逐步过渡到Kubernetes集群的搭建与管理,最后展示如何部署和管理一个微服务应用。
32 2
|
5天前
|
Kubernetes 容器
Kubernetes(K8S) 配置静态资源服务
Kubernetes(K8S) 配置静态资源服务
14 0