K8S-ConfigMap实现应用和配置分离详解

 更新时间:2023年04月07日 08:55:55   作者:路由器没有路  
这篇文章主要为大家介绍了K8S-ConfigMap实现应用和配置分离详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

Kubernetes 是目前最流行的容器编排系统之一,它提供了丰富的功能来支持容器化应用程序的管理和部署。

ConfigMap 是 Kubernetes 中重要的资源对象,用于存储不敏感的配置信息并将其注入到 Pod 中。本文将介绍 ConfigMap 的创建方式和使用方法,并讨论其注意事项。

ConfigMap 背景

应用程序的运行可能会依赖一些配置,而这些配置又是可能会随着需求产生变化的,如果我们的应用程序架构不是应用和配置分离的,那么就会存在当我们需要去修改某些配置项的属性时需要重新构建镜像文件的窘境。

现在,ConfigMap组件可以很好的帮助我们实现应用和配置分离,避免因为修改配置项而重新构建镜像。 ConfigMap 用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap 跟 Secret 很类似,但它可以更方便地处理不包含敏感信息的字符串。

ConfigMap 创建方式

ConfigMap 可以通过多种方式创建,包括:

  • 命令行工具 kubectl

可以使用 kubectl create configmap 命令从文件或文本创建 ConfigMap。

例如,以下命令将名为 my-config 的 ConfigMap 从文件创建:

kubectl create configmap my-config --from-file=config.properties
  • 声明式 YAML 文件

可以使用声明式 YAML 文件定义 ConfigMap 对象。

例如,以下 YAML 定义了一个名为 my-config 的 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  DB_USERNAME: admin
  DB_PASSWORD: password123
  • 配置自动加载

在 Kubernetes 中,可以使用特定的挂载点来自动加载 ConfigMap 作为环境变量或卷。

这可以通过 Pod 中的 Volume 和环境变量实现。例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      env:
        - name: DB_USERNAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_USERNAME
  volumes:
    - name: config-volume
      configMap:
        name: my-config

ConfigMap 的使用

在 Kubernetes 中,有三种主要方式可以将 ConfigMap 注入到 Pod 中。

  • 定义成环境变量

在 Pod 中,可以将 ConfigMap 数据注入到容器的环境变量中。假设已经创建了一个名为 my-config 的 ConfigMap,包含以下数据:

DB_USERNAME=admin
DB_PASSWORD=password123

可以通过定义环境变量引用 ConfigMap 的键来将该数据注入到容器中。例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      env:
        - name: DB_USERNAME
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_USERNAME
        - name: DB_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: DB_PASSWORD
  • 使用卷

另一种常见的方法是将 ConfigMap 数据作为文件或目录挂载到容器中。假设已经创建了一个名为 my-config 的 ConfigMap,包含以下数据:

config.properties:
  server.port=8080
  database.url=jdbc:mysql://localhost/mydb

则可以使用以下 YAML 定义一个 Pod,将 ConfigMap 作为 Volume 挂载到容器中:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-config

在容器内,可以使用与卷相同的路径来访问 ConfigMap 中的数据。

  • 自定义全局参数

还可以将 ConfigMap 数据作为自定义全局参数传递给 Kubernetes 对象,如 Deployment。

例如,以下 YAML 定义了一个 Deployment,其中参数可以通过 ConfigMap 设置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: my-image
          command: ["/bin/myapp"]
          args: ["--config=/etc/myapp/config.json"]
          env:
            - name: MY_APP_ENV
              value: "production"
          volumeMounts:
            - name: config-volume
              mountPath: /etc/myapp/
      volumes:
        - name: config-volume
          configMap:
            name: my-config

在此示例中,我们通过 ConfigMap 将 myapp 的配置文件传递给容器,并将环境设置为 production。

使用 ConfigMap 的注意事项

ConfigMap 是 Kubernetes 中非常有用的功能,但要正确使用它需要注意以下几点:

  • 避免包含敏感信息

由于 ConfigMap 存储在明文中,因此不应该将其中包含敏感信息,例如密码或密钥等。这些信息应该以其他安全方式存储和管理,例如 Kubernetes 的 Secret 对象。

  • 注意 ConfigMap 与容器之间的同步性

如果在 ConfigMap 中更改了数据,Pod 中的容器可能无法及时获得更改的信息。这可以通过将 Pod 设置为重新启动或在运行时重新加载 ConfigMap 来解决。

  • 指定必须存在的键

如果在容器中引用 ConfigMap 的不存在密钥,则容器将无法启动。因此,建议在 YAML 文件中定义 ConfigMap 时指定必须存在的键。

  • 存储 ConfigMap 在默认 namespace 下可能会产生问题

如果 ConfigMap 存储在默认命名空间中,则在另一个命名空间中使用 ConfigMap 时可能会出现问题。因此,建议将 ConfigMap 存储在自己的命名空间中。

总结

ConfigMap 是 Kubernetes 中重要的资源对象,可以存储不敏感的配置信息并将其注入到 Pod 中。

本文介绍了 ConfigMap 的创建方式和使用方法,并讨论了其注意事项。正确地使用 ConfigMap 可以大大简化应用程序的管理和部署,提高可靠性和安全性,更多关于K8S ConfigMap应用配置分离的资料请关注脚本之家其它相关文章!

相关文章

  • K8s实战教程之容器和 Pods资源分配问题

    K8s实战教程之容器和 Pods资源分配问题

    这篇文章主要介绍了K8s实战教程之容器和 Pods资源分配,本篇文章通过配置集群中运行的容器的 CPU 请求和限制,你可以有效利用集群上可用的 CPU 资源,通过将 Pod CPU 请求保持在较低水平,可以使 Pod 更有机会被调度,需要的朋友可以参考下
    2022-07-07
  • kubernetes需要默认的serviceaccount的原因解析

    kubernetes需要默认的serviceaccount的原因解析

    这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • 玩客云安装青龙面板实现京东签到薅羊毛功能

    玩客云安装青龙面板实现京东签到薅羊毛功能

    这篇文章主要介绍了玩客云安装青龙面板实现京东签到薅羊毛,本人准备的服务器就是玩客云,只需运行一些常用的 docker 容器就行,需要的朋友可以参考下
    2022-05-05
  • Spark三种属性配置方式详解

    Spark三种属性配置方式详解

    有时间还是多学习知识比较好,这篇文章主要介绍了Spark三种属性配置方式详解,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Linux安装Kubernetes(k8s)超详细教程

    Linux安装Kubernetes(k8s)超详细教程

    Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务,通过Kubernetes能够进行应用的自动化部署和扩缩容,这篇文章主要给大家介绍了关于Linux安装Kubernetes(k8s)的相关资料,需要的朋友可以参考下
    2024-07-07
  • 云原生技术kubernetes调度单位pod的使用详解

    云原生技术kubernetes调度单位pod的使用详解

    这篇文章主要介绍了云原生技术kubernetes调度单位pod的使用详解,帮助大家更好的理解和学习使用K8S,感兴趣的朋友可以了解下
    2021-03-03
  • 一文讲解如何获取k8s容器里运行的jar包

    一文讲解如何获取k8s容器里运行的jar包

    K8S是Google开源的容器集群管理系统,其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台,这篇文章主要给大家介绍了关于如何获取k8s容器里运行的jar包的相关资料,需要的朋友可以参考下
    2022-09-09
  • K8S中五种控制器的介绍以及使用

    K8S中五种控制器的介绍以及使用

    这篇文章主要给大家介绍了关于K8S中五种控制器及使用的相关资料,控制器 又称之为工作负载,本文通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • k8s部署ingress-nginx的详细步骤大全

    k8s部署ingress-nginx的详细步骤大全

    nginx一般是作为服务的入口,其在kubernetes的部署方式也大致相似,这篇文章主要给大家介绍了关于k8s部署ingress-nginx的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 解决k8s namespace 一直处于 Terminating 状态的问题

    解决k8s namespace 一直处于 Terminating 状态的问题

    这篇文章主要介绍了k8s namespace 一直处于 Terminating 状态的解决方法,以下的 tool 为 Terminating 状态的 namespace,下面相关的一些操作记得将 tool 修改成自己的 namespace 名称,需要的朋友可以参考下
    2022-10-10

最新评论