在AnyRobot环境中,Pod需要依赖各种配置以及配置文件,这些配置不能写死在镜像中,否则会影响到镜像的扩展性。此时ConfigMap作为K8S中提供的配置管理组件登场了。ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改,本文重点讲解下AnyRobot pod和ConfigMap之间的关联。
一、ConfigMap简介
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pod可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
使用 ConfigMap 的限制条件
- ConfigMap 需要在 Pod 启动前创建出来。
- 只有当 ConfigMap 和 Pod 处于同一 NameSpace(命名空间)时,Pod 才可以引用它。
- 当 Pod 对 ConfigMap 进行挂载(VolumeMount)操作时,在容器内部只能挂载为目录,并不能挂载为文件。
- 同时,当挂载已经存在的目录时,且目录内含有其它文件,ConfigMap 会将其覆盖掉。
二、ConfigMap使用方式
ConfigMap API 资源用来保存 key-value pair 配置数据,这个数据可以在 Pod里使用,或者被用来为像 controller 一样的系统组件存储配置数据。虽然 ConfigMap 跟 Secrets 类似,但是 ConfigMap 更方便的处理不含敏感信息的字符串。
ConfigMap的使用方式主要分为三种:
volume挂载
这种使用方式的场景是当一个镜像需要依赖某些配置文件,而这些配置文件中有某些变量需要根据不同的环境进行变更时,为了提高镜像的复用性,就会将这些配置文件抽象出来作成ConfigMap。在镜像部署时,通过ConfigMap依赖将配置文件挂载到Pod中的固定路径下供业务系统使用。
环境变量注入
这种方式比较简单,其实就是在应用的yaml中将ConfigMap中的配置数据通过ENV的方式注入到Pod中供Pod直接使用。
环境变量实例化
如果需要配置一个elasticsearch的有状态服务,需要进行节点的横向扩容,此时肯定需要一个ConfigMap来进行节点配置文件elasticsearch.yml的实例化。但是由于每个节点配置文件上都有各自定制化如IP等私有化配置,此时如果使用常规的ConfigMap处理方式,可能一个节点就需要一个ConfigMap来管理。这在集群规模较小的时候尚可以接受,但是如果集群规模很大,那么维护ConfigMap也是一个负担很重的工作量。
针对这种场景,我们可以通过ConfigMap模板的方式来进行支持,将ConfigMap中elasticsearch.yml的变量部分通过环境变量的方式注入进来,每次在通过yaml调用ConfigMap时对ConfigMap进行实例化,然后再进行配置文件volume的挂载。
三、AnyRobot Pod和ConfigMap之间有何关联
下面我们将以AnyRobot中 Pod名为logstash-filter-85945574fc-b9wcw 是如何和ConfigMap进行关联的。
1、查看logstash-filter-85945574fc-b9wcw yaml文件,发现其应用了ConfigMap为logstash-set 配置文件(仅截取部分yaml文件)。
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- hostPath:
path: /etc/localtime
type: File
name: local-time
- emptyDir: {}
name: logstash-conf
- configMap:
defaultMode: 420
items:
- key: logstash.yaml
path: logstash.yml
name: logstash-set ##configMap 配置文件
name: logstash-set
2、参看引用configMap logstash-set配置文件yaml
Name: logstash-set
Namespace: anyrobot
Labels: app=logstash
Annotations:
Data
====
logstash.yaml:
----
pipeline.ordered: auto
pipeline.java_execution: false
config.reload.automatic: true
path.config: /anyrobot/logstash/conf ##配置文件路径
http.host: 0.0.0.0
pipeline.workers: 4
pipeline.batch.size: 2000
config.reload.interval: 10s
BinaryData
====
Events:
3、进入Pod中,查看配置文件
[root@logstash-filter-85945574fc-b9wcw conf]# ls /anyrobot/logstash/conf/
pipeline_auto.conf
(部分pipeline_auto.conf配置文件如下)
input{
kafka {
bootstrap_servers => "kafka-headless.resource:9097"
security_protocol => "SASL_PLAINTEXT"
sasl_mechanism => "PLAIN"
sasl_jaas_config => "org.apache.kafka.common.security.plain.PlainLoginModule required username='anyrobot' password='eisoo.com123';"
topics => ["kafka_topic"]
#topics_partition => "${POD_NAME}"
auto_offset_reset => "earliest"
group_id => "kafka_topic"
codec => "json"
isolation_level => "read_committed"
max_partition_fetch_bytes => "20971520"
max_poll_records => "500"
session_timeout_ms => "400000"
request_timeout_ms => "400000"
max_poll_interval_ms => "300000"
decorate_events => true
}
kafka {
bootstrap_servers => "kafka-headless.resource:9097"
security_protocol => "SASL_PLAINTEXT"
sasl_mechanism => "PLAIN"
sasl_jaas_config => "org.apache.kafka.common.security.plain.PlainLoginModule required username='anyrobot' password='eisoo.com123';"
topics_pattern => "^((?!kafka_topic)(?!anyrobot_audit)(?!anyrobot_flink)(?!anyrobot_flink_config)(?!alert_rule_intermediate)(?!alert_event)(?!k8s_event)(?!k8s_log)(?!reindex_source)(?!reindex_result)
).+$"
#topics_partition => "${POD_NAME}"
auto_offset_reset => "earliest"
group_id => "kafka_topic_direct"
codec => "json"
isolation_level => "read_committed"
max_partition_fetch_bytes => "20971520"
max_poll_records => "500"
session_timeout_ms => "400000"
request_timeout_ms => "400000"
max_poll_interval_ms => "300000"
decorate_events => true
}
4、通过修改pipeline_auto.conf配置文件,即可以实现pod相关配置的更新。通过同样的方式,其他Pod也可以通过和configMap进行关联,实现Pod配置文件相关更新。