Kubernetes基于ConfigMap实现配置分离_k8 配置和程序分离-程序员宅基地

技术标签: kubernetes  配置分离  ConfigMap  K8S  Kubernetes  

1 创建ConfigMap

1.1 使用命令的方式创建

1.1.1 通过文字值创建ConfigMap

  • 创建语法:使用命令参数 --from-literal=key=value 定义一个配置项,可以定义一个或多个配置项。配置项中的 key 会成为 ConfigMap 中的 key,配置项中的 value 会成为 ConfigMap 中的 value。

    kubectl create configmap configmap_name --from-literal=key1=value1 --from-literal=key2=value2
    
  • 创建示例:

    kubectl create configmap cm1 --from-literal=username=admin --from-literal=password=123456
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap cm1 -o yaml
    

    在这里插入图片描述

1.1.2 通过目录创建ConfigMap

  • 创建语法:使用命令参数 --from-file=dir 定义一个配置项,可以定义一个或多个配置项。dir 目录下的文件的名称会成为 ConfigMap 中的 key,dir 目录下的文件的内容会成为 ConfigMap 中的 value。

    kubectl create configmap configmap_name --from-file=dir1 --from-file=dir2
    
  • 创建示例:

    kubectl create configmap cm2 --from-file=config
    
    # config/application-dev.yml
    env: dev
    msg: dev profile
    
    # config/application-test.yml
    env: test
    msg: test profile
    
    # config/application-prod.yml
    env: prod
    msg prod profile
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap cm2 -o yaml
    

    在这里插入图片描述

1.1.3 通过文件创建ConfigMap

  • 创建语法:使用命令参数 --from-file=file 定义一个配置项,可以定义一个或多个配置项。file 文件的名称会成为 ConfigMap 中的 key,file 文件的内容会成为 ConfigMap 中的 value。

    kubectl create configmap configmap_name --from-file=file1 --from-file=file2
    
  • 创建示例:

    kubectl create configmap cm3 --from-file=application-dev.yml --from-file=application-test.yml
    
    # config/application-dev.yml
    env: dev
    msg: dev profile
    
    # config/application-test.yml
    env: test
    msg: test profile
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap cm3 -o yaml
    

    在这里插入图片描述

1.1.4 通过配置文件创建ConfigMap

  • 创建语法:使用命令参数 --from-env-file=file 定义配置项,如果定义了多个配置项,则只有最后一个配置项生效。file 文件的内容的每一行都必须是 key=value 的形式,file 文件中每行的 key 会成为 ConfigMap 中的 key,file 文件中每行的 value 会成为 ConfigMap 中的 value。

    kubectl create configmap configmap_name --from-env-file=file
    
  • 创建示例:

    kubectl create configmap cm4 --from-env-file=application.properties
    
    # application.properties
    username=admin
    password=123456
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap cm4 -o yaml
    

    在这里插入图片描述

1.2 使用声明的方式创建

1.2.1 创建简单的ConfigMap

  • 配置文件:创建一个名称为 simple-cm-demo.yaml 的配置文件,内容如下所示。使用该配置文件创建的 ConfigMap 与 1.1.1节或1.1.4节中的方式创建的 ConfigMap 的形式一致。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: simple-cm
    data:
      username: admin
      password: "123456"
    
  • 创建命令:

    kubectl apply -f simple-cm-demo.yaml
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap simple-cm -o yaml
    

    在这里插入图片描述

1.2.2 创建复杂的ConfigMap

  • 配置文件:创建一个名称为 complex-cm-demo.yaml 的配置文件,内容如下所示。使用该配置文件创建的 ConfigMap 与 1.1.2节或1.1.3节中的方式创建的 ConfigMap 的形式一致。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: complex-cm
    data:
      application-dev.yml: |
        env: dev
        msg: dev profile
      application-test.yml: |
        env: test
        msg: test profile
    
  • 创建命令:

    kubectl apply -f complex-cm-demo.yaml
    
  • 创建结果:执行以下命令,即可查看到创建结果如下图所示。

    kubectl get configmap complex-cm -o yaml
    

    在这里插入图片描述

2 使用ConfigMap

2.1 通过环境变量的方式使用ConfigMap

2.1.1 使用单个ConfigMap中的数据定义容器环境变量

  • 配置文件:创建一个名称为 single-cm-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 env-cm 的ConfigMap,并把其中的 DEPLOYMENT_ENV:test 配置项以环境变量的形式传给名称为 single-cm-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: env-cm
    data:
      DEPLOYMENT_ENV: test
      
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: single-cm-deployment
      labels:
        app: single-cm
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: single-cm
      template:
        metadata:
          labels:
            app: single-cm
        spec:
          containers:
            - name: test-container
              image: my-app:latest
              imagePullPolicy: IfNotPresent
              args: ["--spring.profiles.active=$(DEPLOYMENT_ENV_KEY)"]
              ports:
                - containerPort: 8080
              env:
                - name: DEPLOYMENT_ENV_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: env-cm
                      key: DEPLOYMENT_ENV
    
  • 部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f single-cm-demo.yaml
    
  • 部署结果:该 Deployment 中接收一个名称为 spring.profiles.active 的命令行参数,而传给该命令行参数的值则为名称为 DEPLOYMENT_ENV_KEY 的环境变量的值,即实际传的值为 test,由于该配置文件中使用的镜像 my-app:latest 是一个Spring Boot 程序应用,所以通过这个环境变量即是指定使用 test 配置环境来启动该应用时。

2.1.2 使用多个ConfigMap中的数据定义容器环境变量

  • 部署文件:创建一个名称为 multi-cm-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了两个名称分别为 app-cmlog-cm 的ConfigMap,并把其中的 APPLICATION_NAME: smart-classroom 配置项 和 LOG_LEVEL: INFO 配置项以环境变量的形式传给名称为 multi-cm-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: app-cm
    data:
      APPLICATION_NAME: SMART-CLASSROOM
    
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: log-cm
    data:
      LOG_LEVEL: INFO
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: multi-cm-deployment
      labels:
        app: multi-cm
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: multi-cm
      template:
        metadata:
          labels:
            app: multi-cm
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "echo $(APPLICATION_NAME_KEY) $(LOG_LEVEL_KEY)" ]
              env:
                - name: APPLICATION_NAME_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: app-cm
                      key: APPLICATION_NAME
                - name: LOG_LEVEL_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: log-cm
                      key: LOG_LEVEL
    
  • 部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f multi-cm-demo.yaml
    
  • 部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出名称分别为 APPLICATION_NAME_KEYLOG_LEVEL_KEY 的环境变量的值,即会打印出以下结果。

    SMART-CLASSROOM INFO
    

    在这里插入图片描述

2.1.3 将ConfigMap中的所有键值对配置为容器环境变量

  • 部署文件:创建一个名称为 one-cm-multi-key-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 db-cm 的 ConfigMap,并把其中的所有配置项以环境变量的形式传给名称为 one-cm-multi-key-deployment 的 Deployment。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: db-cm
    data:
      HOST: 127.0.0.1
      PORT: "3306"
      USERNAME: admin
      PASSWORD: "123456"
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: one-cm-multi-key-deployment
      labels:
        app: one-cm-multi-key
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: one-cm-multi-key
      template:
        metadata:
          labels:
            app: one-cm-multi-key
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "env" ]
              envFrom:
                - configMapRef:
                    name: db-cm
    
  • 部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f one-cm-multi-key-demo.yaml
    
  • 部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出所有环境变量的名称和值,即打印结果中会包含以下内容。

    HOST=127.0.0.1
    PORT=3306
    USERNAME=admin
    PASSWORD=123456
    

    在这里插入图片描述

2.2 通过挂载的方式使用ConfigMap

2.2.1 不指定挂载的文件路径

  • 部署文件:创建一个名称为 mount-no-path-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 mount-no-path-cm 的 ConfigMap,并把其中的所有配置项以挂载的形式挂载到了名称为 mount-no-path-deployment 的 Deployment的 /etc/config 目录下,即在 /etc/config 目录下会生成一个 log.config 文件和一个 db.config 文件

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mount-no-path-cm
    data:
      log.config: |
        LOG_LEVER: INFO
        LOG_FILE: /var/logs/test.log
      db.config: |
        HOST: 127.0.0.1
        PORT: "3306"
        USERNAME: admin
        PASSWORD: "123456"
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mount-no-path-deployment
      labels:
        app: mount-no-path
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mount-no-path
      template:
        metadata:
          labels:
            app: mount-no-path
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "/bin/sh", "-c", "ls /etc/config/ && echo --- && cat /etc/config/log.config && echo --- && cat /etc/config/db.config" ]
              volumeMounts:
                - name: mount-no-path-volume
                  mountPath: /etc/config
          volumes:
            - name: mount-no-path-volume
              configMap:
                name: mount-no-path-cm
    
  • 部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f mount-no-path-demo.yaml
    
  • 部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出 /etc/config 目录下的所有文件和子目录列表,并且会打印出 /etc/config/log.config 文件和 /etc/config/db.config 文件的内容,结果如下图所示。在这里插入图片描述

2.2.2 指定挂载的文件路径

  • 部署文件:创建一个名称为 mount-path-demo.yaml 的配置文件,内容如下所示。该配置文件中定义了一个名称为 mount-path-cm 的 ConfigMap,并把其中的两个配置项以挂载的形式分别挂载到了名称为 mount-no-path-deployment 的 Deployment的 /etc/config 目录下的 log/log.config 文件和 db/db.config 文件,即在 /etc/config 目录下会生成一个 log/log.config 文件和一个 db/db.config 文件

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mount-path-cm
    data:
      log.config: |
        LOG_LEVER: INFO
        LOG_FILE: /var/logs/test.log
      db.config: |
        HOST: 127.0.0.1
        PORT: "3306"
        USERNAME: admin
        PASSWORD: "123456"
      
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mount-path-deployment
      labels:
        app: mount-path
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mount-path
      template:
        metadata:
          labels:
            app: mount-path
        spec:
          containers:
            - name: test-container
              image: busybox:latest
              imagePullPolicy: IfNotPresent
              command: [ "/bin/sh", "-c", "ls /etc/config/ && echo --- && cat /etc/config/log/log.config && echo --- && cat /etc/config/db/db.config" ]
              volumeMounts:
                - name: mount-path-volume
                  mountPath: /etc/config
          volumes:
            - name: mount-path-volume
              configMap:
                name: mount-path-cm
                items: 
                - key: log.config
                  path: log/log.config
                - key: db.config
                  path: db/db.config
    
  • 部署配置:执行以下命令即可使用该部署文件进行部署。

    kubectl apply -f mount-path-demo.yaml
    
  • 部署结果:该 Deployment 会在创建的 POD 内部的日志中打印出 /etc/config 目录下的所有文件和子目录列表,并且会打印出 /etc/config/log/log.config 文件和 /etc/config/db/db.config 文件的内容,结果如下图所示。在这里插入图片描述

3 实战ConfigMap

3.1 实战准备

3.1.1 创建Spring Boot项目

  • 创建项目:创建一个名称为 k8s-configmap 的 Spring Boot 项目,项目结构如下图所示:
    在这里插入图片描述

  • pom文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.2.6.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.k8s.configmap</groupId>
    	<artifactId>k8s-configmap</artifactId>
    	<version>1.0.0-SNAPSHOT</version>
    	<name>k8s-configmap</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
  • K8sConfigmapApplication文件内容:

    package com.k8s.configmap;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class K8sConfigmapApplication {
          
    
    	public static void main(String[] args) {
          
    		SpringApplication.run(K8sConfigmapApplication.class, args);
    	}
    
    }
    
  • ConfigController:

    package com.k8s.configmap.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    public class ConfigController {
          
    
        @Value("${env}")
        private String env;
    
        @Value("${msg}")
        private String msg;
    
        @GetMapping("/config")
        public Map<String, Object> getConfig() {
          
            Map<String, Object> config = new HashMap<>();
            config.put("env", env);
            config.put("msg", msg);
            return config;
        }
    
    }
    
  • application.yaml文件内容:

    server:
      port: 8080
    
    spring:
      profiles:
        active: dev
    
  • application-dev.yaml文件内容:

    env: dev
    msg: dev profile
    
  • application-test.yaml文件内容:

    env: test
    msg: test profile
    
  • 运行并访问项目:在本地运行该项目,并在浏览器中访问以下地址,结果如下图所示,可以看出本地直接启动该项目时,使用的是 application-dev.yaml 这个配置文件。
    在这里插入图片描述

3.1.2 构建Docker镜像

  • 项目打包:把项目打包成 Jar 包(方法请百度),并把生成的 Jar 包复制到安装有 Docker 环境的 Linux 操作系统中,本文生成的 Jar 包的名称为 k8s-configmap.jar 。

  • Dockerfile文件:在 Linux 操作系统中 k8s-configmap.jar 文件的同一级目录中,创建一个名称为 Dockerfile 的文件,文件内容如下所示。

    FROM openjdk:8
    EXPOSE 8080
    COPY ./k8s-configmap.jar  app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    
  • 构建镜像:在 Linux 操作系统的命令行工具中,切换到 Dockerfile 文件所在的目录,并执行以下命令,即可构建 Docker 镜像。

    docker build -t k8s-configmap:latest .
    
  • 推送或复制镜像:如果有可推送的镜像仓库,可以把上一步中构建的 k8s-configmap:latest 镜像推送到自己的镜像仓库中,如果没可推送的镜像仓库,则需要提前把上一步中构建的 k8s-configmap:latest 镜像导入到 K8S 集群的所有的 worker 节点中。注意:由于本文没有可推送的镜像仓库,所以选择后面一种方式,把构建的镜像导入到了 K8S 集群的所有的 worker 节点中。

3.1.3 Spring Boot项目加载配置文件的顺序

  • 情况说明:Spring Boot项目在启动时,可以通过命令行参数 spring.config.location 指定配置文件的路径,如果通过命令行参数指定了配置文件的路径,则优先加载指定路径的配置文件。如果没有通过命令行参数 spring.config.location 指定配置文件的路径,则按照优先级高低依次从四个位置加载配置文件。

  • 加载顺序:在没有通过命令行参数 spring.config.location 指定配置文件的路径的情况下,Spring Boot项目优先从项目根目录下的 config 目录中加载配置文件;如果项目根目录下的 config 目录中没有配置文件,则从项目根目录下加载配置文件;如果项目根目录下也没有配置文件,则从项目 resources 目录下的 config 目录中加载配置文件;如果项目 resources 目录下的 config 目录中也没有配置文件,则从项目 resources 目录下加载配置文件。 四种加载位置的优先级如下图所示。
    在这里插入图片描述

3.2 通过环境变量控制Spring Boot项目的配置文件

3.2.1 实战说明

  • 实战说明:本小节示例要实现通过把 ConfigMap 中的配置项设置成环境变量,并把环境变量以命令行参数的形式传给创建的 Pod 内的镜像,以指定项目启动时使用指定的配置环境的目的。

3.2.2 创建部署文件

  • 部署文件:在 K8S 集群的 Master 节点中创建一个名称为 env-config-app.yaml 的配置文件,内容如下所示。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: env-config-cm
    data:
      DEPLOYMENT_ENV: test
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: env-config-deployment
      labels:
        app: env-config
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: env-config
      template:
        metadata:
          labels:
            app: env-config
        spec:
          containers:
            - name: env-config-container
              image: k8s-configmap:latest
              imagePullPolicy: IfNotPresent
              args: ["--spring.profiles.active=$(DEPLOYMENT_ENV_KEY)"]
              ports:
                - containerPort: 8080
              env:
                - name: DEPLOYMENT_ENV_KEY
                  valueFrom:
                    configMapKeyRef:
                      name: env-config-cm
                      key: DEPLOYMENT_ENV
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: env-config-service
      labels:
        app: env-config
    spec:
      selector:
        app: env-config
      type: NodePort
      ports:
        - protocol: TCP
          port: 8081
          targetPort: 8080
          nodePort: 30001
    
  • 文件说明:上述部署文件中先是定义了一个名为 env-config-cm 的 ConfigMap ,其中定义了一个名称为 DEPLOYMENT_ENV 值为 test 的配置项。然后定义了一个名称为 env-config-deployment 的 Deployment,其中使用前面构建的 k8s-configmap:latest 镜像创建 Pod,并且把 env-config-cm 这个 ConfigMap 中的 DEPLOYMENT_ENV 配置项的值以命令行参数的形式传给了Pod中的镜像,并且是传给了 spring.profiles.active 这个命令行参数,因此是指定使用 application-test.yaml 这个环境配置文件来启动项目。然后定义了一个名称为 env-config-service 的 Service,其中指定使用 NodePort 的形式把宿主机的 30001 端口映射到Pod中的容器的 8080 端口,即通过访问宿主机的 30001 端口即可访问创建的 Pod

3.2.3 部署项目

  • 执行部署:在 K8S 集群的 Master 节点中执行以下命令,即可部署项目,以及查看部署结果,执行结果如下图所示。

    # 执行部署
    kubectl apply -f env-config-app.yaml
    
    # 查看生成的 Pod
    kubectl get pods -o wide
    
    # 查看生成的 Service
    kubectl get service -o wide
    

    在这里插入图片描述

3.2.4 访问项目

  • 访问项目:由于使用 NodePort 的方式,把宿主机的 30001 端口映射到了生成的 Pod 内容器的 8080 端口,因此可以通过在浏览器中访问 宿主机IP地址:30001/config ,即可访问项目中的接口,由于本文宿主机的IP地址是 192.168.1.169,所以访问地址和访问结果如下所示。

    http://192.168.1.169:30001/config
    

    在这里插入图片描述

  • 结果说明:从接口的返回信息可以看出,该项目部署的时候使用的是 application-test.yaml 配置文件,因为达到了通过把 ConfigMap 中的配置项 (DEPLOYMENT_ENV) 设置成环境变量 (DEPLOYMENT_ENV_KEY),并把环境变量的值 (test) 传给命令行参数 (spring.profiles.active) 的形式实现了使用指定的配置文件的目的。

3.3 通过文件挂载控制Spring Boot项目的配置文件

3.3.1 实战说明

  • 实战说明:本小节示例要实现通过把 ConfigMap 中的配置文件添加到数据卷中,并把数据卷中的文件挂载到创建的 Pod 的容器内部,然后通过命令行参数指定项目启动的配置文件,以达到Spring Boot项目启动时使用外部的配置文件的目的。

3.3.2 创建部署文件

  • 部署文件:在 K8S 集群的 Master 节点中创建一个名称为 mount-config-app.yaml 的配置文件,内容如下所示。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mount-config-cm
    data:
      application-prod.yaml: |
        env: prod
        msg: prod profile
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mount-config-deployment
      labels:
        app: mount-config
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mount-config
      template:
        metadata:
          labels:
            app: mount-config
        spec:
          containers:
            - name: mount-config-container
              image: k8s-configmap:latest
              imagePullPolicy: IfNotPresent
              args: ["--spring.config.location=/etc/config/application.yaml"]
              ports:
                - containerPort: 8080
              volumeMounts:
                - name: mount-config-volume
                  mountPath: /etc/config
          volumes:
            - name: mount-config-volume
              configMap:
                name: mount-config-cm
                items:
                  - key: application-prod.yaml
                    path: application.yaml
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mount-config-service
      labels:
        app: mount-config
    spec:
      selector:
        app: mount-config
      type: NodePort
      ports:
        - protocol: TCP
          port: 8082
          targetPort: 8080
          nodePort: 30002
    
    
  • 文件说明:上述部署文件中先是定义了一个名为 mount-config-cm 的 ConfigMap ,其中定义了一个名称为 application-prod.yaml 的配置文件。然后定义了一个名称为 mount-config-deployment 的 Deployment,其中使用前面构建的 k8s-configmap:latest 镜像创建 Pod,并且把 mount-config-cm 这个 ConfigMap 中的 application-prod.yaml 配置文件的配置项全部添加到数据卷中的 application.yaml 文件中,然后把数据卷中的 application.yaml 文件挂载到创建的 Pod 的容器内部的 /etc/config 目录下,最后通过命令行参数 spring.config.location 指定容器启动时的配置文件为容器内部的 /etc/config/application.yaml 文件。然后定义了一个名称为 mount-config-service 的 Service,其中指定使用 NodePort 的形式把宿主机的 30002 端口映射到Pod中的容器的 8080 端口,即通过访问宿主机的 30002 端口即可访问创建的 Pod

3.3.3 部署项目

  • 执行部署:在 K8S 集群的 Master 节点中执行以下命令,即可部署项目,以及查看部署结果,执行结果如下图所示。

    kubectl apply -f mount-config-app.yaml
    
    kubectl get pods -o wide
    
    kubectl get service -o wide
    

    在这里插入图片描述

3.3.4 访问项目

  • 访问项目:由于使用 NodePort 的方式,把宿主机的 30002 端口映射到了生成的 Pod 内容器的 8080 端口,因此可以通过在浏览器中访问 宿主机IP地址:30002/config ,即可访问项目中的接口,由于本文宿主机的IP地址是 192.168.1.169,所以访问地址和访问结果如下所示。

    http://192.168.1.169:30002/config
    

    在这里插入图片描述

  • 结果说明:从接口的返回信息可以看出,该项目部署的时候使用的是 application-prod.yaml 配置文件,因此达到了通过把 ConfigMap 中的配置文件添加到数据卷,并把数据卷中的文件挂载到容器内部,然后通过命令行参数指定配置文件路径的形式实现了使用镜像外部的配置文件的目的。

3.4 两种方式的比较

3.4.1 环境变量方式

  • 优点:这种方式的优点是把多个配置文件都放在源码中,并和源码一起打包构建镜像,从而只需要使用一个简单的环境变量就可以指定项目启动时使用哪个配置文件,不需要把配置文件添加到ConfigMap中。

  • 缺点:这种方式的缺点是把配置文件打包到了镜像中,如果配置文件需要修改,则需要重新打包并构建镜像。此外,通过环境变量的形式无法实现项目配置热更新的效果,即 ConfigMap 被更新了之后,新的配置不会被项目应用,必需重新部署才可会使用新的配置文件。

  • 应用场景:这种方式适用于配置文件很少变化、且不要求配置文件热更新的情况。

3.4.2 文件挂载方式(推荐)

  • 优点:这种方式的优点是把配置文件放到了镜像外部,把项目和配置文件分离开来,使得构建的镜像是一个纯净的镜像,能够在任何环境中使用。而且,通过文件挂载的形式可以实现项目配置热更新的效果,即 ConfigMap 被更新了之后,新的配置会立即被项目应用,从而不需要重新部署即可达到修改配置文件的目的。

  • 缺点:这种方式的缺点是把配置文件放到了 ConfigMap 中,每次修改配置,都需要重新维护 ConfigMap。

  • 应用场景:这种方式适用于配置文件经常变化、且要求配置文件热更新的情况。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44516305/article/details/105774171

智能推荐

一文梳理金融风控建模全流程(Python)-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏31次。一、信贷风控简介 信贷风控是数据挖掘算法最成功的应用之一,这在于金融信贷行业的数据量很充足,需求场景清晰及丰富。信贷风控简单来说就是判断一个人借了钱后面(如下个月的还款日)会不会按期还钱。更专业来说,信贷风控是还款能力及还款意愿的综合考量,根据这预先的判断为信任依据进行放贷,以此大大提高了金融业务效率。与其他机器学习的工业场景不同,金融是极其厌恶风险的领域,其特殊性在于非..._建立一个量化风险预测模型。这是某金融机构的普惠贷款以及不良表现的数据

chatgpt赋能python:Python的sorted函数:介绍和使用方法_python的sorted如何提高比较精度-程序员宅基地

文章浏览阅读98次。在Python中,sorted()函数是一个内置函数。它可以用来对各种类型的数据集合进行排序。sorted()函数根据给定的键或值对数据进行排序,并返回排序后的结果。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体。_python的sorted如何提高比较精度

tampermonkey油猴+chrome,在浏览器中运行自己写的js脚本_油猴能篡改js-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏12次。前言最近再看犀牛书《JavaScript权威指南》,当中的小例子我发现自己没法调试它zzz,于是就想到把它嵌入到浏览器里面,主要是使用的油猴再加上自己的js脚本环境tampermonkey v4.6 油猴 ubuntu 18 chrome油猴添加脚本 点击这边的添加脚本,然后在界面的脚本页面中输入自己的脚本代码,就可以了。测试代码// ==UserSc..._油猴能篡改js

我的朋友佩德罗破解版下载|我的朋友佩德罗(My Friend Pedro)免安装绿色中文破解版下载_我的朋友佩德罗下载-程序员宅基地

文章浏览阅读3.9k次。点击下载来源:我的朋友佩德罗(My Friend Pedro)免安装绿色中文破解版我的朋友佩德罗(My Friend Pedro)是由Devolver Digital发行的一款款新颖有趣的第三人称射击游戏,玩家在游戏中获得更加强大的实力,轻松的击杀敌人。游戏开始,你会在香蕉的指引下开始杀手生涯,使用匕首、手枪、机枪等武器,通过跳跃、翻滚、减缓时间等动作,躲避敌人的射击,并将其消灭。整个游戏连贯..._我的朋友佩德罗下载

使用mJS进行物联网嵌入式脚本和开发的新方法-程序员宅基地

文章浏览阅读584次。在上一篇文章中 ,我谈到了IoT(物联网)以及将物理对象(“物”)连接到Internet。 我已经讨论了Mongoose OS (一种用于IoT的开源操作系统)如何使新手和专业开发人员都能轻松地使用JavaScript编程微控制器。 您可能想知道为什么使用JavaScript,以及JavaScript引擎如何装入微控制器的有限内存中。 有许多旨在将脚本编写在微控制器上的项目,其中包括其他J..._mjs javascript

基于Linux平台下分子建模软件的安装-程序员宅基地

文章浏览阅读213次。文档及视频资料下载地址:http://down.51cto.com/data/1149515附:Linux图形工作站下应用演示。_用于分子计算的linux

随便推点

人脸识别 | AI产品经理需要了解的CV通识(二)-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏4次。前言:本文作者@jasmine,是我们“AI产品经理大本营”成员,下面是她分享的第4篇文章,欢迎更多有兴趣“主动输出”的朋友们一起加入、共同进步:) 最近整理了CV方向的一些产品基础知识,我上一篇文章《看AI产品经理如何介绍“计算机视觉”(基于实战经验和案例)》算是这个系列的第一篇;本文是本系列下的第二篇,主要针对人脸识别进行梳理。后续还会有多目标跟踪、OCR等方向的内容。希望大家能从这个系列收获_关于人脸识别,qa质检

用ajax向后台传递数组乱码解决方法-程序员宅基地

文章浏览阅读1.3k次。var result = ['1','2','3'];$.ajax({type: "GET",url:"http://xxxxxxxx",data:{ groups:result, },dataType:'json', success: function (Json) { console.log("success")

bitmap算法 --位图算法_位图算法的实验思路-程序员宅基地

文章浏览阅读322次。bitmap算法 --位图算法位图不是像素图片,而是内存中连续的二进制位(bit),用于对大量整型数据做去重和查询例题:给定一块10bit的内存空间,想要依次插入整型数4,2,1,3解法:10bit每一位的的值为0,当插入4时,此时下标 4 的位置,bit值置为1,剩下三个数类似。。。应用:例:一个用户对应多个标签解法:思路逆转。一个标签对应多个用户1、建立用户名和用户ID的映射..._位图算法的实验思路

librealsense2及pyrealsense2安装_ubuntu安装librealsense2-程序员宅基地

文章浏览阅读5.8k次,点赞5次,收藏32次。librealsense2及pyrealsense2安装环境:重新安装的Ubuntu16.04,什么都没有 emmmmm1.安装包官方文档:https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md(1)sudo apt-key adv --keyserver keys.gnupg..._ubuntu安装librealsense2

java.lang.ArithmeticException: Rounding necessary-程序员宅基地

文章浏览阅读2.3w次,点赞2次,收藏3次。可能原因:对BigDecimal对象设置了精度,但是没有设置取舍方式,会报错java.lang.ArithmeticException: Rounding necessary。@Testpublic void testDecimal() { String str = "3.33333"; BigDecimal decimal = new BigDecimal(str); try {..._java.lang.arithmeticexception: rounding necessary

[论文笔记]端到端视觉定位 DA4AD: End-to-End Deep Attention-based Visual Localization for Autonomous Driving 2020_predicted iddt per position-程序员宅基地

文章浏览阅读1.4k次,点赞3次,收藏11次。百度自动驾驶部门注意力机制在视觉重定位任务中的应用,端到端网络,可用于明显外观变化的场景,cm级精度,优于基于激光雷达的定位方法。本文使用CNN以及注意力机制训练描述子与关键点,与数据库图像做匹配然后解算相机位姿。构建特征金字塔,使用全卷积网络 独立 提取密集特征。构建定位地图: attentive keypoints + features + 3D coordinates, 3D 坐标来自于激光雷达根据先验位姿找到附近的三维点,在先验位姿附近多次采样,根据这些位姿将三维点投影到当前图像中进._predicted iddt per position