K8S(10) 配置中心实战-configmap 资源

2022/04/21 k8s,docker

ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。 ConfigMap 允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。

0 Configmap 前置说明

0.1.1 Configmap 和 Secret

在 K8S 中,有两种方式管理资源的配置,分别是 Configmap 和 Secret,他们的最大区别是:

  1. Configmap 用来管理明文配置
  2. Secret 用来管理密文配置

0.1.2 怎么使用 Configmap

  1. 创建 Configmap 资源
  2. 在 Deploy 中定义 Congfigmap 类型的 Volumes
  3. 在 Deoloy 的 Containers 中挂载此 Volumes

0.1.3 更新 Configmap 配置的方法

单配置更新法:

  1. 修改 Configmap 资源清单并应用
  2. 重启使用该 Configmap 资源的 Pod

多配置更换法:

  1. 准备多个 Configmap 资源
  2. 修改 Deploy 中使用的 Configmap
  3. 重新 Apply 该 Deploy,Pod 会自动重启

1 Configmap 使用准备

使用 Configmap 前,需要先做如下准备工作

1.1 清理资源

先将前面部署的 3 个 Dubbo 服务的 Pod 个数全部调整( scale )为 0 个,避免在应用 Configmap 过程中可能的报错,也为了节省资源

直接在 Dashboard 上操作即可,

1.2 拆分 Zookeeper 集群

将 3 个 zk 组成的集群,拆分成独立的 zk 单机服务,分别表示测试环境和开发环境(节约资源)

IP地址 ZK地址 角色
10.4.7.11 zk1.zq.com test 测试环境
10.4.7.12 zk2.zq.com pro 生产环境

停止 3 个 zk 服务

sh /opt/zookeeper/bin/zkServer.sh stop
rm -rf /data/zookeeper/data/*
rm -rf /data/zookeeper/logs/*

注释掉集群配置

sed -i 's@^server@#server@g' /opt/zookeeper/conf/zoo.cfg

启动zk单机

sh /opt/zookeeper/bin/zkServer.sh start
sh /opt/zookeeper/bin/zkServer.sh status

1.3 创建 dubbo-monitor 资源清单

老规矩,资源清单在 7.200 运维机上统一操作

cd /data/k8s-yaml/dubbo-monitor

1.3.1 创建 Comfigmap 清单

cat >cm.yaml <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
  name: dubbo-monitor-cm
  namespace: infra
data:
  dubbo.properties: |
    dubbo.container=log4j,spring,registry,jetty
    dubbo.application.name=simple-monitor
    dubbo.application.owner=zqkj
    dubbo.registry.address=zookeeper://zk1.zq.com:2181
    dubbo.protocol.port=20880
    dubbo.jetty.port=8080
    dubbo.jetty.directory=/dubbo-monitor-simple/monitor
    dubbo.charts.directory=/dubbo-monitor-simple/charts
    dubbo.statistics.directory=/dubbo-monitor-simple/statistics
    dubbo.log4j.file=/dubbo-monitor-simple/logs/dubbo-monitor.log
    dubbo.log4j.level=WARN
EOF

其实就是把 dubbo-monitor 配置文件中的内容用 Configmap 语法展示出来了

当然最前面加上了相应的元数据信息

如果转换不来格式,也可以使用命令行工具直接将配置文件转换为 Configmap

kubectl create configmap <map-name> <data-source>
# <map-name> 是希望创建的 ConfigMap 的名称,<data-source> 是一个目录、文件和具体值。

案例如下:

# 1.通过单个文件创建 ConfigMap
kubectl create configmap game-config-1 --from-file=/xxx/xxx.properties

# 2.通过多个文件创建 ConfigMap
kubectl create configmap game-config-2 \
    --from-file=/xxx/xxx.properties \
    --from-file=/xxx/www.properties

# 3.通过在一个目录下的多个文件创建 ConfigMap
kubectl create configmap game-config-3 --from-file=/xxx/www/

1.3.2 修改 Deploy 清单内容

为了和原来的 dp.yaml 对比,我们新建一个 dp-cm.yaml

cat >dp-cm.yaml <<'EOF'
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: dubbo-monitor
  namespace: infra
  labels: 
    name: dubbo-monitor
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: dubbo-monitor
  template:
    metadata:
      labels: 
        app: dubbo-monitor
        name: dubbo-monitor
    spec:
      containers:
      - name: dubbo-monitor
        image: harbor.zq.com/infra/dubbo-monitor:latest
        ports:
        - containerPort: 8080
          protocol: TCP
        - containerPort: 20880
          protocol: TCP
        imagePullPolicy: IfNotPresent
#----------------start---------------------------
        volumeMounts:
          - name: configmap-volume
            mountPath: /dubbo-monitor-simple/conf
      volumes:
        - name: configmap-volume
          configMap:
            name: dubbo-monitor-cm
#----------------end-----------------------------
      imagePullSecrets:
      - name: harbor
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      securityContext: 
        runAsUser: 0
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600
EOF

注释中的内容就是新增在原 dp.yaml 中增加的内容,解释如下:

  1. 申明一个卷,卷名为 configmap-volume
  2. 指定这个卷使用名为 dubbo-monitor-cm 的 Configmap
  3. containers 中挂载卷,卷名与申明的卷相同
  4. mountPath 的方式挂载到指定目录

1.4 创建资源并检查

1.4.1 应用资源配置清单

kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/cm.yaml
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml

1.4.2 Dashboard 检查创建结果

在 Dashboard 中查看 infra 名称空间中的 configmap 资源

mark

然后检查容器中的配置

kubectl -n infra exec -it dubbo-monitor-5b7cdddbc5-xpft6 bash
# 容器内
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties 
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=zqkj
dubbo.registry.address=zookeeper://zk1.zq.com:2181
....

1.4.3 检查 dubbo-monitor 页面的注册信息

mark

2 更新 Configmap 资源

2.1 多配置更新法

2.1.1 准备新 Configmap

再准备一个 configmap 叫 cm-pro.yaml

cp cm.yaml cm-pro.yaml

# 把资源名字改成 dubbo-monitor-cm-pro
sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' cm-pro.yaml

# 把服务注册到 zk2.zq.com 上
sed -i 's#zk1#zk2#g' cm-pro.yaml

2.1.2 修改 Deploy 配置

sed -i 's#dubbo-monitor-cm#dubbo-monitor-cm-pro#g' dp-cm.yaml

2.1.3 更新资源

# 应用新 Configmap
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/cm-pro.yaml

# 更新 Deploy
kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml

2.1.4 检查配置是否更新

新的 Pod 已经起来了

~]# kubectl -n infra get pod
NAME                            READY   STATUS    RESTARTS   AGE
dubbo-monitor-c7fbf68b9-7nffj   1/1     Running   0          52s

进去看看是不是应用的新的 Configmap 配置:

kubectl  -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash
# 容器内
bash-4.3# cat /dubbo-monitor-simple/conf/dubbo.properties |grep zook
dubbo.registry.address=zookeeper://zk2.zq.com:2181

看下 dubbo-monitor 的页面:已经是 zk2 了。

3 挂载方式探讨

3.1 monutPath 挂载的问题

我们使用的是 mountPath,这个是挂载整个目录,会使容器内的被挂载目录中原有的文件不可见,可以看见我们。

查看我们pod容器启动的命令可以看见原来脚本中的命令已经无法对挂载的目录操作了

img

如何单独挂载一个配置文件:

只挂载单独一个文件而不是整个目录,需要添加 subPath 方法

3.2 单独挂载文件演示

3.2.1 更新配置

dp-cm.yaml 的配置中,将原来的 Volume 配置做一下更改

#----------------start---------------------------
        volumeMounts:
          - name: configmap-volume
            mountPath: /dubbo-monitor-simple/conf
      volumes:
        - name: configmap-volume
          configMap:
            name: dubbo-monitor-cm
#----------------end-----------------------------

# 调整为

#----------------start---------------------------
        volumeMounts:
          - name: configmap-volume
            mountPath: /dubbo-monitor-simple/conf
          - name: configmap-volume
            mountPath: /var/dubbo.properties
            subPath: dubbo.properties
      volumes:
        - name: configmap-volume
          configMap:
            name: dubbo-monitor-cm
#----------------end-----------------------------

3.2.2 应用 apply 配置并验证

kubectl apply -f http://k8s-yaml.zq.com/dubbo-monitor/dp-cm.yaml

kubectl  -n infra exec -it dubbo-monitor-5cb756cc6c-xtnrt bash

# 容器内操作
bash-4.3# ls -l /var/
total 4
drwxr-xr-x    1 root     root      29 Apr 13  2016 cache
-rw-r--r--    1 root     root     459 May 10 10:02 dubbo.properties
drwxr-xr-x    2 root     root       6 Apr  1  2016 empty
.....

原文链接:https://www.cnblogs.com/noah-luo/p/13345379.html

Search

    Table of Contents