zoukankan      html  css  js  c++  java
  • K8S学习笔记之Kubernetes 配置管理 ConfigMap

    0x00 概述

    很多情况下我们为某一应用做好镜像,当我们想修改其中的一些参数的时候,就变得比较麻烦,又要重新制作镜像,我们是不是有一种方式,让镜像根据不同的场景调用我们不同的配置文件呢,那我们就需要用到 k8s 的另外一种资源,那就是 ConfigMap。

    我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库,缓存甚至是队列等等。而我们的一个应用程序从写第一行代码开始,要经历开发环境、测试环境、预发布环境只到最终的线上环境。而每一个环境都要定义其独立的各种配置。如果我们不能很好的管理这些配置文件,你的运维工作将顿时变的无比的繁琐。为此业内的一些大公司专门开发了自己的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了自己的一套方案,即ConfigMap。kubernetes通过ConfigMap来实现对容器中应用的配置管理。

    0x01 创建 ConfigMap

    ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。

    创建ConfigMap的方式有4种:

    • 通过直接在命令行中指定configmap参数创建,即--from-literal
    • 通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=<文件>
    • 通过一个文件内多个键值对,--from-env-file=<文件>
    • 事先写好标准的configmap的yaml文件,然后kubectl create -f 创建。

    1.1、通过 --from-literal

    kubectl create configmap test-config1 --from-literal=db.host=172.18.8.200 --from-literal=db.port='3306'

    查看配置的内容。

    [root@master ~]# kubectl get cm test-config1 -o yaml
    apiVersion: v1
    data:
      db.host: 172.18.8.200
      db.port: "3306"
    kind: ConfigMap
    metadata:
      creationTimestamp: "2018-12-16T04:32:42Z"
      name: test-config1
      namespace: default
      resourceVersion: "3676"
      selfLink: /api/v1/namespaces/default/configmaps/test-config1
      uid: a0ee762b-00eb-11e9-9fa7-000c291fb1b3

    1.2、通过 --from-file

    echo -n 172.18.8.200 > ./db.host
    echo -n 3306 > ./db.port
    kubectl create cm test-config2 --from-file=./db.host --from-file=./db.port

    查看配置内容:

    [root@master ~]# kubectl get cm test-config2 -o yaml
    apiVersion: v1
    data:
      db.host: 172.18.8.200
      db.port: "3306"
    kind: ConfigMap
    metadata:
      creationTimestamp: "2018-12-16T04:37:50Z"
      name: test-config2
      namespace: default
      resourceVersion: "4107"
      selfLink: /api/v1/namespaces/default/configmaps/test-config2
      uid: 583ed4e7-00ec-11e9-9fa7-000c291fb1b3

    每个文件内容对应一个信息条目。

    1.3、通过--from-env-file

    cat << EOF > env.txt
    db.host=172.18.8.200
    db.port=3306
    EOF
    kubectl create cm test-config3 --from-env-file=env.txt

    查看配置内容:

    [root@master ~]# kubectl get cm test-config3 -o yaml
    apiVersion: v1
    data:
      db.host: 172.18.8.200
      db.port: "3306"
    kind: ConfigMap
    metadata:
      creationTimestamp: "2018-12-16T04:43:02Z"
      name: test-config3
      namespace: default
      resourceVersion: "4544"
      selfLink: /api/v1/namespaces/default/configmaps/test-config3
      uid: 12746e5f-00ed-11e9-9fa7-000c291fb1b3

    1.4、YAML 配置文件

    配置文件内容如下。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: test-config4
    data:
      db.host: 172.18.8.200
      db.port: "3306"

    创建并查看其内容。

    [root@master ~]# kubectl apply -f db.yaml 
    configmap/test-config4 created
    [root@master ~]# kubectl get cm test-config4 -o yaml
    apiVersion: v1
    data:
      db.host: 172.18.8.200
      db.port: "3306"
    kind: ConfigMap
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","data":{"db.host":"172.18.8.200","db.port":"3306"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"test-config4","namespace":"default"}}
      creationTimestamp: "2018-12-16T04:49:01Z"
      name: test-config4
      namespace: default
      resourceVersion: "5045"
      selfLink: /api/v1/namespaces/default/configmaps/test-config4
      uid: e87cdafa-00ed-11e9-9fa7-000c291fb1b3

    0x02 ConfigMap 使用

    使用ConfigMap有二种方式:

    • 第一种是通过环境变量的方式,直接传递给pod;
    • 第二种是作为volume的方式挂载到pod内。

    2.1、通过环境变量使用

    使用valueFromconfigMapKeyRefnamekey指定要用的key。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: busybox
        args: [ "/bin/sh", "-c", "sleep 3000" ]
        env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: test-config4
              key: db.host
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: test-config4
              key: db.port

    还可以通过envFromconfigMapRefname使得configmap中的所有key/value对都自动变成环境变量。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: busybox
        args: [ "/bin/sh", "-c", "sleep 3000" ]
        envFrom:
        - configMapRef:
            name: test-config3

    2.2、作为volume挂载使用

    test-config4所有key/value挂载进来:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: busybox
        args: [ "/bin/sh", "-c", "sleep 3000" ]
        volumeMounts:
        - name: db
          mountPath: "/etc/db"
          readOnly: true
      volumes:
      - name: db
        configMap:
          name: test-config4

    进入容器查看,看到在db文件夹下以每一个key为文件名value为值创建了多个文件。

    [root@master ~]# kubectl exec -it mypod -- /bin/sh
    / # cd /etc/db
    /etc/db # ls -al
    total 0
    drwxrwxrwx    3 root     root            89 Dec 16 05:23 .
    drwxr-xr-x    1 root     root            16 Dec 16 05:23 ..
    drwxr-xr-x    2 root     root            36 Dec 16 05:23 ..2018_12_16_05_23_04.654058863
    lrwxrwxrwx    1 root     root            31 Dec 16 05:23 ..data -> ..2018_12_16_05_23_04.654058863
    lrwxrwxrwx    1 root     root            14 Dec 16 05:23 db.host -> ..data/db.host
    lrwxrwxrwx    1 root     root            14 Dec 16 05:23 db.port -> ..data/db.port
    /etc/db # cat db.host 
    172.18.8.200/etc/db # 

    2.3、ConfigMap的热更新

    使用该 ConfigMap 挂载的 Env 不会同步更新;
    使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

    2.4、最佳使用方法

    大多数情况下,配置信息都以文件形式提供,所以在创建 ConfigMap 时通常采用 --from-file 或 YAML 方式,读取 ConfigMap 时通常采用 Volume 方式。
    比如我们的 MySQL 配置文件/etc/my.cnf

    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    !includedir /etc/my.cnf.d

    创建CongifMap。

    kubectl create cm mysql-cm --from-file=/etc/my.cnf

    查看创建好的cm。

    [root@master ~]# kubectl get cm mysql-cm -o yaml
    apiVersion: v1
    data:
      my.cnf: |
        [mysqld]
        datadir=/var/lib/mysql
        socket=/var/lib/mysql/mysql.sock
        symbolic-links=0
        [mysqld_safe]
        log-error=/var/log/mariadb/mariadb.log
        pid-file=/var/run/mariadb/mariadb.pid
        !includedir /etc/my.cnf.d
    kind: ConfigMap
    metadata:
      creationTimestamp: "2018-12-16T05:38:29Z"
      name: mysql-cm
      namespace: default
      resourceVersion: "9273"
      selfLink: /api/v1/namespaces/default/configmaps/mysql-cm
      uid: d1201233-00f4-11e9-9fa7-000c291fb1b3

    在 Pod 中使用此 ConfigMap,配置文件为:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: busybox
        args: [ "/bin/sh", "-c", "sleep 3000" ]
        volumeMounts:
        - name: mysql
          mountPath: "/tmp"
      volumes:
      - name: mysql
        configMap:
          name: mysql-cm
          items:
          - key: my.cnf
            path: mysql/my.cnf

    创建 Pod 并读取配置信息:

    [root@master ~]# kubectl exec -it mypod sh
    / # cat /tmp/mysql/my.cnf 
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    !includedir /etc/my.cnf.d
    / # exit

    关于挂在路径大家可以自行进行修改。

    参考

  • 相关阅读:
    Analyzing the Go runtime scheduler from source code perspective
    golang教材
    Kafka#4:存储设计 分布式设计 源码分析
    机器学习应该准备哪些数学预备知识?
    Why does deep learning work?
    Deep Reinforcement Learning
    How do I learn machine learning?
    What are some good books/papers for learning deep learning?
    why deep learning works
    AI 名校课程&书籍 需要学习
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/11080995.html
Copyright © 2011-2022 走看看