zoukankan      html  css  js  c++  java
  • Kubernetes ConfigMap详解,多种方式创建、多种方式使用

    我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶!

    1 简介

    配置是程序绕不开的话题,在Kubernetes中使用ConfigMap来配置,它本质其实就是键值对。本文讲解如何通过5种方式创建ConfigMap,通过4种方式使用ConfigMap

    2 创建ConfigMap

    按大类可分为两种方式,细分共有五种方式:

    (一)kubectl create configmap创建

    • (1)通过命令行参数字面直接创建

    • (2)通过指定文件创建

    • (3)通过指定目录创建

    • (4)通过指定环境变量配置文件创建

    (二)yaml文件创建

    2.1 通过命令kubectl create configmap创建

    2.1.1 从字面创建

    命令如下:

    $ kubectl create configmap pkslow-literal 
    --from-literal=pkslow.name=Larry 
    --from-literal=pkslow.age=18 
    --from-literal=pkslow.webSite=www.pkslow.com 
    

    通过参数--from-literal直接指定键值对。这种方式比较适用于临时测试使用,而且不适合配置很多的情况。

    查看内容如下:

    $ kubectl get configmaps pkslow-literal -o yaml

    apiVersion: v1
    data:
      pkslow.age: "18"
      pkslow.name: Larry
      pkslow.webSite: www.pkslow.com
    kind: ConfigMap
    metadata:
      name: pkslow-literal
      namespace: default
    

    2.1.2 从文件创建

    application.yaml文件内容如下:

    server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.pkslow.com
    

    application-uat.yaml文件内容如下:

    server:
      port: 8080
    pkslow:
      name: LarryDpk
      age: 20
      webSite: https://www.pkslow.com
    

    命令如下:

    $ kubectl create configmap pkslow-file 
    --from-file=application.yaml 
    --from-file=application-uat.yaml
    

    通过参数--from-file来指定文件。查看内容如下:

    $ kubectl get configmaps pkslow-file -o yaml

    apiVersion: v1
    data:
      application-uat.yaml: |-
        server:
          port: 8080
        pkslow:
          name: LarryDpk
          age: 20
          webSite: https://www.pkslow.com
      application.yaml: |-
        server:
          port: 8080
        pkslow:
          name: Larry
          age: 18
          webSite: www.pkslow.com
    kind: ConfigMap
    metadata:
      name: pkslow-file
      namespace: default
    

    可以看到它的key为文件名,因为我们没有指定,所以默认为文件名。需要指定则如下:

    $ kubectl create configmap pkslow-file 
    --from-file=app=application.yaml 
    --from-file=uat=application-uat.yaml
    

    2.1.3 从目录创建

    命令如下:

    $ kubectl create configmap pkslow-directory --from-file=./
    

    如上一种方式没有太大差别,只是--from-file后面的参数是目录,而不是文件。

    2.1.4 从环境变量配置文件创建

    配置文件pkslow.env内容如下:

    PKSLOW_NAME=Larry
    PKSLOW_AGE=18
    PKSLOW_WEBSITE=www.pkslow.com
    

    创建命令如下:

    $ kubectl create configmap pkslow-env --from-env-file=pkslow.env
    

    查看内容如下:

    kubectl get configmaps pkslow-env -o yaml

    apiVersion: v1
    data:
      PKSLOW_AGE: "18"
      PKSLOW_NAME: Larry
      PKSLOW_WEBSITE: www.pkslow.com
    kind: ConfigMap
    metadata:
      name: pkslow-env
      namespace: default
    

    细心的朋友应该能发现,这种方式如之前的从文件创建很不一样。它的(key, value)不是(文件名,文件内容),而是文件中一个个的配置。

    2.2 通过yaml文件创建

    通过yaml文件创建就很常规了,跟普通的kubernetes资源创建没有什么区别。先准备yaml文件如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: pkslow-yaml
    data:
      PKSLOW_AGE: "18"
      PKSLOW_NAME: Larry
      PKSLOW_WEBSITE: www.pkslow.com
      application-uat.yaml: |-
        server:
          port: 8080
        pkslow:
          name: LarryDpk
          age: 20
          webSite: https://www.pkslow.com
      application.yaml: |-
        server:
          port: 8080
        pkslow:
          name: Larry
          age: 18
          webSite: www.pkslow.com
    

    再通过以下文件创建:

    $ kubectl apply -f configmap.yaml
    

    3 Pod使用ConfigMap

    Pod中使用ConfigMap有以下四种方式:

    1. 在容器命令和参数内
    2. 容器的环境变量
    3. 在只读卷里面添加一个文件,让应用来读取
    4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

    其中第1种和第2种方式类似,只是启动命令添加环境变量,所以还是要把ConfigMap映射为容器的环境变量。

    第4种方式要访问API,可以使用相关的库,如Spring Cloud Kubernetes,这里不再介绍。

    所以我们主要讲解第2、3种方式。

    3.1 Pod的环境变量映射

    ConfigMap的值映射到环境变量,主要有两种方式,valueFromenvFrom

    3.1.1 valueFrom一一映射

    通过valueFrom来配置环境变量,Pod的环境变量名与ConfigMap不必相同。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pkslow-env-value-from
    spec:
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "env" ]
          env:
            - name: PKSLOW_NAME
              valueFrom:
                configMapKeyRef:
                  name: pkslow-yaml
                  key: PKSLOW_NAME
            - name: PKSLOW_WEBSITE
              valueFrom:
                configMapKeyRef:
                  name: pkslow-yaml
                  key: PKSLOW_WEBSITE
      restartPolicy: Never
    

    查看结果如下:

    $ kubectl logs -f pkslow-env-value-from | grep PKSLOW
    PKSLOW_WEBSITE=www.pkslow.com
    PKSLOW_NAME=Larry
    

    NOTE:当然也可以把application-uat.yaml这种文件映射成环境变量,但因为文件内容可能是多行的,我们一般不会这样做。

    3.1.2 envFrom全部映射

    通过envFrom会把ConfigMap的所有键值对都映射到Pod的环境变量中去。使用如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pkslow-env-env-from
    spec:
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "env" ]
          envFrom:
            - configMapRef:
                name: pkslow-yaml
      restartPolicy: Never
    

    查看环境变量如下:

    $ kubectl logs -f pkslow-env-env-from 
    PKSLOW_WEBSITE=www.pkslow.com
    PKSLOW_AGE=18
    PKSLOW_NAME=Larry
    application.yaml=server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.pkslow.com
    application-uat.yaml=server:
      port: 8080
    pkslow:
      name: LarryDpk
      age: 20
      webSite: https://www.pkslow.com
    

    显然看起来这种方式更简便,不用每个环境变量都配一遍,但它可能会带来脏数据,就看怎么使用了。

    3.2 加载文件

    3.2.1 通过volume加载

    可以通过volume的方式把ConfigMap加载进Pod,如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pkslow-mount-volume
    spec:
      volumes:
        - name: config-volume
          configMap:
            name: pkslow-yaml
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "sleep 1000000" ]
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: config-volume
              mountPath: /data/config
      restartPolicy: Never
    

    进入Pod,查看内容如下:

    $ kubectl exec -it pkslow-mount-volume -- /bin/sh
    / # cd /data/config/
    
    /data/config # ls -lrt
    total 0
    lrwxrwxrwx    1 root     root            23 Feb 21 17:10 application.yaml -> ..data/application.yaml
    lrwxrwxrwx    1 root     root            27 Feb 21 17:10 application-uat.yaml -> ..data/application-uat.yaml
    lrwxrwxrwx    1 root     root            21 Feb 21 17:10 PKSLOW_WEBSITE -> ..data/PKSLOW_WEBSITE
    lrwxrwxrwx    1 root     root            18 Feb 21 17:10 PKSLOW_NAME -> ..data/PKSLOW_NAME
    lrwxrwxrwx    1 root     root            17 Feb 21 17:10 PKSLOW_AGE -> ..data/PKSLOW_AGE
    
    /data/config # cat PKSLOW_WEBSITE
    www.pkslow.com
    
    /data/config # cat application.yaml
    server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.pkslow.com
    

    如果只想要ConfigMap的部分内容,并自定义文件名,可通过items来配置,如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pkslow-mount-volume
    spec:
      volumes:
        - name: config-volume
          configMap:
            name: pkslow-yaml
            items:
              - key: application.yaml
                path: app.yaml
              - key: application-uat.yaml
                path: uat.yaml
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "sleep 1000000" ]
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: config-volume
              mountPath: /data/config
      restartPolicy: Never
    

    3.2.2 通过subPath加载

    通过配置subPath字段,把文件一个一个加载到Pod中去。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pkslow-mount-subpath
    spec:
      volumes:
        - name: config-volume
          configMap:
            name: pkslow-yaml
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "sleep 1000000" ]
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: config-volume
              mountPath: /data/config/dev.yaml
              subPath: application.yaml
            - name: config-volume
              mountPath: /data/config/uat.yaml
              subPath: application-uat.yaml
      restartPolicy: Never
    

    查看内容如下:

    $ kubectl exec -it pkslow-mount-subpath -- /bin/sh
    / # cd /data/config/
    
    /data/config # ls -lrt
    total 8
    -rw-r--r--    1 root     root            89 Feb 21 17:31 uat.yaml
    -rw-r--r--    1 root     root            78 Feb 21 17:31 dev.yaml
    
    /data/config # cat dev.yaml 
    server:
      port: 8080
    pkslow:
      name: Larry
      age: 18
      webSite: www.pkslow.com
      
    /data/config # cat uat.yaml 
    server:
      port: 8080
    pkslow:
      name: LarryDpk
      age: 20
      webSite: https://www.pkslow.com
    

    4 不可变的ConfigMap

    可以禁止修改ConfigMap,好处有:

    • 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
    • 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为系统会关闭 对已标记为不可变更的 ConfigMap 的监视操作。

    此功能特性由 ImmutableEphemeralVolumes 特性门控 来控制。你可以通过将 immutable 字段设置为 true 创建不可变更的 ConfigMap。 例如:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      ...
    data:
      ...
    immutable: true
    

    一旦某 ConfigMap 被标记为不可变更,则 无法 逆转这一变化,也无法更改 databinaryData 字段的内容。你只能删除并重建 ConfigMap。 因为现有的 Pod 会维护一个对已删除的 ConfigMap 的挂载点,建议重新创建 这些 Pods。

    5 总结

    SecretConfigMap的创建与使用也是类似的,不再详细介绍了。

    代码请查看:https://github.com/LarryDpk/pkslow-samples


    欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

    多读书,多分享;多写作,多整理。

  • 相关阅读:
    极客教学笔记---Java实现简单聊天客户端模拟
    java单例模式四模板
    关于在命令行进行文件输入输出重定向的小笔记
    Python爬虫入门之爬取图片
    Python爬虫入门之查询ip地址
    Python爬虫入门之get网页信息并作为文本输出
    Checker
    Manacher模板
    POJ3974——Palindrome
    Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/larrydpk/p/14947993.html
Copyright © 2011-2022 走看看