您好,登錄后才能下訂單哦!
Kubernetes中怎么實(shí)現(xiàn)一個ESaaS架構(gòu),很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
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: 100 podAffinityTerm: labelSelector: matchExpressions: - key: es-cluster-name operator: In values: - ${es-cluster-name} topologyKey: esaas.hosts.rack=${rack_id}
注意使用requiredDuringSchedulingIgnoredDuringExecution類型的pod anti-affinity時(shí),需要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-sysctl image: busybox imagePullPolicy: IfNotPresent command: ["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: false capabilities: 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ā)選舉時(shí)自己根據(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時(shí),舊的服務(wù)器上es垃圾數(shù)據(jù)需要做清理。
HostPath PV支持Recycle這種Reclain Policy。(目前只有HostPath和NFS支持Recycle)
Recycle —> basic scrub (rm -rf /thevolume/*)
scale down 和 scale up時(shí)具體分別該如何操作?
ES集群的監(jiān)控狀態(tài)是green;
確??s容后,max(index1.replicas, index2.replicas,…) + 1 < data-node-num
其他檢查
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時(shí),需要將對應(yīng)hostpath上的目錄(數(shù)據(jù))進(jìn)行清理。每次縮容只允許減1個es data node,scale down操作前需要檢查:
某個物理服務(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ù)長時(shí)間不能用。因此需要對用戶進(jìn)行風(fēng)險(xiǎn)提示,并建議先進(jìn)行擴(kuò)容,然后待新節(jié)點(diǎn)同步數(shù)據(jù)完成后,才能干掉原來的es實(shí)例。
某個服務(wù)器突然down了,接下來是什么自動流程?
服務(wù)器down了以后,由于調(diào)度部署時(shí)考慮了HA,因此不會影響正規(guī)的ES集群的使用。
接著大概5min(通過pod-eviction-timeout設(shè)置)時(shí)間,會在新的Node上recreate新的client/master/data容器。這樣就繼續(xù)維持原有ES集群的規(guī)模。
ES插件的安裝流程?
CaaS集群內(nèi)部提供ElastcSearch Plugin倉庫,存放常用插件提供下載;
用戶在初始化部署ES集群時(shí)可以選擇想要安裝plugins(支持site和jar類型),在init container中下載插件文件到plugin-volume,ES啟動時(shí)自動加載這些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)重啟時(shí),注意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集群時(shí),配置是否自動添加到監(jiān)控平臺,如果是,則部署完ES集群后回調(diào)監(jiān)控平臺的”ADD_ES_CLUSTER“接口;
ESaaS頁面提供到監(jiān)控平臺的跳轉(zhuǎn)鏈接,由監(jiān)控平臺做好監(jiān)控信息的權(quán)限管理。監(jiān)控添加ES集群時(shí)需要帶上用戶的ID。
Kibana服務(wù)的部署如何與ES集群對接?
初始化部署ES集群時(shí),用戶可以勾選是否一并自動創(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集群的時(shí)候,注意確保成功啟動所有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)。同時(shí)提供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)檢查
啟動報(bào)錯: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
啟動報(bào)錯: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=262144 sysctl -p
啟動報(bào)錯: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
啟動報(bào)錯: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 65536 hard nofile 65536
Heap size check 堆大小檢查
File descriptor check 文件描述符(文件句柄)檢查
Memory lock check 內(nèi)存鎖住檢查
Maximum number of threads check 線程最大值檢查
Maximum size virtual memory check 虛擬內(nèi)存最大值檢查
Maximum map count check map count最大值檢查
Client JVM check JVM客戶端檢查
Use serial collector check
System call filter check
OnError and OnOutOfMemoryError checks
Early-access check
G1GC check G1垃圾回收器檢查
用戶在ESaaS Portal上自助申請ES集群時(shí),除了指定每個nodes的cpu,mem之外,還需要指定需要的本地存儲空間大小,Kubernetes 1.9在調(diào)度時(shí)需要考慮服務(wù)器存儲空間是否能滿足需求。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。