一、关于 Calico Felix, Typha 和 kube-controllers 组件
Felix 是一个守护进程,运行在每台机器上实现网络策略等功能,Felix 是 calico 的大脑。
Typha 是一组可选的 pod,可扩展 Felix 以扩展 Calico 节点和数据存储之间的流量。
kube-controllers pod 运行一组控制器,这些控制器负责各种控制平面功能,例如资源垃圾收集和与 Kubernetes API 的同步。
二、 配置 calico 允许 metrics 上报
1. Felix 配置
Felix prometheus metrics 默认是禁用的,需要手动更改 Felix 的配置(prometheusMetricsEnabled)
1
2
|
# kubectl patch felixConfiguration default --patch '{"spec":{"prometheusMetricsEnabled": true}}' --type=merge
felixconfiguration.crd.projectcalico.org/default patched
|
确认变更成功:
1
2
3
4
5
6
7
|
# kubectl get felixConfiguration default -o yaml
……
spec:
bpfLogLevel: ""
logSeverityScreen: Info
prometheusMetricsEnabled: true #prometheusMetricsEnabled 是 true
reportingInterval: 0s
|
2. 创建 service 暴露 Felix metrics
Prometheus 使用 Kubernetes 服务动态发现 endpoint,创建一个名为 felix-metrics-svc 的服务,让 Prometheus 去发现所有的 Felix metrics endpoints。
Felix 默认使用 9091 TCP 上报他的 metrics
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: calico-felix-metrics
name: calico-felix-metrics
namespace: calico-system
spec:
selector:
k8s-app: calico-node
ports:
- port: 9091
targetPort: 9091
name: felix-metrics
EOF
|
3. Typha 配置
确认在集群中使用了 Typha
1
2
3
4
|
# kubectl get pods -A | grep typha
calico-system calico-typha-b4d7d885b-24kpd 1/1 Running 0 45h
calico-system calico-typha-b4d7d885b-pdb5k 1/1 Running 0 45h
calico-system calico-typha-b4d7d885b-rqqcd 1/1 Running 1 2d16h
|
Typha 没有对应的 crd, PrometheusMetricsEnabled 需要在 custom-resources.yml 中加入typhaMetricsPort 选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# vim custom-resources.yml
# This section includes base Calico installation configuration.
# For more information, see: https://docs.projectcalico.org/v3.21/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
- blockSize: 26
cidr: 172.248.0.0/16
encapsulation: None
natOutgoing: Enabled
nodeSelector: all()
registry: xxxxxxxx.local
imagePath: k8s-image/calico
nodeMetricsPort: 9091 # 设置 felix prometheusMetricsEnabled=true 端口 9091,也可以通过修改 felixConfiguration 实现
typhaMetricsPort: 9093 # 设置 typha prometheusMetricsEnabled=true 端口 9093
---
# This section configures the Calico API server.
# For more information, see: https://docs.projectcalico.org/v3.21/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
|
重新应用
1
|
kubectl apply -f custom-resources.yml
|
4. 创建 service 暴露 Typha metrics
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: calico-typha-metrics
name: calico-typha-metrics
namespace: calico-system
spec:
selector:
k8s-app: calico-typha
ports:
- port: 9093
targetPort: 9093
name: typha-metrics
EOF
|
5. kube-controllers 配置
kube-controllers prometheus metrics 默认是启动的,使用 9094 TCP 端口。可以通过修改 KubeControllersConfiguration 资源调整端口。
1
2
|
不修改默认端口无需执行此步骤
# kubectl patch kubecontrollersconfiguration default --patch '{"spec":{"prometheusMetricsPort": 9095}}'
|
6. 创建 service 暴露 kube-controllers metrics
在calico 的安装中已经默认创建了 kube-controllers metrics 的service,以下步骤可以跳过
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: calico-kube-controllers
name: calico-kube-controllers-metrics
namespace: calico-system
spec:
selector:
k8s-app: calico-kube-controllers
ports:
- port: 9094
targetPort: 9094
name: kube-controllers-metrics
EOF
|
查看 port name
1
2
3
4
5
6
7
|
# kubectl get svc -n calico-system calico-kube-controllers-metrics -o yaml | grep ports: -A4
ports:
- name: metrics-port
port: 9094
protocol: TCP
targetPort: 9094
|
kube-controllers metrics service 的port name 为 metrics-port
三、prometheus 采集指标
1. 创建ServiceMonitor
kube-prometheus-stack在部署时会创建 Prometheus、PodMonitor、ServiceMonitor、AlertManager 和 PrometheusRule 这 5 个 CRD 资源对象,然后会一直监控并维持这 5 个资源对象的状态。
- Prometheus 这个资源对象就是对 Prometheus Server 的抽象。
- PodMonitor 和 ServiceMonitor 就是 exporter 的各种抽象,是用来提供专门提供指标数据接口的工具,
- Prometheus 就是通过 PodMonitor 和 ServiceMonitor 提供的指标数据接口去 pull 数据的。
- ServiceMonitor 要求被监控的服务必须有对应的 Service。
- PodMonitor 虽然不需要应用创建相应的 Service,但必须在 Pod 中指定指标的端口和名称。
我们已经创建了对应的 service,所有使用 ServiceMonitor 来采集指标。使用以下 yaml 创建 ServiceMonitor 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# vim prometheus-ServiceMonitorCalico.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
release: prometheus # 必须添加此 label,因为 prometheus 的对象 serviceMonitorSelector 匹配 release: prometheus 的 ServiceMonitor
name: prometheus-calico-felix-metrics
namespace: monitoring
spec:
endpoints:
- interval: 15s
path: /metrics
port: felix-metrics
namespaceSelector:
matchNames:
- calico-system
selector:
matchLabels:
k8s-app: calico-felix-metrics
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
release: prometheus
name: prometheus-calico-typha-metrics
namespace: monitoring
spec:
endpoints:
- interval: 15s
path: /metrics
port: typha-metrics
namespaceSelector:
matchNames:
- calico-system
selector:
matchLabels:
k8s-app: calico-typha-metrics
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
release: prometheus
name: prometheus-calico-kube-controllers-metrics
namespace: monitoring
spec:
endpoints:
- interval: 15s
path: /metrics
port: kube-controllers-metrics
namespaceSelector:
matchNames:
- calico-system
selector:
matchLabels:
k8s-app: calico-kube-controllers
|
在这段YAML文件中,各代码段的含义如下:
-
metadata下的name和namespace将指定ServiceMonitor所需的一些关键元信息。
-
spec的endpoints为服务端点,代表Prometheus所需的采集Metrics的地址。endpoints为一个数组,同时可以创建多个endpoints。每个endpoints包含三个字段,每个字段的含义如下:
- interval:指定Prometheus对当前endpoints采集的周期。
- path:指定Prometheus的采集路径。
- port:指定采集数据需要通过的端口,设置的端口为创建Service时端口所设置的name。
-
spec的namespaceSelector为需要发现的Service的范围。namespaceSelector包含两个互斥字段,字段的含义如下:
- any:有且仅有一个值true,当该字段被设置时,将监听所有符合Selector过滤条件的Service的变动。
- matchNames:数组值,指定需要监听的namespace的范围
-
spec的selector用于选择Service。
应用 ServiceMonitor
1
2
3
4
|
# kubectl apply -f prometheus-ServiceMonitorCalico.yaml
servicemonitor.monitoring.coreos.com/felix-metrics created
servicemonitor.monitoring.coreos.com/typha-metrics created
servicemonitor.monitoring.coreos.com/kube-controllers-metrics create
|
2. 检查 target
登录 Prometheus dashboard 查看新建的 target 是否正常
3. Grafana 查看
导入 typha-dashboard.json 和 felix-dashboard.json 两个 dashbaord
felix:
typha:
四、 已知问题
-
在 Typha 配置 中打开了 typha 的 TYPHA_PROMETHEUSMETRICSENABLED 选项,但是一段时间后会被自动重置(如上面的target图)
已经解决,在 custom-resources.yml 中添加 spec.typhaMetricsPort=9091
选项重新应用
-
grafana 暂时没有找到监控 typha 和 calico-kube-controllers 的 dashbaord
已经有Felix 和 typha 的监控 dashboard