ClickHouse 表引擎之 MySQL

MySQL 表引擎简介

  • 可以与 MySQL 数据库中的表建立映射
  • 只支持 SELECT 和 INSERT,不支持 UPDATE 和 DELETE

创建 MySQL 引擎表

  • 声明

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    ENGINE = MySQL(
        'host:port',
        'database',
        'table',
        'user',
        'password'
        [,
            replace_query,
            'on_duplicate_clause'
        ]
    )
    
  • host:port: mysql 的地址和端口

ClickHouse 数据字典

简介

  • 常驻内存,支持动态更新
  • 适合保存常量和经常使用的维度表数据
  • 可通过字典函数访问,也可通过袋里表与其他数据表实现 JOIN 查询

内置字典

  • 默认禁用
  • 不想写了,没啥意思

外部扩展字典

配置文件

  • 位置: /etc/clickhouse-server/*_dictionary.xml
  • 自动感知变更,不停机在线更新
  • 系统表: system.dictionaries
  • 配置结构
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    
    <?xml version="1.0"?>
    <dictionaries>
      <dictionary>
        <!-- 字典名称,全局唯一 -->
        <name>dict_name</name>
    
        <!-- 字典数据结构 -->
        <structure>
          <!-- 数值 key,UInt64,支持字典类型: flat、hashed、range_hashed、cache -->
          <id>
            <name>field_name</name>
          <id>
    
          <!-- 复合 key,Tuple,类似复合主键,支持字典类型: complex_key_hashed、complex_key_cache -->
          <key>
            <attribute>
              <name>field_name</name>
              <type>field_type</type>
            </attribute>
            <attribute>
              ...
            </attribute>
          </key>
    
          <!-- 字符串 key,String,支持字典类型: ip_trie -->
          <key>
            <attribute>
              <name>field_name</name>
              <type>String</type>
            </attribute>
          </key>
    
          <!-- 只在 range_hashed 字典类型中使用 -->
          <range_min>
            <name>field_name</name>
          </range_min>
          <range_max>
            <name>field_name</name>
          </range_max>
    
          <!-- 字典属性 -->
          <attribute>
            <!-- 字段名称,必填 -->
            <name>field_name</name>
    
            <!-- 字段类型,必填 -->
            <type>field_type</type>
    
            <!-- 查询时,key 无对应字段时的默认值,必填,这里指定的是空字符串 -->
            <null_value></null_value>
    
            <!-- 函数或运算符表达式,非必填,默认无表达式 -->
            <expression></expression>
    
            <!-- 是否支持层次结构,非必填,默认 false -->
            <hierarchical>false</hierarchical>
    
            <!-- 是否支持单射优化,非必填,默认 false -->
            <injective>false</injective>
    
            <!-- 是否开启 MongoDB 优化,非必填,默认 false -->
            <is_object_id>false</is_object_id>
          </attribute>
        </structure>
    
        <!-- 在内存中的数据格式类型 -->
        <layout>
          <!-- 性能最高,只能用数值 key,数组结构保存,初始容量 1024,上限 500000
            支持数据源: Local file、Executable file、HTTP、DBMS -->
          <flat/>
    
          <!-- 只能用数值 key,散列结构保存,无存储上限
            支持数据源: Local file、Executable file、HTTP、DBMS -->
          <hashed/>
    
          <!-- 只能用数值 key,散列结构保存并按时间排序,无存储上限
            range_min 和 range_max 指定时间区间字段,且字段必须是 Date 或 DateTime 类型
            支持数据源: Local file、Executable file、HTTP、DBMS -->
          <range_hashed/>
    
          <!-- 只能用数值 key,固定大小(size_in_cells)数组存储
            cells 数组未缓存的数据在查询时才会加载并缓存到 cells 中,性能不稳定
            支持数据源: Executable file、HTTP、ClickHouse、MySQL -->
          <cache>
            <!-- 缓存大小,视内存而定 -->
            <size_in_cells>16384</size_in_cells>
          </cache>
    
          <!-- 只能用复合 key,其他与 hashed 一样 -->
          <complex_key_hashed/>
    
          <!-- 只能用复合 key,其他与 cache 一样 -->
          <complex_key_cache>
            <size_in_cells>16384</size_in_cells>
          </complex_key_cache>
    
          <!-- 只能用单个 String 字段,trie 树结构,专用语 IP 前缀查询
            支持数据源: Local file、Executable file、HTTP、DBMS -->
          <ip_trie/>
        </layout>
    
        <!-- 数据源 -->
        <source>
          <!-- 本地文件,如果文件修改时间出现变动,会出发数据更新 -->
          <file>
            <path>/path/to/data.csv</path>
            <format>CSV</format>
          </file>
    
          <!-- 可执行文件,如果文件修改时间出现变动,会出发数据更新 -->
          <executable>
            <command>cat /path/to/data.csv</command>
            <format>CSV</format>
          </executable>
    
          <!-- 远程文件,支持 http 和 https 协议,post 请求,如果文件修改时间出现变动,会出发数据更新 -->
          <http>
            <url>http://192.168.1.2:9080/data.csv</url>
            <format>CSV</format>
          </http>
    
          <!-- mysql -->
          <mysql>
            <user>root</root>
            <password>123456<password>
            <replica>
              <host>192.168.1.3</host>
              <priority>1</priority>
            </replica>
            <port>3306</port>
            <db>db_name</db>
            <table>table_name</table>
    
            <!-- 查询过滤条件,非必填 -->
            <where>id=1</where>
    
            <!-- 指定一条 sql 语句,如果返回结果和上一次不一样,则更新,非必填 -->
            <invalidate_query>sql</invalidate_query>
          </mysql>
    
          <!-- clickhouse -->
          <clickhouse>
            <user>default</root>
            <password><password>
            <host>192.168.1.4</host>
            <port>9000</port>
            <db>default</db>
            <table>table_name</table>
            <where>id=1</where>
            <invalidate_query>sql</invalidate_query>
          </clickhouse>
    
          <!-- mongodb -->
          <mongodb>
            <user></root>
            <password><password>
            <host>192.168.1.5</host>
            <port>27017</port>
            <db>db_name</db>
            <colection>collection_name</collection>
          </mongodb>
    
          <!-- odbc 连接其他数据库 ... -->
        </source>
    
        <!-- 字典自动更新频率,单位秒,min 和 max 都是 0 表示禁用更新
          在 cache 字典中还代表缓存失效时间
          字典更新时旧版本依旧提供服务,新版本完全更新成功后才会替代就版本 -->
        <lifetime>
          <min>300</min>
          <max>360</max>
        </lifetime>
      </dictionary>
      <dictionary>
          ...
      </dictionary>
    </dictionaries>
    

操作

  • 手动更新全部数据字典

ClickHouse 数据定义

基础类型

整数

声明 大小(字节) 范围
Int8 1 -128 到 127
UInt8 1 0 到 255
Int16 2 -32768 到 32767
UInt16 2 0 到 65535
Int32 4 -2147483648 到 2147483647
UInt32 4 0 到 4294967295
Int64 8 -9223372036854775808 到 9223372036854775807
UInt64 8 0 到 18446744073709551615

浮点数

声明 大小(字节) 有效精度(位数)
Float32 4 7
Float64 8 16
  • 正无穷: SELECT 0.8/0
  • 负无穷: SELECT -0.8/0
  • 非数字: SELECT 0/0

定点数

  • 原生声明: Decimal(P,S)

CentOS7 安装 ClickHouse 集群

环境

Zookeeper 服务器

eth0 IP eth1 IP 操作系统 ZK 版本 myid
10.0.4.101 10.1.4.101 CentOS7.8 3.4.14 101
10.0.4.102 10.1.4.102 CentOS7.8 3.4.14 102
10.0.4.103 10.1.4.103 CentOS7.8 3.4.14 103
  • eth0 网卡用于向客户端提供服务,eth1 网卡用于 Zookeeper 集群内部通信
  • 配置时间同步,关闭 selinux 和 firewalld

ClickHouse 服务器

eth0 IP eth1 IP 操作系统 CH 版本 shard 值 replica 值
10.0.4.181 10.1.4.181 CentOS7.8 20.3 LTS 1 10.1.4.181
10.0.4.182 10.1.4.182 CentOS7.8 20.3 LTS 1 10.1.4.182
10.0.4.183 10.1.4.183 CentOS7.8 20.3 LTS 2 10.1.4.183
10.0.4.184 10.1.4.184 CentOS7.8 20.3 LTS 2 10.1.4.184
10.0.4.185 10.1.4.185 CentOS7.8 20.3 LTS 3 10.1.4.185
10.0.4.186 10.1.4.186 CentOS7.8 20.3 LTS 3 10.1.4.186
  • eth0 网卡用于向客户端提供服务,eth1 网卡用于 ClickHouse 集群内部通信
  • 配置时间同步,关闭 selinux 和 firewalld

安装 Zookeeper 集群

  • ClickHouse 集群依赖 zookeeper 管理集群配置
  • 安装过程参考: CentOS7 安装 zookeeper 集群
  • 启动 zookeeper 集群,zookeeper 正常运行后,才能进行后续步骤

安装 ClickHouse 集群

配置 ClickHouse yum 源

  • 在每台 ClickHouse 服务器上执行如下操作

CentOS7 安装 Cloudera Manager

环境

角色 IP 主机名 服务
Utility 192.168.1.100 cm0.colben.cn ClouderaManager
ManagementService
HiveMetastore
Gateway 192.168.1.101 gw0.colben.cn GatewayConfiguration
HiveServer2
Zookeeper
Master 192.168.1.102 m0.colben.cn NameNode
JournalNode
FailoverController
YarnResourceManager
Zookeeper
Master 192.168.1.103 m1.colben.cn NameNode
JournalNode
FailoverController
YarnResourceManager
Zookeeper
Worker 192.168.1.104 w0.colben.cn DataNode
NodeManager
Worker 192.168.1.105 w0.colben.cn DataNode
NodeManager
Worker 192.168.1.106 w0.colben.cn DataNode
NodeManager

配置 ssh 免密登陆

  • 在 cm0 上配置 ssh 可免密登陆全部服务器

RockyLinux 8.5 安装 K3S

环境

角色 主机名 IP 操作系统 软件
镜像库 k3s-170 10.0.4.170 RockyLinux 8.5 registry
数据库 k3s-170 10.0.4.170 RockyLinux 8.5 mysql
负载均衡 k3s-170 10.0.4.170 RockyLinux 8.5 nginx
k3s server k3s-171 10.0.4.171 RockyLinux 8.5 k3s v1.27.4
k3s server k3s-172 10.0.4.172 RockyLinux 8.5 k3s v1.27.4
k3s agent k3s-173 10.0.4.173 RockyLinux 8.5 k3s v1.27.4
k3s agent k3s-174 10.0.4.174 RockyLinux 8.5 k3s v1.27.4
k3s agent k3s-175 10.0.4.175 RockyLinux 8.5 k3s v1.27.4

前期准备

  • 全部服务器关闭 firewalld、selinux 和 swap,设置时间同步
  • 全部 k3s 服务器(除了k3s-170)必须设置唯一主机名
  • 在 k3s-170 上执行如下操作
  • 安装 docker 环境,部署私有镜像库
  • 安装 mysql,用来存储 k3s server 数据
  • 安装 nginx,四层均衡负载两个 k3s server
  • 下载 k3s 二进制文件和部署脚本

安装私有镜像库

  • 在 k3s-170 上执行如下操作

MySQL 组复制

环境

hostname ip os mysql
mysql_11 192.168.1.11 centos7.7 8.0.19
mysql_22 192.168.1.22 centos7.7 8.0.19
mysql_33 192.168.1.33 centos7.7 8.0.19

安装 mysql

  • 懒得写了 …

修改 my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# mysql_11(选择一个)
server-id = 11
# mysql_22(选择一个)
server-id = 22
# mysql_33(选择一个)
server-id = 33

# 开启 binlog
log-bin = /var/log/mysql-bin/master
binlog-format = ROW
# 关闭 binlog 校验
binlog-checksum = NONE
# 保留 2 天的 binlog
binlog-expire-logs-seconds = 172800
# 开启 gtid
gtid-mode = ON
enforce-gtid-consistency = TRUE
# 指定 relay-log 存储位置
relay-log = /var/lib/mysql-bin/slave
# relay-log 更新计入 binlog
log-slave-updates = TRUE

# 多线程执行从库日志(可选)
slave-parallel-workers = 2
slave-parallel-type = LOGICAL_CLOCK
slave-preserve-commit-order = ON

# 存储引擎只能用 InnoDB
disabled-storage-engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 加载插件,克隆插件用于快速 state transfer
plugin-load-add = "group_replication.so;mysql_clone.so"
# 集群 uuid
group-replication-group-name = "aaaa1111-bbbb-2222-cccc-3333dddd4444"

# mysql_11(选择一个)
group-replication-local-address = "192.168.1.11:33061"
# mysql_22(选择一个)
group-replication-local-address = "192.168.1.22:33061"
# mysql_33(选择一个)
group-replication-local-address = "192.168.1.33:33061"

# 种子节点
group-replication-group-seeds = "192.168.1.11:33061,192.168.1.22:33061,192.168.1.33:33061"
# 新主库在执行完自己的从库日志后,再处理用户的写请求
group-replication-consistency = BEFORE_ON_PRIMARY_FAILOVER
# 启动时,不自动创建/初始化新集群
group-replication-bootstrap-group = OFF
# 新节点启动时,先不启动组复制,待手动配置完成并确认正常后,再把 OFF 改成 ON
group-replication-start-on-boot = OFF

# 怀疑某节点不可用,2秒内,如果该嫌疑节点依旧无响应,则开除它(可选)
group-replication-member-expel-timeout = 2
# 2秒内,依旧连接不上主网(majority),则退出组复制,进入 ERROR 状态(可选)
group-replication-unreachable-majority-timeout = 2
# 退出组复制后,不再尝试重新加入组复制,直接执行指定的退出动作(默认)
group-replication-autorejoin-tries = 0
# 指定退出动作: 数据库设置超级只读并关闭客户端连接(推荐)
group-replication-exit-state-action = OFFLINE_MODE

初始化集群

  • 重新启动节点 mysql_11

MariaDB 主从复制

环境

  • mariadb 主服务器,centos7.8,192.168.1.141
  • mariadb 主服务器,centos7.8,192.168.1.142
  • mariadb 从服务器,centos7.8,192.168.1.143
  • 忽略系统数据库: information_schema, mysql, performance_schema

在两个主服务器上创建用于备份的用户 replicator

1
2
grant replication slave on *.* to 'replicator'@'%' identified by 'password';
flush privileges;

在两个主服务器上修改 my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 唯一 ID
# 192.168.1.141 配置 
server-id = 141
# 192.168.1.142 配置 
server-id = 142
read-only = 0

# binlog
# MariaDB 默认已开启 GTID
log-bin          = /var/lib/mysql-bin/master
binlog-format    = row
sync_binlog      = 1
expire-logs-days = 3
gtid-strict-mode = ON

# relay log
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = init_sql.%
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.%
relay-log                   = /var/lib/mysql-bin/slave
relay-log-recovery          = TRUE
# 复制线程数不超过 cpu 核数
slave-parallel-threads      = 4

# 双主或多主互备时,可能会用到以下配置
# 自增主键初始值,与其他互备服务器一致
#auto-increment-offset =
# 自增主键等差值,与其他互备服务器均不一致
#auto-increment-increment =
# 该环境中,双主配合 keepalived 实现高可用,无需配置自增

开启互主同步

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-- 在 192.168.1.141 上启动 mariadb,配置同步 192.168.1.142:
change master to master_host = '192.168.1.142',
                        master_port = 3306,
                        master_user = 'replicator',
                        master_password = 'password',
                        master_use_gtid = slave_pos;

-- 在 192.168.1.142 上启动 mariadb,配置同步 192.168.1.141:
change master to master_host = '192.168.1.141',
                        master_port = 3306,
                        master_user = 'replicator',
                        master_password = 'password',
                        master_use_gtid = slave_pos;

在两个主服务器上启动 slave ,查看 slave 状态

1
2
3
4
5
6
7
start slave;
-- 查看 slave 状态
show slave status\G
-- 如果看到
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- 则表示 slave 开启成功!

在从服务器上编辑 my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 唯一 ID
server-id = 143
# 从服务器只做查询,无增删改
read-only = 1

# 忽略的数据表
#replicate-ignore-table     = db1.t1
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = init_sql.%
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = performance_schema.%
relay-log                   = /var/log/mysql-bin/slave
slave-parallel-threads      = 4

开启同步

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
change master 'db141' to master_host = '192.168.1.141',
                         master_port = 3306,
                         master_user = 'replicator',
                         master_password = 'password',
                         master_use_gtid = slave_pos;

change master 'db142' to master_host = '192.168.1.142',
                         master_port = 3306,
                         master_user = 'replicator',
                         master_password = 'password',
                         master_use_gtid = slave_pos;

在从服务器上启动 slave ,查看 slave 状态

1
2
3
4
5
6
7
start all slaves;
-- 在从服务器上查看 slave 状态
show all slaves status\G
-- 如果看到
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- 则表示 slave 开启成功!

参考

ConfigMap 笔记

概述

  • ConfigMap 通常用于设置环境变量、设置命令行参数、创建配置文件
  • Pod 使用 ConfigMap 前,ConfigMap 必须存在,否则 pod 不能启动
  • ConfigMap 只能被在同一一个命名空间中的Pod所引用

创建 ConfigMap

  • 命令如下
    1
    2
    3
    
    kubectl create configmap <map-name> <data-source>
    # 或者
    kubectl apply -f <configmap-file.yml>
    
  • map-name: ConfigMap 名称
  • data-source: 目录、文件或具体值

通过目录创建 ConfigMaps

  • 命令如下
    1
    2
    
    kubectl create configmap game-config \
        --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl
    
  • docs/tasks/configure-pod-container/configmap/kubectl/目录下的文件包括
    1
    
    ls docs/tasks/configure-pod-container/configmap/kubectl/
    
    • 输出如下
      1
      2
      
      game.properties
      ui.properties
      
  • 查看 game-config 信息
    1
    2
    3
    
    kubectl describe configmaps game-config
    # 或者
    kubectl get configmaps game-config -o yaml
    

通过文件创建 ConfigMaps

  • 通过单个文件创建
    1
    2
    
    kubectl create configmap game-config-2 \
        --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties
    
  • 通过多个文件创建
    1
    2
    3
    
    kubectl create configmap game-config-3 \
        --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties \
        --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties
    
  • 通过文件创建ConfigMap时可以定义文件的键
    1
    2
    3
    4
    
    kubectl create configmap game-config-4 \
        --from-file=game-special-key=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties
    # key 是 "game-special-key"
    # value 是 game.properties 文件的内容
    

通过具体值创建 ConfigMaps

  • 使用 –from-literal 参数定义具体值
    1
    2
    3
    
    kubectl create configmap special-config \
        --from-literal=special.how=very \
        --from-literal=special.type=charm
    

使用 ConfigMap

定义 pod 环境变量

Pod 环境变量的值来自于单一 ConfigMap

  • 在ConfigMap中定义一个环境变量作为键值对
    1
    
    kubectl create configmap special-config --from-literal=special.how=very
    
  • 指派ConfigMap中定义的special.how的值给Pod中SPECIAL_LEVEL_KEY环境变量
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","env"]
        env:
        # Define the environment variable
        - name:SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
            # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name:special-config
              # Specify the key associated with the value
              key:special.how
       restartPolicy:Never
    
  • 保存Pod规格的变化,Pod将输出SPECIAL_LEVEL_KEY=very

Pod 环境变量的值来自于多个 ConfigMap

  • 创建两个 ConfigMap
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    ---
    apiVersion:v1
    kind:ConfigMap
    metadata:
       name:special-config
       namespace:default
    data:
       special.how:very
    
    ---
    apiVersion:v1
    kind:ConfigMap
    metadata:
       name:env-config
       namespace:default
    data:
       log_level:INFO
    
  • 在Pod规格中定义环境变量
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","env"]
        env:
        - name:SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
               name:special-config
               key:special.how
         - name:LOG_LEVEL
           valueFrom:
              configMapKeyRef:
                  name:env-config
                  key:log_level
      restartPolicy:Neverv
    
  • 保存变更后的Pod,Pod将会输出SPECIAL_LEVEL_KEY=very和LOG_LEVEL=info

在一个ConfigMap中配置的键值对都作为一个Pod的环境变量

  • Kubernetes v1.6+可用
  • 创建包含多个键-值对的ConfigMap
    1
    2
    3
    4
    5
    6
    7
    8
    
    apiVersion:v1
    kind:ConfigMap
    metadata:
      name:special-config
      namespace:default
    data:
      SPECIAL_LEVEL:very
      SPECIAL_TYPE:charm
    
  • 使用envFrom定义所有的ConfigMap数据作为Pod的环境变量。来自于Config的键成为Pod中环境变量的名
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","env"]
        envFrom:
        - configMapRef:
            name:special-config
       restartPolicy:Never
    
  • Pod的输出包括: SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm

在Pod命令行中使用ConfigMap定义的环境变量

  • 在Pod规范的command 中使用$(VAR_NAME) ,获取ConfigMap定义的环境变量
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"]
        env:
        - name:SPECIAL_LEVEL_KEY
          valueFrom:
             configMapKeyRef:
                name:special-config
                key:SPECIAL_LEVEL
        - name:SPECIAL_TYPE_KEY
          valueFrom:
              configMapKeyRef:
                name:special-config
                key:SPECIAL_TYPE
      restartPolicy:Never
    
  • test-container容器的输出: very charm

添加ConfigMap数据至存储卷

  • 当通过–from-file创建的ConfigMap时,文件将作为一个键保存在ConfigMap中,而此文件的内容将作为值
    1
    2
    3
    4
    5
    6
    7
    8
    
    apiVersion:v1
    kind:ConfigMap
    metadata:
      name:special-config
      namespace:default
    data:
      special.level:very
      special.type:charm
    

将ConfigMap中的数据传播到指定目录

  • 在Pod的存储卷区域添加ConfigMap的名称
  • 这将添加ConfigMap数据到volumeMounts.mountPath指定的目录下(此例为/etc/config)
  • command区域将引用保存在ConfigMap中的special.level条目
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","ls /etc/config/"]
        volumeMounts:
        - name:config-volume
          mountPath:/etc/config
      volumes:
      - name:config-volume
        configMap:
            # Provide the name of the ConfigMap containing the files you want
            # to add to the container
          name:special-config
      restartPolicy:Never
    
  • Pod运行时,command (“ls /etc/config/”)将输出: special.level special.type
  • 如果在/etc/config/目录下存在文件,将不会删除

添加ConfigMap数据至存储卷指定的目录

  • 为ConfigMap条目,使用path指定文件路径
  • 此例中,special.level将在config-volume存储卷中被挂接至/etc/config/keys
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    apiVersion:v1
    kind:Pod
    metadata:
      name:dapi-test-pod
    spec:
      containers:
      - name:test-container
        image:k8s.gcr.io/busybox
        command:["/bin/sh","-c","cat /etc/config/keys"]
        volumeMounts:
         - name:config-volume
           mountPath:/etc/config
      volumes:
      - name:config-volume
        configMap:
           name:special-config
           items:
           - key:special.level
             path:keys
      restartPolicy:Never
    
  • Pod运行时,(“cat /etc/config/keys”) 将输出: very

参考