【K8S专栏】Kubernetes应用配置管理(下)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【K8S专栏】Kubernetes应用配置管理

ConfigMap


ConfigMap和Serect类似,不同之处在于ConfigMap保存的数据信息是不需要加密的,比如一些应用的配置信息,其他的用法和Secret一样。

创建ConfigMap

同样,我们可以使用两种方式来创建ConfigMap:

  • 通过命令行方式,也就是kubectl create configmap;
  • 通过YAML文件方式;

通过命令创建ConfigMap

如果不熟悉ConfigMap对象的字段,可以通过kubectl explain configmap来查看,如果想查看创建configmap的示例,可以通过kubectl create configmap -h查看,如下:

Examples:
  # Create a new config map named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar
  # Create a new config map named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  # Create a new config map named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
  # Create a new config map named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar
  # Create a new config map named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env

从上面可以看出,创建ConfigMap可以从给定一个目录来创建。例如,我们定义了如下一些配置文件:

$ mkdir configmap-demo
$ cd configmap-demo
$ ll
total 8
-rw-r--r-- 1 root root 25 Sep  6 17:07 mysqld.conf
-rw-r--r-- 1 root root 25 Sep  6 17:07 redis.conf
$ cat mysqld.conf 
host=127.0.0.1
port=3306
$ cat redis.conf 
host=127.0.0.1
port=6379

然后使用一下命令来进行创建:

$ kubectl create configmap my-configmap --from-file=../configmap-demo/

然后通过一下命令查看创建完的configmap:

$ kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      21d
my-configmap       2      9s
$ kubectl describe cm my-configmap 
Name:         my-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>
Data
====
mysqld.conf:
----
host=127.0.0.1
port=3306
redis.conf:
----
host=127.0.0.1
port=6379
BinaryData
====
Events:  <none>

我们可以看到两个key对应的是文件的名字,value对应的是文件的内容。如果要看键值的话可以通过如下命令查看:

$ kubectl get configmap my-configmap -o yaml
apiVersion: v1
data:
  mysqld.conf: |
    host=127.0.0.1
    port=3306
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2022-07-25T09:20:43Z"
  name: my-configmap
  namespace: default
  resourceVersion: "667706"
  uid: 46cb52e9-0936-4934-9628-ac20efcfd893

当然,我们还可以通过文件来创建一个configmap,比如我们定义一个如下的配置文件:

$ cat nginx.conf 
user  nobody;
worker_processes  1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

然后通过如下命令创建一个nginx的configmap:

$ kubectl create configmap nginx-configmap --from-file=nginx.conf

查看创建后的信息:

$ kubectl get configmap nginx-configmap -o yaml
apiVersion: v1
data:
  nginx.conf: |
    user  nobody;
    worker_processes  1;
    error_log  logs/error.log;
    error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    pid        logs/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log  main;
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  65;
        gzip  on;
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2022-07-25T09:24:29Z"
  name: nginx-configmap
  namespace: default
  resourceVersion: "668283"
  uid: a025da28-6817-4605-8daf-375b676282c1

注:在一条命令中--from-file可以指定多次。

另外,通过帮助文档我们可以看到我们还可以直接使用字符串进行创建,通过--from-literal参数传递配置信息,同样的,这个参数可以使用多次,格式如下:

$ kubectl create configmap my-cm-daemo --from-literal=db.host=localhost --from-literal=db.port=3306

通过YAML创建ConfigMap

通过YAML文件创建就比较简单,我们可以参考上面输出的yaml信息,比如定义如下一个YAML文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-cm-daemon2
  labels:
    app: cm-daemon
data:
  redis.conf: |
    host=127.0.0.1
    port=6379

然后创建即可。

使用ConfigMap

ConfigMap中的配置数据可以通过如下方式进行使用:

  • 设置环境变量值
  • 在数据卷中创建config文件

通过环境变量使用ConfigMap

我们直接通过在pod.spec.containers.env.valueFrom.configMapKeyRef中引用ConfigMap即可,如下:

apiVersion: v1
kind: Pod
metadata:
  name: env-configmap
  labels:
    app: env-configmap-mysql
spec:
  containers:
  - name: test-configmap
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "env"
    env:
      - name: DB_HOST
        valueFrom:
          configMapKeyRef:
            name: my-cm-daemo
            key: db.host
      - name: DB_PORT
        valueFrom:
          configMapKeyRef:
            name: my-cm-daemo
            key: db.port
    envFrom:
      - configMapRef:
          name: my-cm-daemo

创建后,可以通过日志查看环境变量输出,如下:

$ kubectl logs env-configmap  | grep DB
DB_PORT=3306
DB_HOST=localhost

通过数据卷使用ConfigMap

基本原理和Secret一样。

在这里,通过指定pod.spec.volumes.configMap.name来指定ConfigMap,然后挂载到容器里,如下:

apiVersion: v1
kind: Pod
metadata:
  name: volume-configmap-test
spec:
  containers:
    - name: volume-configmap-test
      image: busybox
      command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-configmap

我们可以通过日志查看ConfigMap是否挂载进去了。

$ kubectl logs volume-configmap-test 
host=127.0.0.1
port=6379

我们也可以在ConfigMap值被映射的数据卷里去控制路径,如下:

apiVersion: v1
kind: Pod
metadata:
  name: volume-path-configmap
spec:
  containers:
    - name: volume-path-configmap-test
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/path/to/msyqld.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-configmap
        items:
        - key: mysqld.conf
          path: path/to/msyqld.conf

另外,当ConfigMap以数据卷的形式挂载进Pod的时,这时更新ConfigMap(或删掉重建ConfigMap),Pod内挂载的配置信息会热更新。虽然配置信息更新,应用到底能不能使用,主要还是依赖应用是否也会热更新。

总结

ConfigMap在实际中用的还是比较多,主要都是一些应用的配置文件,比如Nginx配置文件,MySQL配置文件,这类配置文件如果想放到私有的配置中心需要额外花费更多的精力,而放到ConfigMap,则方便很多,而且多数都以挂载的方式放进容器里。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
14天前
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
79 19
|
25天前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
260 10
|
29天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
62 13
|
29天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
2月前
|
Kubernetes Cloud Native API
深入理解Kubernetes——容器编排的王者之道
深入理解Kubernetes——容器编排的王者之道
56 1
|
2月前
|
Kubernetes Cloud Native 持续交付
深入理解Kubernetes:容器编排的基石
深入理解Kubernetes:容器编排的基石
|
2月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
2天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
15天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。

热门文章

最新文章

下一篇
开通oss服务