您好,登錄后才能下訂單哦!
1、Prometheus的數據指標是通過一個公開的 HTTP(S) 數據接口獲取到的,我們不需要單獨安裝監控的 agent,只需要暴露一個 metrics 接口,Prometheus 就會定期去拉取數據;對于一些普通的 HTTP 服務,我們完全可以直接重用這個服務,添加一個/metrics接口暴露給 Prometheus
2、有一些服務即使沒有原生集成該接口,也完全可以使用一些 exporter 來獲取到指標數據,比如 mysqld_exporter、node_exporter,redis-exporter,這些 exporter 就有點類似于傳統監控服務中的 agent,用來收集目標服務的指標數據然后直接暴露給 Prometheus。
監控自帶metric接口的Traefik
1、修改其配置文件traefik.toml,增加如下內容,開啟metirc接口
[metrics]
[metrics.prometheus]
entryPoint = "traefik"
buckets = [0.1, 0.3, 1.2, 5.0]
2、然后更新traefik configmap及traefik pod
$ kubectl get configmap -n kube-system
traefik-conf 1 83d
$ kubectl delete configmap traefik-conf -n kube-system
$ kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system
$ kubectl apply -f traefik.yaml
$ kubectl get svc -n kube-system |grep traefik
traefik-ingress-service NodePort 10.100.222.78 <none> 80:31657/TCP,8080:31572/TCP
$ curl 10.100.222.78:8080/metrics
$ curl 192.168.1.243:31572/metrics
3、更新prometheus的配置文件,增加job
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-ops
data:
prometheus.yml: |
global:
scrape_interval: 30s
scrape_timeout: 30s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'traefik'
static_configs:
- targets: ['traefik-ingress-service.kube-system.svc.cluster.local:8080']
$ kubectl apply -f prome-cm.yaml #更新prometheus configemap文件
由于我們這里 Traefik 對應的 servicename 是traefik-ingress-service,并且在 kube-system 這個 namespace 下面,所以我們這里的targets的路徑配置則需要使用FQDN的形式:traefik-ingress-service.kube-system.svc.cluster.local
$ kubectl get svc -n kube-ops |grep prometheus
prometheus NodePort 10.102.197.83 <none> 9090:32619/TCP
$ curl -X POST "http://192.168.1.243:32619/-/reload" #使配置生效,可能需要一段時間,使用reload命令不用更新prometheus pod即可使配置生效
使用redis-exporter來監控 redis 服務
redis-exporter以sidecar的形式和redis部署在同一個pod內
1、構建pod及svc
$ docker pull redis:4
$ docker pull oliver006/redis_exporter:latest
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: redis
namespace: kube-ops
spec:
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9121"
labels:
app: redis
spec:
containers:
- name: redis
image: redis:4
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 6379
- name: redis-exporter
image: oliver006/redis_exporter:latest
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 9121
---
kind: Service
apiVersion: v1
metadata:
name: redis
namespace: kube-ops
spec:
selector:
app: redis
ports:
- name: redis
port: 6379
targetPort: 6379
- name: prom
port: 9121
targetPort: 9121
$ kubectl get svc -n kube-ops |grep redis
redis ClusterIP 10.105.241.59 <none> 6379/TCP,9121/TCP
$ curl 10.105.241.59:9121/metrics #查看是否能監控到
2、增加job并更新prometheus configmap配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-ops
data:
prometheus.yml: |
global:
scrape_interval: 30s
scrape_timeout: 30s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'traefik'
static_configs:
- targets: ['traefik-ingress-service.kube-system.svc.cluster.local:8080']
- job_name: 'redis'
static_configs:
- targets: ['redis:9121']
由于我們這里的 redis 服務和 Prometheus 處于同一個 namespace,所以我們直接使用 servicename
$ kubectl apply -f prometheus-cm.yaml #更新配置
$ kubectl get svc -n kube-ops |grep prometheus
prometheus NodePort 10.102.197.83 <none> 9090:32619/TCP
$ curl -X POST "http://10.102.197.83:9090/-/reload" #使配置生效
http://http://192.168.1.243:32619/targets
使用node-exporter監控k8s集群中的所有節點及每個節點的kubelet
1、部署node-exporter
通過 DaemonSet 控制器來部署該服務,這樣每一個節點都會自動運行一個這樣的 Pod
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter
namespace: kube-ops
labels:
name: node-exporter
spec:
template:
metadata:
labels:
name: node-exporter
spec:
hostPID: true
hostIPC: true
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter:v0.16.0
ports:
- containerPort: 9100
resources:
requests:
cpu: 0.15
securityContext:
privileged: true
args:
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- '"^/(sys|proc|dev|host|etc)($|/)"'
volumeMounts:
- name: dev
mountPath: /host/dev
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: rootfs
mountPath: /rootfs
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
由于我們要獲取到的數據是主機的監控指標數據,而我們的 node-exporter 是運行在容器中的,所以我們在 Pod 中需要配置一些 Pod 的安全策略,這里我們就添加了hostPID: true、hostIPC: true、hostNetwork: true3個策略,用來使用主機的 PID namespace、IPC namespace 以及主機網絡,這些 namespace 就是用于容器隔離的關鍵技術,要注意這里的 namespace 和集群中的 namespace 是兩個完全不相同的概念。
由于指定了hostNetwork=true,所以在每個節點上就會綁定一個端口 9100,我們可以通過這個端口去獲取到監控指標數據
$ curl 127.0.0.1:9100/metrics
$ curl 127.0.0.1:10255/metrics #通過10255端口監控kubelet
2、增加job,更新prometheus配置
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-ops
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'traefik'
static_configs:
- targets: ['traefik-ingress-service.kube-system.svc.cluster.local:8080']
- job_name: 'redis'
static_configs:
- targets: ['redis:9121']
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: 'kubernetes-kubelet'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:10255'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
在 Kubernetes 下,Promethues 通過與 Kubernetes API 集成,目前主要支持5種服務發現模式,分別是:Node、Service、Pod、Endpoints、Ingress。
kubelet默認監聽的端口,分別為 10250 、10255、10248
$ vim /var/lib/kubelet/config.yaml
healthzPort: 10248
port: 10250
readOnlyPort: 10255
prometheus 去發現 Node 模式的服務的時候,訪問的端口默認是10250,而現在該端口下面已經沒有了/metrics指標數據了,現在 kubelet 只讀的數據接口統一通過10255端口進行暴露了,所以我們應該去替換掉這里的端口,但是我們是要替換成10255端口嗎?不是的,因為我們是要去配置上面通過node-exporter抓取到的節點指標數據,而我們上面是不是指定了hostNetwork=true,所以在每個節點上就會綁定一個端口9100,所以我們應該將這里的10250替換成9100
$ kubectl apply -f prometheus-cm.yaml
$ kubectl get svc -n kube-ops |grep prometheus
prometheus NodePort 10.102.197.83 <none> 9090:32619/TCP
$ curl -X POST "http://10.102.197.83:9090/-/reload" #使配置生效
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。