background image

20 May 2022

自建Elasticsearch 8.2

這週在處理在azure自建的elasticsearch相關的狀況,今天處理告一段落後來個小筆記未來遇到才不會又搞了老半天...

為什麼要自建elastic呢?主要因為之前使用azure marketplace建立的elastic cloud的saas服務,現在需要把維運的職責交給SRE團隊, 在移交的過程中發現了azure marketplace所建立的saas服務竟然不能移轉owner!只能將該服務的權限做共享而且必須將訂閱升級到Golden的等級, 代表每個月的azure帳單又要多最少百元美金的支出...未來帳號如果被停用或是變更,有可能elastic cloud上的資料會有所影響,迫於無奈下只好走向自建的路了

在自建時需要選好許多azure的服務相關的infra設計這些工作可少不了...最後決定了這些infra與azure的服務

1. elasticsearch server + kibana server

使用vmss的服務建立虛擬機器,虛擬機器的規格是使用E2s v5的規格,根據過往經驗elasticsearch伺服器在尖峰的狀態下會使用較多的記憶體,而對於cpu要求較少一些 對於網路的頻寬要求與對於硬碟的iops都有較大的要求,所以選用了esv5等級的機器

2. logstash server

logstash 服務也是採用vmss來建立虛擬機器,比較不一樣的是logstash對於cpu的要求較多,他需要去解析log還要針對log做相對應的處理,所以我們選用的是B1s的規格 然後針對他cpu與memory的使用率做scale out/in的處理

在主機中我使用的是container而非直接安裝相關的服務,然後搭配過去preversion的手法來建立伺服器。

3. Storage

存放資料的磁區選用,這個在規劃時的poc最為困擾...在azure直接使用virtual machine的服務可以掛載managed disk的磁區,但使用vmss產生的vm是無法使用managed disk的! 但...vmss或是vm建立的硬碟會隨這vm刪除或關閉而消失,所以我們必須得用另外一組的硬碟...後來找到了另外一種解決方案,azure file的服務, 這樣一來就可以透過SMB掛載一個永久的硬碟,未來的log就能完整地被保留下來不會因為vm被刪除而消彌。

ps. azure file目前還不知道這樣的使用情境可以支撐多少的iops寫入與讀取,有待未來實驗 根據官方文件指出每秒的iops是20,000 IOPS的讀取的速度基本上可以跟SSD差不多

內建帳號使用 Service account token

在使用8.0過後的版本kibana的服務官方預設不使用帳號密碼的方式登入,需要使用service account token的方式登入連線,然後按照官方的指引點入的連結會請你呼叫建立token的api

1# create service account token
2curl -X POST -u elastic:changeme "localhost:9200/_security/service/elastic/fleet-server/credential/token?pretty"
3

response

1{
2  "created": true,
3  "token": {
4    "name": "token1",
5    "value": "AAEAAWVsYXN0aWM...vZmxlZXQtc2VydmVyL3Rva2VuMTo3TFdaSDZ"
6  }
7}
8

然後在kibana上使用service account token登入,但只使用這樣的方式建立的token放在kibana上使用是可以登入elasticsearch, 但在操作indices的時候就會出現錯誤security_exception說你沒有權限取得indices的資料

1# kibana.yml config
2server.name: kibana
3server.host: 0.0.0.0
4elasticsearch.hosts: [ "http://{{elasticsearch}}:{{port}}" ]
5xpack.monitoring.ui.container.elasticsearch.enabled: true
6
7elasticsearch.serviceAccountToken: AAEAAWVs......EtHd1E
8

好的,後來發現其實api呼叫的參數不對,官方在錯誤輸出的console上給的網址是會呼叫fleet-server的服務,而不是給kibana使用的所以我們要把fleet-server的token 改成kibana服務的token,這樣就可以登入並且取得indices的資料順利的啟動kibana了

1# for create kibana service account
2curl -X POST -u elastic:changeme "localhost:9200/_security/service/elastic/kibana/credential/token?pretty"
3
1# check permission
2curl -H "Authorization: Bearer AAE.......1E" -X GET "localhost:9200/_security/user/_has_privileges?pretty" -H 'Content-Type: application/json' -d'
3{
4  "cluster": [ "cluster:monitor/main" ],
5  "index" : [
6    {
7      "names": [ "logs-apm.app-default", "metrics-apm.app.*-default", "logs-apm.error-default", "metrics-apm.internal-default", "metrics-apm.profiling-default", "traces-apm.rum-default", "traces-apm-default" ],
8      "privileges": [ "auto_configure","create_doc" ]
9    },
10    {
11      "names": [ "traces-apm.sampled-default" ],
12      "privileges": [ "auto_configure","create_doc","maintenance","monitor","read" ]
13    }
14  ]
15}
16'
17

後記

因為azure file使用Transaction optimized等級的價格每GB花費是1.763台幣,價格並不便宜所以只能將hot data存放在該區域中, 在未來會放上elastic使用cluster的方式將hot data與warm data(使用hot等級)區分開來,減少帳單的開支

參考連結

Service Accounts (Official document)

Create service account token api (official document)

azure file iops

文章標籤