antony@notes:~/openshift$ cat "Install-Elasticsearch-Metrics-Exporter-on-Openshift.md"
Install Elasticsearch Metrics Exporter on Openshift
Install Elasticsearch Metrics Exporter on Openshift
1. 環境資訊
- openshift version
4.19.7in disconnected network - 需要將 Elasticsearch Metrics Exporter 部署在
logging節點 - logging 節點資訊如下:執行結果:
oc get nodes -l "node-role.kubernetes.io/logging"NAME STATUS ROLES AGE VERSION docpl01.ocp.cbsd.scsb.com.tw Ready logging 24d v1.32.6 docpl02.ocp.cbsd.scsb.com.tw Ready logging 24d v1.32.6 docpl03.ocp.cbsd.scsb.com.tw Ready logging 24d v1.32.6 - logging 節點的 taints 資訊 :執行結果:
oc get nodes -l "node-role.kubernetes.io/logging" -o yaml | grep -A 6 -i "taints"taints: - effect: NoSchedule key: logging value: reserved - effect: NoExecute key: logging value: reserved -- taints: - effect: NoSchedule key: logging value: reserved - effect: NoExecute key: logging value: reserved -- taints: - effect: NoSchedule key: logging value: reserved - effect: NoExecute key: logging value: reserved
2. 前置作業
- 先決條件:須在可到 public 網路的 linux 主機作業,並有安裝
podman套件 - 建立專案目錄並切換當前目錄
mkdir -p ~/openshift/addon/monitoring/es-exporter; cd ~/openshift/addon/monitoring/es-exporter - 下載 helm 命令執行檔
wget https://get.helm.sh/helm-v4.0.1-linux-amd64.tar.gz - 下載 prometheus-elasticsearch-exporter helm chart 檔案
helm pull oci://ghcr.io/prometheus-community/charts/prometheus-elasticsearch-exporter - 下載 prometheus-elasticsearch-exporter default
values.yamlwget https://raw.githubusercontent.com/prometheus-community/helm-charts/refs/heads/main/charts/prometheus-elasticsearch-exporter/values.yaml - 獲取 prometheus-elasticsearch-exporter container image 名稱執行結果:
cat default-values.yaml | grep repositoryrepository: quay.io/prometheuscommunity/elasticsearch-exportertag 的版本預設會被指定在
Chart.yaml中 - 獲取 prometheus-elasticsearch-exporter container image tag 版本執行結果:
tar -zxvf prometheus-elasticsearch-exporter-7.0.0.tgz grep -i appversion prometheus-elasticsearch-exporter/Chart.yamlappVersion: v1.9.0 - 下載並打包 prometheus-elasticsearch-exporter container image
podman pull quay.io/prometheuscommunity/elasticsearch-exporter:v1.9.0 podman save quay.io/prometheuscommunity/elasticsearch-exporter:v1.9.0 > elasticsearch-exporter-v1.9.0.tar - 準備啟用 openshift logging 收集 user workload 的 configmap 設定檔
echo 'apiVersion: v1 kind: ConfigMap metadata: name: cluster-monitoring-config namespace: openshift-monitoring data: config.yaml: | enableUserWorkload: true' > cm.yaml - 先撰寫客製化的 helm
values.yaml範本 (實際到客戶端會再根據環境修改成對應的設定值)執行結果:nano custom-values.yamlimage: repository: quay.kubeantony.com:8443/library/prometheuscommunity/elasticsearch-exporter tag: "v1.9.0" pullPolicy: IfNotPresent podSecurityContext: runAsNonRoot: true runAsUser: 1000790001 seccompProfile: type: "RuntimeDefault" securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true resources: requests: cpu: 100m memory: 128Mi limits: cpu: 100m memory: 128Mi nodeSelector: node-role.kubernetes.io/logging: "" tolerations: [] es: uri: https://admin:admin123@elasticsearch-sample-elastic.apps.topgun.kubeantony.com sslSkipVerify: true - 撰寫 prometheus 收集 elasticsearch metrics 需要的 service monitor yaml 設定檔檔案內容如下:
nano es-service-monitor.yamlapiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: ealsticsearch-monitor namespace: elastic spec: endpoints: - interval: 30s port: http scheme: http selector: matchLabels: app.kubernetes.io/instance: prometheus-elasticsearch-exporter - 將整個專案目錄壓縮成一個檔案,之後可直接提供給客戶
cd ..; tar -zcvf es-exporter.tar.gz es-exporter/
3. 開始設定與安裝 Elasticsearch Metrics Exporter
將
es-exporter.tar.gz壓縮檔上傳至客戶 ocp 環境的 bastion 主機scp es-exporter.tar.gz <user>:<host_ip>:<folder>for example:
scp es-exporter.tar.gz ansible@10.21.104.120:.解壓縮
es-exporter.tar.gz檔案tar -zxvf /PATH/TO/es-exporter.tar.gz -C <DST_Folder>for example:
tar -zxvf /home/ansible/es-exporter.tar.gz -C elk/切換至工作目錄
cd ~/elk/es-exporter/將
prometheus-elasticsearch-exportercontainer image 的打包檔還原成 imagepodman load < elasticsearch-exporter-v1.9.0.tar修改 container image 名稱用以符合客戶環境
podman tag quay.io/prometheuscommunity/elasticsearch-exporter:v1.9.0 docph01.cbsd.scsb.com.tw/ocp4/elk/elasticsearch-exporter:v1.9.0確認是否登入 Image Registry
podman login --get-login docph01.cbsd.scsb.com.tw執行結果:
admin將 container image 推送至客戶 Image Registry
podman push docph01.cbsd.scsb.com.tw/ocp4/elk/elasticsearch-exporter:v1.9.0安裝 helm 指令
tar -zxvf helm-v4.0.1-linux-amd64.tar.gz; \ mv linux-amd64/helm /usr/local/bin/修改 helm
values.yaml用以符合客戶 ocp 環境nano custom-values.yaml主要會需要設定以下項目:
image.repository: container image 名稱podSecurityContext.runAsUser: pod 須以什麼 user 執行,可根據以下命令得知 namespace 底下可用的 uid 範圍執行結果:oc get ns elastic -o yaml | grep uid-openshift.io/sa.scc.uid-range: 1000780000/10000resources: 設定 cpu 和 記憶體可用或上限的資源nodeSelector: 設定 pod 要跑在帶有什麼 label 的節點上tolerations: 如果該節點有 taints 需設定 tolerations 來容忍這些 taints,否則 pod 將無法被指派到該節點es.url: elasticsearch url 的位置
檔案內容:
image: repository: docph01.cbsd.scsb.com.tw/ocp4/elk/elasticsearch-exporter tag: "v1.9.0" pullPolicy: IfNotPresent podSecurityContext: runAsNonRoot: true runAsUser: 1000780001 seccompProfile: type: "RuntimeDefault" securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true resources: requests: cpu: 100m memory: 128Mi limits: cpu: 100m memory: 128Mi nodeSelector: node-role.kubernetes.io/logging: "" tolerations: - effect: NoSchedule key: logging operator: Equal value: reserved - effect: NoExecute key: logging operator: Equal value: reserved es: uri: https://elastic:1B91L1oPibVZ430p95wS3ljs@elasticsearch-elastic.apps.ocp.cbsd.scsb.com.tw sslSkipVerify: true查找 kubeconfig 位置
echo $KUBECONFIG執行結果:
/source/OCP_4.14_CLI_and_YAMLs/OCP_YAMLs/ign-workdir/auth/kubeconfig透過 helm 安裝
prometheus-elasticsearch-exporterhelm --kubeconfig=/source/OCP_4.14_CLI_and_YAMLs/OCP_YAMLs/ign-workdir/auth/kubeconfig \ upgrade --install prometheus-elasticsearch-exporter ./prometheus-elasticsearch-exporter-7.0.0.tgz \ -f custom-values.yaml檢視
prometheus-elasticsearch-exporterpod 運作狀態oc -n elastic get pods執行結果:
NAME READY STATUS RESTARTS AGE elasticsearch-es-data-nodes-0 1/1 Running 2 (5h7m ago) 5h8m elasticsearch-es-data-nodes-1 1/1 Running 2 (5h7m ago) 5h8m elasticsearch-es-data-nodes-2 1/1 Running 2 (5h7m ago) 5h8m elasticsearch-es-master-nodes-0 1/1 Running 2 (5h7m ago) 5h8m elasticsearch-es-master-nodes-1 1/1 Running 2 (5h7m ago) 5h8m elasticsearch-es-master-nodes-2 1/1 Running 2 (5h7m ago) 5h8m kibana-kb-688b58f67f-8jq4n 1/1 Running 0 5h8m prometheus-elasticsearch-exporter-7b9d89dcd9-xx68g 1/1 Running 0 4h51m設定 openshift monitoring 允許收集自定義的 metrics
oc apply -f cm.yaml設定 openshift monitoring 要去收集 elasticsearch metrics expose 出來的 metrics
oc apply -f es-service-monitor.yaml檢視 servicemonitors 是否正常部署
oc -n elastic get servicemonitors執行結果:
NAME AGE ealsticsearch-monitor 4h54m
4. 驗證 Prometheus 是否可收集到 Elasticsearch 的 metrics
創建一個
serviceAccount並賦予相應的權限來驗證 prometheus 有收集到 elasticsearch 的 metricsoc create sa monitor-reader oc adm policy add-cluster-role-to-user cluster-monitoring-view -z monitor-reader為
serviceAccount建立 secret 來獲取永久的 tokencat <<EOF | oc apply -f - apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: monitor-reader-token annotations: kubernetes.io/service-account.name: "monitor-reader" EOF獲取 monitor-reader
serviceAccount的 tokenecho "Bearer $(oc get secret monitor-reader-token -o jsonpath='{.data.token}' | base64 -d)"執行結果:
Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ilc4Y0dnOC1JMTVWZ1Zwd3kzVFpxdjlFeUJybWlnREJFcUlkZGdOanZFdlEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJvcGVuc2hpZnQtbW9uaXRvcmluZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJtb25pdG9yLXJlYWRlci10b2tlbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJtb25pdG9yLXJlYWRlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjFhNjllNzJhLTU3YzAtNDJiYi1iMTU0LTVjMWUwYzgyYjllZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpvcGVuc2hpZnQtbW9uaXRvcmluZzptb25pdG9yLXJlYWRlciJ9.ahjR-seVoZI6YiKNCKovP9TaIqAuy4rTRbYaZEb1xwHfy3FTowvrtZyi5zdYNHx4r5-Ry7M7edQUPFY4CCTdd8sbt3q-jD2rAankCIanKzCf02D_QVvPB2so1zdxdsVDBgx71tLTsx7k2wzzsefoL0QRnPcYA-nJJjMxeg2Rrzn2g8dNQm65sTl-ZAfunZq5UlqIs-UYhrM5DGZ0_EbQRtLgEdW91h_OGa0KFEtwsjXL_f8k4cPZydk63du4qwXeW0MLrHAQXRc6UAkG7Pl3GuPeqUdaSIafwywPOVv_BHBRKJl8FKtnBcYRuV7MFrqLsdjkfGO8XcWciIQzKn_2x33wb4kLGVeVKebU_72xVzqdgxCFSXNjO-tz3IF2DITByXxVGRoNv0y--sPxgldznDLSqUsoKBnpkjlnzA_rGUvTr7cy9r-Rj5uRDgO8pUFrptTldhlJxm5Dtfej_-jGuXysDkREBGs4SKond98WcKVYdIRWzjvY0Kgha7bdx6gmmysRdd2-5y_ffS6ruO-jikl82A-Bt2-7BjK2MdzNvDReD6SJ8zQXkG6_-oUPY_i0UR3PTidO71pORW4q0YxjVKD-si3wnot98A6HDCnCXkUAOgAA5SD8k0uzegeHL9Gbktqghuy9eL2PJyomSknxQoqQx9L4j2HsjOUkg70zIKA獲得
thanos-querier的 host 跟 pathoc -n openshift-monitoring get route執行結果:
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD alertmanager-main alertmanager-main-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw /api alertmanager-main web reencrypt/Redirect None prometheus-k8s prometheus-k8s-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw /api prometheus-k8s web reencrypt/Redirect None prometheus-k8s-federate prometheus-k8s-federate-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw /federate prometheus-k8s web reencrypt/Redirect None thanos-querier thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw /api thanos-querier web reencrypt/Redirect None查找
thanos-querierfqdn 對應的 ipdig thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw +short執行結果:
10.21.107.50因當前操作的實體主機網路無法直接存取透過 route 對外的 openshift 服務,故建立 ssh tunnel
ssh -L 10000:10.21.107.50:443 ansible@10.21.104.120輸入密碼登入,並執行 top 避免被自動登出,造成 ssh tunnel 終止
在本機
/etc/hosts添加一筆名稱解析sudo nano /etc/hosts添加以下檔案內容:
127.0.0.1 thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw在實體主機的 Google Chrome 瀏覽器安裝
ModHeader插件設定
ModHeader插件- 點選
+Mod,並選擇Request headers,然後依序填入以下設定:name: Authorization value: 複製貼上第三步驟(獲取 monitor-reader `serviceAccount` 的 token)的執行結果 - 點選
Filter,並選擇Request URL filters,然後輸入以下內容:https://thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw:10000/.*
- 點選
打開 Google Chrome 瀏覽器,連線測試是否可正常 query
https://thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw:10000/api/v1/query?query=up確認網路可正常連線到 ocp 叢集裡面的 thanos-querier 服務後,查詢 elasticsearch 的 metrics name 確認是否有成功收集
https://thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw:10000/api/v1/query?query=elasticsearch_thread_pool_completed_count
5. 設定 Grafana 呈現 Prometheus 收集到的 Elasticsearch Metrics
打開 Google Chrome 瀏覽器,並連線至 Grafana
https://10.21.104.120登入 Grafana
新增 Data Sources,點選左側選單 -> Connections -> Data Sources -> 右上角 Add new data source
選擇 prometheus
輸入 prometheus 連線資訊:
name: ocp-prometheus Connection Prometheus server URL: https://thanos-querier-openshift-monitoring.apps.ocp.cbsd.scsb.com.tw TLS settings 勾選 Skip TLS certificate validation 展開 HTTP headers Add header Header: Authorization Value: 複製貼上第三步驟(獲取 monitor-reader `serviceAccount` 的 token)的執行結果確認沒問題後,滑鼠滾到頁面最下面點選
Save & test按鈕確認有出現綠色區塊的連線成功資訊
匯入 DashBorad,點選左側選單 Dashboard -> Elastic Folder ->