簡(jiǎn)介
- 系列文章: 標(biāo)簽 - Prometheus - 東風(fēng)微鳴技術(shù)博客 (ewhisper.cn)
- Prometheus Operator 的上一篇: Prometheus Operator 與 kube-prometheus 之一 - 簡(jiǎn)介 - 東風(fēng)微鳴技術(shù)博客 (ewhisper.cn)
kube-prometheus-stack捆綁了監(jiān)控Kubernetes 集群所需的Prometheus Operator豺旬、Exporter案糙、Rule循榆、Grafana 和 AlertManager并淋。
但要為使用kubeadm構(gòu)建的Kubernetes集群定制Helm安裝沐寺,還是有必要進(jìn)行定制色瘩。
這一次結(jié)合近期比較新的 Kubernetes 版本 v1.23+, 以及較為常見的安裝方式 kubeadm, 來實(shí)戰(zhàn)說明:
- kubeadm 需要哪些特殊配置
- 如何安裝 Prometheus Operator: 通過 kube-prometheus-stack helm chart
- 如何配置對(duì) kubeadm 安裝的集群的組件監(jiān)控
開始!
前提條件
- kubeadm
- helm3
kubeadm 需要哪些特殊配置
為了后面能夠正常通過 Prometheus Operator 獲取到 kubeadm 搭建的 Kubernetes v1.23+ 集群的指標(biāo), 需要對(duì) kubeadm 做一些特殊配置.
默認(rèn)情況下单绑,kubeadm將它的幾個(gè)管理組件綁定到 node 的 localhost
127.0.0.1
地址上, 涉及到: Kube Controller Manager嘱函、Kube Proxy和Kube Scheduler币厕。
然而庆冕,對(duì)于監(jiān)控來說,我們需要這些端點(diǎn)的暴露劈榨,以便他們的指標(biāo)可以被Prometheus提取访递。因此,我們需要將這些組件暴露在他們的 0.0.0.0 地址上同辣。
當(dāng)?shù)卿浀絢ubeadm主節(jié)點(diǎn)時(shí)拷姿,運(yùn)行以下修改:
Controller Manager 和 Scheduler 組件
默認(rèn)情況下惭载,kubeadm
并沒有公開我們要監(jiān)控的兩個(gè)服務(wù)(kube-controller-manager 和 kube-scheduler)。因此响巢,為了充分利用kube-prometheus-stack
helm chart描滔,我們需要對(duì)Kubernetes集群做一些快速調(diào)整。后面我們會(huì)監(jiān)控kube-controller-manager和kube-scheduler踪古,我們必須將它們的地址端口暴露給集群含长。
默認(rèn)情況下,kubeadm 在你的主機(jī)上運(yùn)行這些 pod伏穆,并綁定到 127.0.0.1拘泞。有幾種方法可以改變這一點(diǎn)。建議改變這些配置的方法是使用 kubeadm config file枕扫。下面是配置示例:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
...
controllerManager:
extraArgs:
bind-address: "0.0.0.0"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
...
kubernetesVersion: "v1.23.1"
...
??上面的 .scheduler.extraArgs
和 .controllerManager.extraArgs
陪腌。這樣就把 kube-controller-manager
和 kube-scheduler
服務(wù)暴露給集群的其他組件。
另外, 如果你把 kubernetes 核心組件作為pods放在 kube-system namespace烟瞧,就要確保kube-prometheus-exporter-kube-scheduler
和 kube-prometheus-exporter-kube-controller-manager
service (這 2 個(gè) service 是 kube-prometheus-stack 創(chuàng)建出來用于 Prometheus Operator 通過 ServiceMonitor 監(jiān)控這兩個(gè)組件用的)的spec.selector
值與pods的值一致诗鸭。
如果你已經(jīng)有一個(gè)部署了 kubeadm 的Kubernetes,可以直接 kube-controller-manager 和 kube-scheduler 的監(jiān)聽地址:
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml
Kube Proxy 組件
??Notes:
一般情況下, kube-proxy 總是綁定所有地址的, 但是對(duì)應(yīng)的metricsBindAddress
可能并不一定會(huì)follow 配置. 具體如下面的"改動(dòng)前"
對(duì)于 Kube Proxy 組件, 在使用 kubeadm 安裝完成之后, 需要修改 kube-system 下的 configmap kube-proxy 的 metricsBindAddress
.
改動(dòng)如下:
改動(dòng)前:
...
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 127.0.0.1:10249
...
改動(dòng)后:
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
并重啟:
kubectl -n kube-system rollout restart daemonset/kube-proxy
Etcd 配置
Etcd 配置, 這里就不詳細(xì)說明了, 可以直接參見: Prometheus Operator 監(jiān)控 etcd 集群-陽(yáng)明的博客
但是上面鏈接提到的方法比較麻煩, 推薦一個(gè)更簡(jiǎn)單的: 可以在 etcd 的配置中加上監(jiān)聽 Metrics URL 的flag:
# 在 etcd 所在的機(jī)器上
master_ip=192.168.1.5
sed -i "s#--listen-metrics-urls=.*#--listen-metrics-urls=http://127.0.0.1:2381,http://$master_ip:2381#" /etc/kubernetes/manifests/etcd.yaml
驗(yàn)證 kubeadm 配置
小結(jié)一下, 通過之前的這些配置, Kubernetes 組件的 Metrics 監(jiān)聽端口分別為:
- Controller Manager: (Kubernetes v1.23+)
- 端口: 10257
- 協(xié)議: https
- Scheduler: (Kubernetes v1.23+)
- 端口: 10259
- 協(xié)議: https
- Kube Proxy
- 端口: 10249
- 協(xié)議: http
- etcd
- 端口: 2381
- 協(xié)議: http
可以通過 netstat
命令查看之前的配置是否全部生效:
在 master 和 etcd node 上執(zhí)行:
$ sudo netstat -tulnp | grep -e 10257 -e 10259 -e 10249 -e 2381
tcp 0 0 192.168.1.5:2381 0.0.0.0:* LISTEN 1400/etcd
tcp 0 0 127.0.0.1:2381 0.0.0.0:* LISTEN 1400/etcd
tcp6 0 0 :::10257 :::* LISTEN 1434/kube-controlle
tcp6 0 0 :::10259 :::* LISTEN 1486/kube-scheduler
tcp6 0 0 :::10249 :::* LISTEN 4377/kube-proxy
# 測(cè)試etcd指標(biāo)
curl -k http://localhost:2381/metrics
# 測(cè)試 kube-proxy 指標(biāo)
curl -k http://localhost:10249/metrics
通過 kube-prometheus-stack 安裝并定制 helm values
這里直接完成上面提到的 2 步:
- 如何安裝 Prometheus Operator: 通過 kube-prometheus-stack helm chart
- 如何配置對(duì) kubeadm 安裝的集群的組件監(jiān)控
在我們用 Helm 安裝kube-prometheus-stack之前参滴,我們需要?jiǎng)?chuàng)建一個(gè)values.yaml來調(diào)整kubeadm 集群的默認(rèn) chart value强岸。
為 Prometheus 和 AlertManager 配置持久化存儲(chǔ)
推薦要為 Prometheus 和 AlertManager 配置持久化存儲(chǔ), 而不要直接使用 emptyDir.
存儲(chǔ)具體如何配置根據(jù)您的集群的實(shí)際情況來, 這邊就不做過多介紹.
etcd 相關(guān)配置
Kubeadm etcd 監(jiān)控的端口是 2381(而不是Helm chart中指定的默認(rèn)值: 2379)],所以我們需要明確覆蓋這個(gè)值砾赔。
kubeEtcd:
enabled: true
service:
enabled: true
port: 2381
targetPort: 2381
Controller Manger 相關(guān)配置
這里不需要做太多配置, 關(guān)于 https 和 端口, 如果相關(guān) key 為空或未設(shè)置蝌箍,該值將根據(jù)目標(biāo)Kubernetes 版本動(dòng)態(tài)確定,原因是默認(rèn)端口在Kubernetes 1.22中的變化过蹂。注意下面的: .kubeControllerManager.service.port
和 .kubeControllerManager.service.targetPort
以及 .kubeControllerManager.serviceMonitor.https
和 .kubeControllerManager.serviceMonitor.insecureSkipVerify
.
如果配置后監(jiān)控抓不到或有異常, 可以按實(shí)際情況調(diào)整.
kubeControllerManager:
enabled: true
...
service:
enabled: true
port: null
targetPort: null
serviceMonitor:
enabled: true
...
https: null
insecureSkipVerify: null
...
Kubernetes Scheduler
同上, 這里不需要做太多配置, 關(guān)于 https 和 端口, 如果相關(guān) key 為空或未設(shè)置十绑,該值將根據(jù)目標(biāo)Kubernetes 版本動(dòng)態(tài)確定,原因是默認(rèn)端口在Kubernetes 1.23中的變化酷勺。注意下面的: .kubeScheduler.service.port
和 .kubeScheduler.service.targetPort
以及 .kubeScheduler.serviceMonitor.https
和 .kubeScheduler.serviceMonitor.insecureSkipVerify
.
如果配置后監(jiān)控抓不到或有異常, 可以按實(shí)際情況調(diào)整.
kubeScheduler:
enabled: true
...
service:
enabled: true
port: 10259
targetPort: 10259
serviceMonitor:
enabled: true
...
https: true
insecureSkipVerify: true
...
Kubernetes Proxy
也是如此, 根據(jù) 是否 https 和 端口進(jìn)行調(diào)整, 如下:
kubeProxy:
enabled: true
endpoints: []
service:
enabled: true
port: 10249
targetPort: 10249
serviceMonitor:
enabled: true
...
https: false
...
通過 Helm 安裝 kube-prometheus-stack
添加 Helm 倉(cāng)庫(kù):
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo list
helm repo update prometheus-community
安裝:
helm upgrade --install \
--namespace prom \
--create-namespace \
-f values.yaml \
monitor prometheus-community/kube-prometheus-stack
驗(yàn)證
這里主要驗(yàn)證 kubeadm 的 Kubernetes 組件有沒有正常監(jiān)控到, 可以通過 Prometheus UI 或 Grafana UI 直接查看進(jìn)行驗(yàn)證.
可以通過 Ingress 或 NodePort 將 Prometheus UI 或 Grafana UI 地址暴露出去, 然后訪問:
Status -> Targets 查看監(jiān)控狀態(tài), 這里舉幾個(gè)組件來進(jìn)行說明:
Grafana 可以直接登錄后查看對(duì)應(yīng)的儀表板, 如下圖:
??????
??? 參考文檔
- helm-charts/charts/kube-prometheus-stack at main · prometheus-community/helm-charts (github.com)
- Deploy to kubeadm - Prometheus Operator (prometheus-operator.dev)
- Prometheus Operator 監(jiān)控 etcd 集群-陽(yáng)明的博客
- Prometheus: installing kube-prometheus-stack on a kubeadm cluster | Fabian Lee : Software Engineer
本文由東風(fēng)微鳴技術(shù)博客 EWhisper.cn 編寫本橙!