性能爆表
AnyShare
如何购买
我想先试用
我已是Anyshare 客户
AnyRobot
如何购买
购买 AnyRobot 订阅服务
我已是 AnyRobot 客户
一对一在线咨询
我是 AnyRobot 新客户
一对一在线咨询

爱数博客

全部 AnyBackup AnyShare AnyRobot AnyDATA AnyFabric DIP

AnyRobot Pod和ConfigMap有何关联

2023-06-19 1101 0
     在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挂载
  • 环境变量注入
  • 环境变量实例化

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配置文件相关更新。
 

请就本文对您的益处进行评级:

标签

产品技术

相关文章

热门标签

版本发布 在线教学
chat
support
trial
为了给您提供更优质的服务,请您先完善以下信息:
确认提交

扫码关注

爱数技术支持中心公众号

请选择:

请选择咨询类型

AnyShare
AnyBackUp
AnyRobot

扫码关注

爱数技术支持中心公众号

contact us

提交成功!

我们将在 24 小时之内联系你。