自從 上次 介紹了 Prometheus 之后瘦材,就想到要在 k8s 中使用了厅须,不過,在這之前食棕,先介紹下 k8s 的監(jiān)控朗和。
k8s 的監(jiān)控
k8s 默認以及推薦的監(jiān)控體系是它自己的一套東西:Heapster + cAdvisor + Influxdb + Grafana,具體可以看 這里 簿晓。
包括 k8s 自身的 HPA (Horizontal Pod Autoscaler)眶拉,默認從 Heapster 中獲取數(shù)據(jù)進行自動伸縮。(順便提一句憔儿,當你部署完 k8s 集群之后忆植,如果從 Dashboard 中看不到監(jiān)控數(shù)據(jù),往往就是因為你沒有部署 Heapster谒臼,或者網(wǎng)絡層有問題朝刊, Dashboard 無法訪問 Heapster。)
那蜈缤,這跟我們介紹的 Prometheus 有什么關系拾氓?
首先,它們都是一套監(jiān)控解決方案劫樟,而 k8s 沒有把 Prometheus 作為默認監(jiān)控痪枫,因此,如果你想直接使用 HPA叠艳,你還是需要部署 Heapster奶陈。
其次,kubelet 中的 cAdvisor 其實是支持 Prometheus 作為存儲的后端的附较,只是相對于 Prometheus 自己的 SD 解決方案來說吃粒,太弱了點。
最后拒课,k8s 1.6 之后徐勃,在 annotations 中配置 custom metrics 的方式已經(jīng)被移除了,而根據(jù)
Prometheus 的監(jiān)控數(shù)據(jù)來進行自動伸縮還是很有可操作性的早像。
部署
其實部署很簡單僻肖,關鍵是配置,因此這里著重介紹下卢鹦,如何配置臀脏。
Relabel
首先,先來了解下冀自,什么是 relabel_config揉稚。
就如字面意思而言,它的作用是 Prometheus 抓取 metrics 之前熬粗,就將對象相關的 labels 重寫搀玖。下面是它幾個重要的 label:
- __address__:默認為 host:port,也是之后抓取之后 instance 的值驻呐;
- __scheme__:http or https 灌诅?;
- __metrics_path__:就是 metrics path含末,默認為 /metrics延塑;
- __param_${name}:用來作為 URL parameter,比如 http://.../metrics?name=value答渔;
- __meta_:這個開頭的配置都是 SD 相關的配置关带;
Kubernetes SD
其次,上次提到沼撕,我們可以用到 Service Discovery 這個功能宋雏,其中就包含 Kubernetes SD。
它包含四種角色:
- node
- service
- pod
- endpoints
由于篇幅所限务豺,這里只是簡單介紹下其中的 node 還有 pod 角色:
- job_name: 'kubernetes-nodes'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
# 即從 __meta_kubernetes_node_label_<labelname> 這個配置中取出 labelname 以及 value
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# 配置 address 為 k8s api 的地址磨总,相關的 ca 證書以及 token 在上面配置
- target_label: __address__
replacement: kubernetes.default.svc:443
# 取出所有的 node,然后設置 /api/v1/nodes/<node_name>/proxy/metrics 為 metrics path
- source_labels:
- __meta_kubernetes_node_name
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
接下來的這個 pod 角色挺重要:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
在定義了這個角色之后笼沥,你只要在你部署的應用 Pod 描述中蚪燕,加入以下 annotations 就能讓 Prometheus 自動發(fā)現(xiàn)此 Pod 并采集監(jiān)控數(shù)據(jù)了:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "<your app port>"
其它詳細配置請看 這里娶牌。
Kubernetes Deployment
最后,部署 Prometheus馆纳,需要注意的是诗良,我們已經(jīng)在 k8s 之外單獨部署了一套,為了統(tǒng)一處理鲁驶,在這里是打算作為中轉(zhuǎn)的鉴裹。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus
namespace: kube-system
labels:
app: prometheus
data:
prometheus.yml: |-
# 省略,在這里定義你需要的配置
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:latest
args:
- '-config.file=/prometheus-data/prometheus.yml'
# 顯然钥弯,這里沒有用 `Stateful Sets`径荔,存儲時間不用太長
- '-storage.local.retention=48h0m0s'
ports:
- name: prometheus
containerPort: 9090
volumeMounts:
- name: data-volume
mountPath: /prometheus-data
volumes:
- name: data-volume
configMap:
name: prometheus
---
# 簡單處理,直接使用 NodePort 暴露服務脆霎,你也可以使用 Ingress
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: kube-system
spec:
selector:
app: prometheus
ports:
- name: prometheus
protocol: TCP
port: 9090
nodePort: 30090
type: NodePort
Prometheus Federate
而在我們外部單獨的 Prometheus 中总处,需要配置 Federate,將 k8s 中 Prometheus 采集的 metrics 全部同步出來睛蛛。
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job=~".+"}' # 取 k8s 里面部署的 Prometheus 中所有的 job 數(shù)據(jù)
static_configs:
- targets:
- '<k8s-node1>:30090'
- '<k8s-node2>:30090'
- '<k8s-node3>:30090'
原地址:https://xizhibei.github.io/2017/08/19/deploy-prometheus-in-k8s/