helm在k8s上部署Elasticsearch和Kibana

2023-03-01 06:00:31
  • 前提
    • 在win上安裝docker desktop,沒有網路限制,而且,開啟kubernetes之後,很快就安裝啟動好了。
    • 在win上安裝scoop,有網路限制,需要存取github raw的檔案內容,安裝方法 官網 有安裝命令 > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time > irm get.scoop.sh | iex
      • 為什麼要安裝scoop, 因為可以在win的機器上,快速安裝命令列工具。
      • 因為windows的docker desktop安裝了之後,沒有命令列工具 kubectl 和 docker了 (20230228近期安裝更新的)
    • 如果本身是mac環境的也是需要安裝docker desktop或者虛擬機器器linux系列上面部署k8s叢集也無妨。
    • 對elasticsearch以及kibana的知識,本文沒有細述,需要另外查詢
    • 一些內容是通過chatgpt返回的過程和方法,所以基本上沒有去網上查其他的資料。主要還是自己的認知,然後把chatgpt的零碎的內容整合起來,可能會比百度更快,但是,如果真的遇到問題,無法得到答案,自己排查,比如排查了2天,ssl連線不上elasticsearch,因為k8s的service的selector配錯了,是app=elasticsearch-master, 我漏了-master
  • 其他的一些環境安裝
    • 通過上面的scoop,在win上面安裝docker 和kubectl ,但是對於curl命令powershell有自己的解釋,所以建議安裝git,就會有自帶的git bash。git bash執行方法,可以右鍵選擇啟動gi t bash,或者在vscode編輯器的終端中選擇git bash的終端。
    • 在win上面安裝tightVNC, 設定好密碼,其他預設。然後在mac上的app store裡面安裝ripple remote就可以遠端連線區域網的win主機了。如果有打不出的字元,win+ R啟動osk螢幕鍵盤。
    • 用scoop安裝base64,因為後面elasticsearch的密碼存在了k8s的secret裡面,需要base64解碼
    • 用scoop安裝jq,對json內容進行解析和操作,因為elasticsearch返回的內容多為json格式。
    • 用scoop安裝helm scoop install helm
    • 如果可以建立共用資料夾,或者用nas硬碟的話,vscode在兩臺機器上面是可以同時編輯同一個檔案的。這樣就好像貼上板一樣。遠端桌面也可以複製文字,複製檔案到共用目錄下面
  • 正文
    • 在安裝好docker desktop(k8s)的機器上執行命令, 啟動elasticsearch 和kibana
    • 如果kibana查詢elasticsearch失敗了。用helm uninstall kibana也不能徹底刪除乾淨,再次啟動的時候要換個名字了。
    • 相關的helm chart的使用檔案和chart的檔案在git上。連結在這ELK Helm Chart
# 安裝helm的chart的來源
helm repo add elastic https://helm.elastic.co

# 可以另外建立一個k8s的namespace
kubectl create namespace elastic-system

# 需要注意的是,如果docker desktop,k8s叢集只有一個節點,預設是replicas=3
# 導致唯一在running狀態下的pod elasticsearch-master-0一直不是ready狀態
# 好像是還有一個pushto not ready的一個引數可以設定,但是效果我沒有去看
# 所以務必加上 --set replicas=1, 否則kibana啟動直接失敗
helm install elasticsearch elastic/elasticsearch --set replicas=1 -n elastic-system

# 啟動之後會得到一下的log列印出來
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=elastic-system -l app=elasticsearch-master -w
2. Retrieve elastic user's password.
  $ kubectl get secrets --namespace=elastic-system elasticsearch-master-credentials -ojsonpath='{.data.password}' | base64 -d
3. Test cluster health using Helm test.
  $ helm --namespace=elastic-system test elasticsearch
# kibana啟動多了這個
3. Retrieve the kibana service account token.
  $ kubectl get secrets --namespace=elastic-system kibana-kibana-es-token -ojsonpath='{.data.token}' | base64 -d

#第二個是為了獲取kibana的使用者elastic的密碼的,可以看到還有elasticsearch-master-certs 的secret
#也可以通過base64解碼,然後把內容生成3個證書檔案
#這樣就不用通過 k8s的拷貝命令, 來吧pod中的證書檔案給複製下來了
kubectl cp elasticsearch-master-0:/usr/share/elasticsearch/config/certs ./certs

#第一個命令,是檢視有沒有elasticsearch的pod,處於running,並且ready的狀態
# 其他多餘的就不細說了。這一步是必要的過程
#elasticsearch的pod READY之後,可以啟動kibana
helm install kibana elastic/kibana -n elastic-system

# 如果失敗了重新來,需要改名字比如後面加數位,因為uninstall不乾淨,留了一個configmap,
# 就算刪除之後,helm也提示名稱重複,暫時不知道原因
# kubectl delete all -all 或者 kubectl delete all -n elastic-system也不行
helm uninstall kibana
helm install kibana2 elastic/kibana -n elastic-system

#另外說一句,雖然elasticsearch是作為stateful部署的,但是資料的持久化,還是靠的pvc
#否則一旦pod重啟資料就沒有了,這個helm的chart已經給我們寫好了,如果需要額外設定,需要用values.yml新增需要修改的引數,然後啟動

# 這個時候檢視k8s中,可以看到elasticsearch已經有一個service是提供給kibana來通訊的。
# 但是我們自己需要去存取kibana, 或者對elasticsearch傳送請求,如curl或者使用者端
# 就需要把kibana和elasticsearch暴露到節點之外。為了長期部署的方便,不建議使用port-forward
# --address 0.0.0.0這樣其他區域網的機器也可以存取
kubectl port-forward service/kibana-kibana 5601:5601 --address 0.0.0.0 -n elastic-system

# 需要另外建立2個service, type是nodeport,但是nodeport的埠的範圍是固定的30000到多少
# nodeport命令裡面不知道怎麼沒有selector這個引數了,只能輸出檔案之後修改selector
# 這檔案就不列出來了。檢視label的方法如下
kubectl get pods -n elastic-system --show-labels

# 先匯出檔案,dry-run不能少,埠可以自己定義,我這裡寫了9200有點關係的32400
kubectl create service nodeport my-elasticsearch-service --tcp=9200:9200 --node-port=32400 -o yaml --dry-run=client  > elasticsearchservice.yml

# 修改檔案中的selector的部分
# 我就是因為少了-master導致ssl連結不上,排查了2天
把 app: my-elasticsearch-service 改成 app: elasticsearch-master

# 然後啟動 apply create都可以
kubectl apply -f .\elasticsearchservice.yml

# 然後是kibana的service, 我選了和5601相近的32601
kubectl create service nodeport my-kibana-service --tcp=5601:5601 --node-port=32601 -o yaml --dry-run=client  > kibanaservice.yml

# 然後啟動
kubectl create -f .\kibanaservice.yml


  • 驗證
    • 到了這裡就設定好了。感覺就是4個命令的事情
    • 驗證的一些步驟
# 看看elasticsearch和kibana是不是正常啟動著,這個在上面的過程中就會看到
# 比如說docker desktop裡面有沒有elasticsearch和kibana的容器在執行著
# 通過kubectl get pod -n elasticsearch, 或者get service看看這些服務

# 連線kibana
# 在本機的話就是存取 localhost:32601就能看到kibana的登入頁面
# 通過上面獲得密碼的方法就不用進elasticsearch去找密碼了。我也不知道怎麼找密碼,暫時只知道怎麼重置密碼,密碼在啟動log裡面
# 進elasticsearch的方法
kubectl exec -it elasticsearch-master-0 -n elastic-system --  /bin/bash

# 進kibana的方法
kubectl exec -it kibana-kibana-XXXpodname -n elastic-system --  /bin/bash

# 獲取密碼的方法
kubectl get secrets --namespace=elastic-system elasticsearch-master-credentials -ojsonpath='{.data.password}' | base64 -d

# 進去之後因為elasticsearch裡面什麼資料也沒有,想要去建立index pattern,只會出現一個新增integration的介面,所以看不出這個pod的資料是持久的。
# 要驗證這個elasticsearch的資料是持久的,可以新增一個使用者。然後把docker關了重啟,然後再登入進去
# 然後發現這個使用者還在。這裡我說的就比較模糊了。不細說的原因是因為我也沒有對elk掌握的很深,elk知識,不是我兩句話能說的清的。

# 然後看一下elasticsearch的資料現在沒辦法用index patten對映,可以先去dev tools裡面加2條資料
# kibana據說是nodejs前端,devtools上傳送的內容是不會直接去elasticsearch服務的,是有後臺轉發給elasticsearch
# 在kibana的dev tool的console隨便加點不多的資料,可以隨時刪掉
POST products/_bulk
{"index":{"_id":1}}
{"name":"Wine - Maipo Valle Cabernet","price":152,"in_stock":38,"sold":47,"tags":["Beverage","Alcohol","Wine"],"description":"Aliquam augue quam, sollicitudin vitae, consectetuer eget, rutrum at, lorem. Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat. Praesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede. Morbi porttitor lorem id ligula.","is_active":true,"created":"2004\/05\/13"}
{"index":{"_id":2}}
{"name":"Tart Shells - Savory","price":99,"in_stock":10,"sold":430,"tags":[],"description":"Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.","is_active":true,"created":"2007\/10\/14"}

# 新增好了之後,去kibana的dataviews那裡就可以看到新增elasticsearch的index pattern。不再是啥也沒有了。
# 在登入kibana的時候,也基本上驗證了kibana成功連線上elasticsearch了。

# 連線elasticsearch
# 沒有用到使用者端,可以用nodejs, python,或者java
# 這裡用curl試一下,如果是windows環境,要在git bash裡面用curl命令,隨便用的一個命令
# 改成自己的password
curl --insecure -u elastic:passwordXXXXXX -H "Content-Type:application/x-ndjson" -XGET 'https://localhost:32401/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'

# 返回沒這個index, 隨便找的命令,當然沒有這個index
{"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [orders]","resource.type":"index_or_alias","resource.id":"orders","index_uuiuid":"_na_","index":"orders"}],"type":"index_not_found_exception","reason":"no such index [orders]","resource.type":"index_or_alias","resource.id":"orders","iexndex_uuid":"_na_","index":"orders"},"status":404}


# 在elasticsearch自己的pod上因為我當時去排查問題
curl --insecure --cacert config/cert/ca.crt -u elastic:passwordXXX -H "Content-Type:application/json" -XGET 'https://localhost:9200/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'

# 在kibana的pod上
# 在pod上都是正常的,所以是自己的service配錯了
# charles或者用wireshark抓包抓不到dev tool的console的請求,才發現是前端的後臺傳送的請求
curl --insecure -u elastic:passwordXXXX -H "Content-Type:application/json" -XGET 'https://elasticsearch-master:9200/orders/_search?scroll=1m' -d '{    "query": {         "match_all": {}     } }'


  • 題外話
    • 那麼現在部署好了。可以愉快的玩耍起來了。
    • 其實在helm的chart裡面還有logstash以及2個beat這幾個主力,其實這些也不佔什麼記憶體,就本地部署測試一下也是可以的
    • helm chart裡面把密碼和證書部署在k8s中,這個內容,我也沒有去細看,
    • 包括似乎還有kibana獲取短時有效的elasticsearch的token, 和elasticsearch形成信任關係這個步驟也不清楚,如果是自己部署,要把token從elasticsearch啟動log裡面貼上出來,貼到kibana的初始頁面,這樣才回到使用者登入的介面,預設管理員使用者elastic
    • 新的docker-desktop居然不用那麼費勁,以前是有個github上的sh, 執行獲得需要的包,而且最新的docker-desktop的包所對應的版本可能沒有。所以要去release note裡面找9⃣️一版本的dockerdesktop。坑爹的是,安裝了之後,沒有命令列docker和kubectl, UI介面的功能倒是全了,終於想通了。
    • 證書有什麼用不知道,ssl去連線的時候,還是提示要authentication
    • 這個helm的elasticsearch的chart 用一些附加的設定的命令 helm install kibana elastic/kibana -f values.yaml 或者把這個git下載下來,然後在本地啟動。helm的使用方法就不多說了。
    • 好,暫時先說這麼多
  • 最後想說句話,本來覺得筆記貼過來很快,寫個部落格。內容也比較簡單。用處可能會有一點點。但是感覺寫了好久,快2個小時。