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