基于Kubernetes的ESaaS架构及实现细节(二)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
概述
ESaaS(ElasticSearch as a Service)是ElasticSearch on Kubernetes的產(chǎn)品實(shí)現(xiàn),是利用Docker和Kubernetes等容器虛擬化和編排調(diào)度系統(tǒng),將ElasticSearch抽象為CaaS(Container as a Service)平臺上的一種服務(wù),實(shí)現(xiàn)秒級創(chuàng)建和擴(kuò)縮容一個用戶自定義的ElasticSerach集群,并且保證高可用和數(shù)據(jù)安全等方面。
關(guān)鍵組件
- ElasticSearch 2.x
- Kubernetes 1.9
- Docker 1.12.6
方案細(xì)節(jié)和注意事項(xiàng)
ES集群中,某個data/master/client節(jié)點(diǎn)掛了之后,分別該怎么辦?
PS:我的環(huán)境中,所有data節(jié)點(diǎn)都是client,不會獨(dú)立部署client。
- 如果獨(dú)立部署client,那么client掛了recreate一個新的即可,注意要清理舊的/data數(shù)據(jù)。
- master /data保存集群元數(shù)據(jù),某個master down了recreate一個新的即可,新的master node 其實(shí)可以利用舊的master node的/data數(shù)據(jù),也可以不用。調(diào)度上不需要干預(yù)。但是建議要清理/data數(shù)據(jù)。
- data節(jié)點(diǎn)掛了后,不允許利用原來的數(shù)據(jù)進(jìn)行重啟,需要recreate一個新的空白的data node。調(diào)度上需要干預(yù),確保新的這個data node沒有用之前的老的data node的/data數(shù)據(jù)。其實(shí)刪除舊data Node掛了之后,需要清理/data目錄的,新的data node也利用不了老的數(shù)據(jù)。但是為了防止刪除數(shù)據(jù)失敗,還是建議調(diào)度到不同的服務(wù)器。
client和master的/data目錄都有持久化的數(shù)據(jù)嗎?
- client /data也有元數(shù)據(jù)信息,作為“smart router”來接受集群請求并轉(zhuǎn)發(fā)。
- master的/data目錄也有集群元數(shù)據(jù),不能和data node共享/data目錄。
如何保證data node的HA?跨服務(wù)器,跨機(jī)架。
-
首先給服務(wù)器打上機(jī)柜機(jī)架的Lable(esaas.hosts.rack=${rack_id})
-
通過Pod Anti-affinity做Pod調(diào)度的反親和性;
podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: es-cluster-nameoperator: Invalues:- ${es-cluster-name}topologyKey: esaas.hosts.rack=${rack_id} -
注意使用requiredDuringSchedulingIgnoredDuringExecution類型的pod anti-affinity時,需要k8s admission controller disable LimitPodHardAntiAffinityTopology,否則會默認(rèn)使用topologyKey: kubernetes.io/hostname,而不能使用自定義topologyKey。
-
線上按照上面的方式進(jìn)行跨機(jī)架部署,在開發(fā)測試環(huán)境,跨服務(wù)器部署就行了,使用topologyKey: kubernetes.io/hostname.
如何設(shè)置ES容器的vm屬性vm.max_map_count?
-
通過init container進(jìn)行設(shè)置,要求init contaienr的privilege為true。
-
所有類型的node(client, master, data)都默認(rèn)使用一樣的vm配置。
initContainers:- name: init-sysctlimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true
如何關(guān)閉ES swap的配置?
-
方法1:關(guān)閉物理服務(wù)器的swap;
-
方法2:配置每個ES node的配置項(xiàng)bootstrap.mlockall: true,要求es容器添加CAP_IPC_LOCK,SYS_RESOURCE這兩個Linux Capacity。
securityContext:privileged: falsecapabilities:add:- IPC_LOCK- SYS_RESOURCE
ES配置項(xiàng)minimum_master_nodes設(shè)置也是通過env注入,然后在容器啟動腳本run.sh中重新生成elasticsearch.yml。
- POD中注入環(huán)境變量NUMBER_OF_MASTERS;
- 如果集群scale up/down后,可能需要動態(tài)設(shè)置這個環(huán)境變量;
- 個人覺得,不人為設(shè)定ES集群的minimum_master_nodes配置項(xiàng),由ES集群觸發(fā)選舉時自己根據(jù)master node數(shù)動態(tài)調(diào)整。
修改file descriptors,建議212644(64K)。
- 修改容器內(nèi)/etc/security/limits.conf, 也應(yīng)該是需要privilege,或者對應(yīng)Linux capability。
es data通過K8S StatefulSet部署,每個es data Pod都會通過volumeClaimTemplates創(chuàng)建對應(yīng)的PV, 將宿主機(jī)上的/data/${es_cluster_name}掛載到es data容器內(nèi)的/data目錄。容器漂移或者recreate時,舊的服務(wù)器上es垃圾數(shù)據(jù)需要做清理。
- HostPath PV支持Recycle這種Reclain Policy。(目前只有HostPath和NFS支持Recycle)
- Recycle —> basic scrub (rm -rf /thevolume/*)
scale down 和 scale up時具體分別該如何操作?
- scale down/up es-clients,直接按照HA的思路進(jìn)行scale,無需其他操作;
- scale down/up es-masters,按照HA的思路進(jìn)行scale后,需要調(diào)ES接口修改minimum_master_nodes。
- scale down/up es-datas, 按照HA的思路進(jìn)行scale up后,無需其他操作;scale down時,需要將對應(yīng)hostpath上的目錄(數(shù)據(jù))進(jìn)行清理。每次縮容只允許減1個es data node,scale down操作前需要檢查:
- ES集群的監(jiān)控狀態(tài)是green;
- 確保縮容后,max(index1.replicas, index2.replicas,…) + 1 < data-node-num
- 其他檢查
某個物理服務(wù)器要下線,該如何操作?
- 第3點(diǎn)提到HA方案,可以保證每個服務(wù)器上最多只會存在某個ES集群中的單個cient/master/data節(jié)點(diǎn),因此服務(wù)器下線最多只會down掉ES集群的單個cient/master/data節(jié)點(diǎn),對于正規(guī)的ES集群是不影響的。這種情況,直接在服務(wù)器上執(zhí)行kubectl drain將deployment,StatefulSet pods驅(qū)逐出去,并會自動在其他合適的服務(wù)器上recreate一個新的cient/master/data節(jié)點(diǎn)。ES集群在整個過程中始終保持正常工作。
- 如果用戶部署的是單節(jié)點(diǎn)的ES實(shí)例,那么按照上面的步驟,必然會導(dǎo)致用戶的數(shù)據(jù)丟失,ES服務(wù)長時間不能用。因此需要對用戶進(jìn)行風(fēng)險提示,并建議先進(jìn)行擴(kuò)容,然后待新節(jié)點(diǎn)同步數(shù)據(jù)完成后,才能干掉原來的es實(shí)例。
某個服務(wù)器突然down了,接下來是什么自動流程?
- 服務(wù)器down了以后,由于調(diào)度部署時考慮了HA,因此不會影響正規(guī)的ES集群的使用。
- 接著大概5min(通過pod-eviction-timeout設(shè)置)時間,會在新的Node上recreate新的client/master/data容器。這樣就繼續(xù)維持原有ES集群的規(guī)模。
ES插件的安裝流程?
- CaaS集群內(nèi)部提供ElastcSearch Plugin倉庫,存放常用插件提供下載;
- 用戶在初始化部署ES集群時可以選擇想要安裝plugins(支持site和jar類型),在init container中下載插件文件到plugin-volume,ES啟動時自動加載這些plugins;
- 如果在ES集群使用過程中用戶想安裝plugins,對于site類型的plugin,調(diào)用Kubernetes exec接口下載對應(yīng)Site plugin文件到對應(yīng)的插件目錄即可;對于jar類型的plugin,同樣的先現(xiàn)在插件到對應(yīng)的plugin-volume目錄,由于需要重啟ES實(shí)例,通過執(zhí)行kubectl exec POD_NAME -c CONTAINER_NAME reboot 或者 docker kill $containerName來重啟ES容器而不用recreate Pod。
- 由于多個ES不能共享同一個plugin目錄,因此需要給每個ES實(shí)例都劃分獨(dú)立的plugin-volume,掛載宿主機(jī)上不同的hostpath;
- 對于ES管理類plugin,需要指定插件部署到哪個ES node上(建議部署在某個master node上),后面訪問該plugin只能通過訪問該ES node的plugin API;
- 對于ES功能類plugin(比如ik分詞器),需要在所有ES集群 nodes(client, master, data)上安裝該plugin。
- 安裝jar插件重啟es節(jié)點(diǎn)前,必須檢查es集群健康狀態(tài)為green。
- es節(jié)點(diǎn)重啟時,注意ES的Fault Detection機(jī)制,配置discovery.zen.fd.ping_interval(1s), ping_timeout(30s),ping_retries(3),也就是說默認(rèn)90s內(nèi)沒ping通就認(rèn)為節(jié)點(diǎn)失敗,然后進(jìn)行分片遷移。我們關(guān)注這個配置,有需要可以適當(dāng)調(diào)大。
- 討論決定,先只支持jar類型的插件,后續(xù)考慮sites類的插件(比如通過ESaaS本地存放sites plugin,所有ES集群共用)
自研ES監(jiān)控工具如何與ES集群對接?
- 監(jiān)控工具支持API動態(tài)增加ES集群信息,只需要把集群中任一node(client/master/data)的IP和Port(9200)添加到監(jiān)控工具中,有client就給client的信息,如果只有data node,則給data node的9200到監(jiān)控工具;
- ESaaS創(chuàng)建ES集群時,配置是否自動添加到監(jiān)控平臺,如果是,則部署完ES集群后回調(diào)監(jiān)控平臺的”ADD_ES_CLUSTER“接口;
- ESaaS頁面提供到監(jiān)控平臺的跳轉(zhuǎn)鏈接,由監(jiān)控平臺做好監(jiān)控信息的權(quán)限管理。監(jiān)控添加ES集群時需要帶上用戶的ID。
Kibana服務(wù)的部署如何與ES集群對接?
- 初始化部署ES集群時,用戶可以勾選是否一并自動創(chuàng)建對應(yīng)的Kibana服務(wù);
- 也提供單獨(dú)創(chuàng)建Kibana服務(wù)的頁面入口,要求用戶選擇對接的ES集群;
- 通過注入環(huán)境變量ELASTICSEARCH_URL: http://es-client.namespace-1.svc.pro.es::9200
所有ES nodes的elasticsearch.yaml中的discovery hosts只需要配置master nodes的域名或者IP列表,當(dāng)然如果配置所有的(client, data, master nodes)IP列表,也不會有異常。
初始化創(chuàng)建ES集群的時候,注意確保成功啟動所有master nodes后,再去創(chuàng)建data nodes。client nodes的創(chuàng)建順序沒有要求。
ES node的JVM內(nèi)存配置,支持8,16,32g。最大不允許超過32g,否則反而會因?yàn)镚C問題等導(dǎo)致性能更差。
ES集群的日志收集,接入EFK日志系統(tǒng)。同時提供ES集群各個容器的web console能力,讓用戶能在web console查看(慢)日志等操作。
ES zen discovery我們通過域名(K8S Service Name)來解析es master IP List, 需要注意hosts.resolve_timeout,默認(rèn)5s。
ES 2.x和5.x,6.x在node角色劃分不一樣,目前我只考了2.x版本,5.x和6.x需做適度調(diào)整。
引導(dǎo)檢查
- Heap size check 堆大小檢查
- File descriptor check 文件描述符(文件句柄)檢查
-
啟動報錯:max file descriptors [65535] for elasticsearch process likely too low, increase to at least [65536]
-
解決方式:ulimit -n 65536 或者 vi /etc/security/limits.conf
soft nofile 65536hard nofile 65536
-
- Memory lock check 內(nèi)存鎖住檢查
- Maximum number of threads check 線程最大值檢查
-
啟動報錯:max number of threads [1024] for user [push] is too low, increase to at least [2048]
-
解決方法:vi /etc/security/limits.d/90-nproc.conf
soft nproc 2048
-
- Maximum size virtual memory check 虛擬內(nèi)存最大值檢查
- Maximum map count check map count最大值檢查
-
啟動報錯:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
-
解決方法:vi /etc/sysctl.conf
vm.max_map_count=262144sysctl -p
-
- Client JVM check JVM客戶端檢查
- Use serial collector check
- System call filter check
- 啟動報錯:system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
- 解決方法:elasticsearch.yml加上bootstrap.system_call_filter: false
- OnError and OnOutOfMemoryError checks
- Early-access check
- G1GC check G1垃圾回收器檢查
用戶在ESaaS Portal上自助申請ES集群時,除了指定每個nodes的cpu,mem之外,還需要指定需要的本地存儲空間大小,Kubernetes 1.9在調(diào)度時需要考慮服務(wù)器存儲空間是否能滿足需求。
轉(zhuǎn)載于:https://my.oschina.net/jxcdwangtao/blog/1621106
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的基于Kubernetes的ESaaS架构及实现细节(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web框架flask(4)——数据库
- 下一篇: php7简短而安全的数组遍历方法