題外話:當初為什麼堅持使用k8s來實作現有業務,有個很強的推動就是原有的虛拟方式部署Elastic叢集已經不能适應業務規模的擴充,在虛拟機上架設大規模的Elastic叢集已經是噩夢般的存在。是以,下決心采用容器的方式進行部署。容器的方式進行部署,不但實作了快速部署,同時采用k8s進行編排,簡化了elastic叢集的運維。當然,架設完k8s叢集後,就部署Elastic叢集(有狀态集合)是增加了難度,涉及伺服器暴露,持久話存儲,單還是可以一步步的解決的。
Operator 是由 CoreOS 開發的,用來擴充 Kubernetes API,特定的應用程式控制器,它用來建立、配置和管理複雜的有狀态應用,如資料庫、緩存和監控系統。Operator 基于 Kubernetes 的資源和控制器概念之上建構,但同時又包含了應用程式特定的領域知識。建立Operator 的關鍵是CRD(自定義資源)的設計。
Kubernetes 1.7 版本以來就引入了自定義控制器的概念,該功能可以讓開發人員擴充添加新功能,更新現有的功能,并且可以自動執行一些管理任務,這些自定義的控制器就像 Kubernetes 原生的元件一樣,Operator 直接使用 Kubernetes API進行開發,也就是說他們可以根據這些控制器内部編寫的自定義規則來監控叢集、更改 Pods/Services、對正在運作的應用進行擴縮容。
Elastic Cloud on Kubernetes簡稱ECK,其擴充了Kubernetes的基本編排功能,以支援Kubernetes上Elasticsearch,Kibana和APM Server的設定和管理。借助ECK可以簡化所有關鍵操作:
管理監控多個叢集
擴充縮小叢集
變更叢集配置
排程備份
使用TLS證書保護叢集
采用區域感覺實作hot-warm-cold架構
首先是離線檔案和鏡像的導入,下載下傳好"all-in-one.yaml"檔案及安裝需要的docker鏡像檔案eck-operator:1.0.1(這裡的版本号是我寫這篇文章時的目前版本)。另外,順便準備好elasticsearch和kibana的docker鏡像,apm也有但此處我還不需要,是以我沒有下載下傳,具體下載下傳位址可在dockhub裡面查找、拉取,而後docker save \<image_name:version\> -o \<export_name.tar\>導出 。
如果沒有鏡像倉庫,編排的時候預設檔案沒有指定在哪個實體節點上運作,是以在沒有私有倉庫的離線環境裡,需要把上述鏡像用docker load -i <鏡像檔案名.tar.gz>加載到所有節點中。
注意:elastic現有官方鏡像隻有amd64!
建議:為了以後的部署友善,還是架設一個私有鏡像倉庫,本人将在Kubernetes叢集實踐(07)來說明私有倉庫的架設問題。
現有的實體環境中,我有一台華為E9000刀片伺服器,配置了16個CH121 V5計算節點,該計算節點隻有兩個2.5寸的盤位,不能提供較大的存儲空間。是以,我采用了将旁邊的IP SAN的空間,劃分成16個LUN後,分别挂載到16個CH121 V5節點上。(因為這個16個計算節點不是一個Linux叢集,是以不能挂載一個大的共享LUN)每個CH121 V5使用挂載的空間做LocalPV,為ES的資料節點提供持久化存儲。為何沒有直接讓Pod使用iSCSI,主要是我自己還沒有搞定:(
編輯檔案1-test-pv.yaml
編輯檔案2-test-pvc.yaml,此處将pv和pvc的定義分開,便于PV和PVC單獨操作(如在PV的回收政策為Retain時,隻删除PVC)
對于master-volting隻是選舉主節點,自己不能被選為主節點,是以沒有給它配持久存儲。
編輯3-test-eck.yaml
說明:官方具體的安裝可以參看https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html
服務暴露的方式使用前面架設的traefik,先編輯原來的traefik檔案,還是以host端口映射(減小NAT開銷)
kibana因為通過web通路,直接複用80端口。
編輯4-test-route.yaml
說明:服務端口和服務名可以通過以下指令檢視
附:
NFS挂載錯誤
kibana節點不用持久化存儲,但内部部署的模闆和設定容易丢失,是以可以做一個持久化存儲,且對存儲的要求也不高,是以可以采用nfs這種簡單的存儲來實作,可能出現一個小問題:
原因就是備排程的pod在k8s的運作節點上找不到/sbin/mount.xxx,可以檢查是否安裝nfs元件,我使用的是centos7需要運作以下指令來安裝
對于kibana挂載持久化存儲,以下是我的配置檔案
PVC無法删除問題
一般删除步驟為:先删pod再删pvc最後删pv,但是遇到pv始終處于“Terminating”狀态,而且delete不掉。
解決方法:
直接删除k8s中的記錄:
參考資訊:
This happens when persistent volume is protected. You should be able to cross verify this:
Command:
Output:
You can fix this by setting finalizers to null using kubectl patch: