本文永久链接: https://www.xtplayer.cn/rke2/monitor-rke2-cluster-certificates-validity/

根据 rke2 官方文档说明 https://docs.rke2.io/reference/metrics ,rke2 目前支持一些指标的输出,比如 rke2_certificate_expiration_seconds。通过 rke2_certificate_expiration_seconds 指标,可以查询 rke2 集群各组件的有效期。并可以通过配置集群监控告警来对证书有效时间进行提醒。

启用 rke2 Metrics 功能

rke2 Metrics 功能默认没有启用,需要在 /etc/rancher/rke2/config.yaml 配置中添加 supervisor-metrics: true 来启用。

通过 rke2 安装脚本或者 rke2 二进制文件部署 rke2 集群

如果是通过 rke2 安装脚本或者 rke2 二进制文件部署的集群,需要在每个 server 节点上创建或者修改 /etc/rancher/rke2/config.yaml 配置文件,添加 supervisor-metrics: true 参数。参数添加之后执行 systemctl restart rke2-server.service 重启服务。重启之后,可以使用以下命令进行测试,

sudo curl -ks --cert /var/lib/rancher/rke2/server/tls/client-admin.crt --key /var/lib/rancher/rke2/server/tls/client-admin.key https://<server_node_ip>:9345/metrics

通过 rancher ui 部署 rke2 集群

如果是通过 rancher ui 部署的 rke2 集群,可以编辑集群的 yaml,在 rkeConfig.machineGlobalConfig 配置下添加 supervisor-metrics: true, 这样添加的所有的 master 节点将自动在 /etc/rancher/rke2/config.yaml.d/50-rancher.yaml 配置中添加 supervisor-metrics: true

rkeConfig:
chartValues:
rke2-calico: {}
dataDirectories: {}
etcd:
snapshotRetention: 5
snapshotScheduleCron: 0 */5 * * *
machineGlobalConfig:
cni: calico
disable:
- rke2-ingress-nginx
- rke2-metrics-server
disable-kube-proxy: false
etcd-expose-metrics: false
supervisor-metrics: true
machinePoolDefaults: {}
machineSelectorConfig:
- config:
protect-kernel-defaults: false
registries: {}
upgradeStrategy:

rke2 集群安装完成或者更新完成之后,可以使用以下命令进行测试,

sudo curl -ks --cert /var/lib/rancher/rke2/server/tls/client-admin.crt --key /var/lib/rancher/rke2/server/tls/client-admin.key https://<server_node_ip>:9345/metrics

创建 svc 和对应的 endpoints

使用以下脚本在 local 集群中创建 svc 和对应的 endpoints,用来将下游集群资源引入 local 集群中,以供监控服务读取。

注意:需要修改其中的集群名称和 master 节点 ip,如果有多个 rke2 集群,则需要运行多次。

export RKE2_CLUSTER_NAME=<自定义下游 rke2 集群名称>
export MASTER_NODE_IPS="192.168.110.200,192.168.110.201"

cat << 'EOF' | envsubst | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
labels:
rke2-cluster: rke2-${RKE2_CLUSTER_NAME}
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export
namespace: cattle-monitoring-system
spec:
clusterIP: None
clusterIPs:
- None
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
- IPv6
ipFamilyPolicy: RequireDualStack
ports:
- name: metrics
port: 9345
protocol: TCP
targetPort: 9345
sessionAffinity: None
type: ClusterIP
EOF

# 将逗号分隔的字符串转换为数组
IFS=',' read -ra IP_ARRAY <<< "$MASTER_NODE_IPS"

# 生成YAML文件
cat <<EOF > endpoints.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export
namespace: cattle-monitoring-system
subsets:
- addresses:
EOF

# 添加每个IP地址
for ip in "${IP_ARRAY[@]}"; do
echo " - ip: $ip" >> endpoints.yaml
done

cat <<EOF >> endpoints.yaml
ports:
- name: metrics
port: 9345
protocol: TCP
EOF

kubectl apply -f endpoints.yaml

创建用于访问下游 rke2 Metrics 端口的认证密文

此步骤在下游集群中执行,每个 rke2 集群中 master 节点的 client-admin.crt 证书都是相同的,因此只需要随便选择一个 master 节点,执行以下命令生成密文 yaml,然后将生成的 yaml,导入到 local 集群中。

export RKE2_CLUSTER_NAME=<自定义下游 rke2 集群名称>

kubectl create secret generic rke2-${RKE2_CLUSTER_NAME}-metrics-export-auth-certs --dry-run=client \
--namespace=cattle-monitoring-system \
--from-file=ca.crt=/var/lib/rancher/rke2/server/tls/server-ca.crt \
--from-file=tls.crt=/var/lib/rancher/rke2/server/tls/client-admin.crt \
--from-file=tls.key=/var/lib/rancher/rke2/server/tls/client-admin.key -oyaml

创建每个下游集群对应的 ServiceMonitor

在 local 集群中执行以下命令,给每个下游集群创建 ServiceMonitor

export RKE2_CLUSTER_NAME=<自定义下游 rke2 集群名称>

cat << 'EOF' | envsubst | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export
namespace: cattle-monitoring-system
labels:
rke2-cluster: rke2-${RKE2_CLUSTER_NAME}
spec:
selector:
matchLabels:
rke2-cluster: rke2-${RKE2_CLUSTER_NAME}
endpoints:
- port: metrics # 对应 Service 中 ports.name
interval: 30s
path: /metrics
# 如果需要 TLS 或 basic auth,在这里配置
scheme: https
tlsConfig:
ca:
secret:
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export-auth-certs
key: ca.crt
cert:
secret:
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export-auth-certs
key: tls.crt
keySecret:
name: rke2-${RKE2_CLUSTER_NAME}-metrics-export-auth-certs
key: tls.key
EOF

添加 PrometheusRule

以下规则如果证书有效期小于 90 天就会触发告警,可以根据需要修改时间天数。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
annotations:
prometheus-operator-validated: 'true'
name: rke2-metrics-rules
namespace: cattle-monitoring-system
spec:
groups:
- name: rke2_certificate_expiration
rules:
- alert: rke2_certificate_expiration_seconds
expr: rke2_certificate_expiration_seconds/60/60/24 < 90
for: 0s
labels:
rke2_certificate_expiration: test

添加 AlertmanagerConfig

以下是一个测试示例,示例中没有添加 receiver,导入示例后重新编辑,然后根据需要添加 receiver。
其中 matchers 设置为泛匹配,任何触发的告警都将通过此 AlertmanagerConfig 进行发送。如果需要针对前面设置的 PrometheusRule 进行匹配告警,则需要修改 matchers 标签为 rke2_certificate_expiration=test 。

apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: rke2-certificate-expiration-alert
namespace: cattle-monitoring-system
spec:
route:
groupBy: []
groupInterval: 5m
groupWait: 60s
matchers:
- matchType: '=~'
name: .*
value: .*
repeatInterval: 4h