TKE部署ES如何配置参数vm.max_map_count
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配置如下。
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是否正常,出现下面信息说明你的集群已经成功搭建。
[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的配置,这里修改内核参数就不会有权限不足的问题。
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
- Java基础-day02-基础题
- 简单易学的机器学习算法——AdaBoost
- 用脚本来讲一个技术生活的故事 (r9笔记第32天)
- 优化算法——拟牛顿法之BFGS算法
- 对于tnsping的连接超时的功能补充(二)(r9笔记第22天)
- 用深度学习每次得到的结果都不一样,怎么办?
- 优化算法——拟牛顿法之DFP算法
- python SVM 案例,sklearn.svm.SVC 参数说明
- 利用Theano理解深度学习——Auto Encoder
- sudo 出现unable to resolve host 解决方法
- Hadoop学习笔记——Hadoop常用命令
- 可扩展机器学习——Spark分布式处理
- GO语言并发编程之互斥锁、读写锁详解
- DBCA静默建库中的两个小问题 (r9笔记第28天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第1次Spring源码学习之@Bean、@Configuration、xml、分析
- Spring 中的依赖注入(DI),你都知道多少?
- Docker配置1台Nginx+3台Tomcat做负载均衡
- Centos7.x+Docker部署RabbitMQ
- LeetCode(1)-找出数组中重复的数字
- LeetCode(面试题:二维数组中的查找)
- 面试题05-替换空格(LeeCode)
- 解决Mybatis当实体类中的属性名和表中的字段名不一致的问题
- 图书管理系统(一)项目框架结构搭建
- Mybatis中模糊查询like语句的使用方法
- win10暴力查看wifi密码
- 再也不怕面试官问java中的goto关键字了?
- 死磕Java之分析short类型
- 死磕Java之Java数据类型的来龙去脉
- 请不要再使用判断进行参数校验了