TKE部署ES如何配置参数vm.max_map_count

2021-07-19 12:56:37 浏览数 (1)

1. 容器如何配置sysctl参数的

docker的机制

使用Namespaces实现了系统环境的隔离,Namespaces允许一个进程以及它的子进程从共享的宿主机内核资源(网络栈、进程列表、挂载点等)里获得一个仅自己可见的隔离区域,让同一个Namespace下的所有进程感知彼此变化,对外界进程一无所知,仿佛运行在一个独占的操作系统中;

使用CGroups限制这个环境的资源使用情况,比如一台16核32GB的机器上只让容器使用2核4GB。使用CGroups还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等;

使用镜像管理功能,利用Docker的镜像分层、写时复制、内容寻址、联合挂载技术实现了一套完整的容器文件系统及运行环境,再结合镜像仓库,镜像可以快速下载和共享,方便在多环境部署。

正因为Docker不像虚机虚拟化一个Guest OS,而是利用宿主机的资源,和宿主机共用一个内核:

1、Docker是利用CGroups实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源;

2、Namespace的隔离看似完整,实际上依旧没有完全隔离Linux资源,比如/proc 、/sys、/dev/sd*等目录未完全隔离,SELinux、time、syslog等所有现有Namespace之外的信息都未隔离。

2. TKE订制系统镜像的特性

由于TKE的订制镜像sysctl隔离特性,所以当你的节点镜像版本是下面表格中的订制镜像,那么你在部署es通过prestart或者init容器去修改vm.max_map_count这个都是不会生效的。

img-0amm1ukz

Ubuntu 18.04 TKE Optimized

镜像市场

Ubuntu

2019.11.18

Active

ubuntu18.04.1x86_64

内核4.14.105-19-0008

img-fmdi67gb

Ubuntu 18.04 TKE Optimized GPU

镜像市场

Ubuntu

2019.11.18

Active

ubuntu 18.04.1x86_64 GPU

内核 4.14.105-19-0008

img-3kkoodwh

CentOS 7.6 TKE Optimized

镜像市场

CentOS

2019.11.18

Active

CentOS 7.6.0_x64

内核4.14.105-19-0008

img-es1i6ihl

CentOS 7.6 TKE Optimized GPU

镜像市场

CentOS

2019.11.18

Active

CentOS 7.6.0_x64 GPU

内核4.14.105-19-0008

3.TKE集群上部署ES解决方案

3.1节点系统TKE订制类型

现在tke订制的镜像中已经更新解决了这个参数问题,所以你的节点是上面表格的镜像id类型,这边的解决方案就是用最新镜像重装存量节点系统,或者加入新的节点到集群中,然后把es的pod调度到新节点即可。

  • 存量节点用最新镜像重新系统,只需要在控制台中执行移出节点再把节点加入集群即可。
  • 新加节点直接调节节点到集群,然后用label或者亲和性让es的pod调度到新节点上。

新版镜像id如下:

CentOS 7.6 TKE Optimized :img-cgndmknl

Ubuntu 18.04 TKE Optimized:img-8f4a3ri5

3.2节点类型非TKE订制类型

如果节点是非TKE订制镜像,那么直接是可以在容器初始化时候修改vm.max_map_count来进行处理的。这边可以通过配置init容器来修改参数,具体yaml配置如下。

代码语言:javascript复制
      containers:
      - env:
        - name: ES_JAVA_OPTS
          value: -Xms512m -Xmx512m
        image: ccr.ccs.tencentyun.com/tke-market/elasticsearch:7.6.2
        imagePullPolicy: IfNotPresent
        name: web-base-elasticsearch6
        ports:
        - containerPort: 9200
          protocol: TCP
        - containerPort: 9300
          protocol: TCP
        resources:
          limits:
            cpu: "1"
          requests:
            cpu: 100m
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      initContainers:
      - command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        image: busybox:1.27.2
        imagePullPolicy: IfNotPresent
        name: init-sysctl
        resources: {}
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

4. TKE上快速搭建ES集群

我们可以通过应用市场中helm快速部署一个ES集群到TKE中,应用市场会部署一个3节点的ES集群,同时也会通过节点亲和性让每一个副本调度到不同节点,所以这边最好保证集群中有3个node。如果少于3个,则要去除亲和性配置,否则会调度失败。下面我们大致说下步骤。

找到elasticsearch应用

点击进去,创建应用,选择你的集群,应用名和命名空间,如果你需要修改yaml参数,这里可以在下面参数修改。

这边进入集群查看你的应用。

这边es会默认创建2个svc,一个是提供对外访问的,如果你需要提供给集群公网访问可以修改svc的类型为loadblance,默认只能在集群内访问。

登录节点访问es,看es是否正常,出现下面信息说明你的集群已经成功搭建。

代码语言:javascript复制
[root@VM_1_4_centos ~]# curl 172.16.254.240:9200
{
  "name" : "elasticsearch-master-2",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "QWmwrr1CTgWMicuggE1ukA",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

5. TKE上搭建ES集群init容器运行失败

用helm在tke上部署es集群,init的容器一直crash,导致pod启动异常,查看init容器的日志报错systcl: permission denied on key 'vm.max_map_count'。

helm部署的es,镜像里面默认是用elasticsearch启动,而init容器是配置的特权模式,默认用elasticsearch用户去修改宿主机内核参数vm.max_map_count可能会出现权限不足的问题,这里可以在init容器指定启动用户为root,也就是在init的securityContext里加上runAsUser:0的配置,这里修改内核参数就不会有权限不足的问题。

代码语言:javascript复制
      initContainers:
      - command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        image: ccr.ccs.tencentyun.com/tke-market/elasticsearch:7.6.2
        imagePullPolicy: IfNotPresent
        name: configure-sysctl
        resources: {}
        securityContext:
          privileged: true
          runAsUser: 0
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1000
        runAsUser: 1000

参考文档

https://cloud.tencent.com/document/product/457/41221

0 人点赞