低成本做网站,深圳各区房价一览表,昌平沙河网站建设,北京 企业网站开发作者简介 王海龙#xff0c;Rancher 中国社区技术经理#xff0c;Linux Foundation APAC Evangelist#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革#xff0c;无论底层操作系统 Lin… 作者简介 王海龙Rancher 中国社区技术经理Linux Foundation APAC Evangelist负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验经历了 OpenStack 到 Kubernetes 的技术变革无论底层操作系统 Linux还是虚拟化 KVM 或是 Docker 容器技术都有丰富的运维和实践经验。 随着容器化应用的普及Kubernetes 成为了管理和编排这些容器的首选平台。对于资源受限的生产环境和边缘部署来说K3s 是一个理想的轻量级 Kubernetes 发行版。然而为了确保 K3s 集群的稳定性和性能监控是至关重要的。本文将介绍如何通过 kube-prometheus-stack 来监控 K3s 集群的运行状态。
先决条件
K3s 集群
你必须拥有一个健康的 Rancher K3s 集群。本次示例将安装两个节点的 K3s 集群一个 K3s master 节点一个 K3s worker 节点并且集群采用嵌入式 etcd 作为数据存储。
本文使用的 K3s 版本为v1.27.6k3s1 Helm
如果你尚未安装 Helm3请参考 Helm 官网文档 安装 Helm。
Kubernetes Storage Class
为了支持集群中任何节点上的监控组件的持久化和调度你需要提供 Kubernetes Storage Class。
你可以使用像 Longhorn 这样成熟的集群存储解决方案。但为了方便演示本文使用 K3s 自带的 Local Path Provisioner。
K3s 集群准备
默认情况下K3s 将其多个管理组件绑定到节点主机的 localhost 127.0.0.1 地址具体为Kube Controller Manager、Kube Proxy 和 Kube Scheduler。
但是为了进行监控我们需要公开这些 endpoint以便 Prometheus 可以提取它们的指标。因此我们需要在 0.0.0.0 地址上公开这些组件的 metrics。
你可以通过将包含以下内容的文件放置在 “/etc/rancher/k3s/config.yaml” 中来更改 K3s master 节点上的这些设置。
# /etc/rancher/k3s/config.yaml
kube-controller-manager-arg:
- bind-address0.0.0.0
kube-proxy-arg:
- metrics-bind-address0.0.0.0
kube-scheduler-arg:
- bind-address0.0.0.0
# 公开 etcd metrics
etcd-expose-metrics: true另外K3s worker 节点上也运行了 Kube Proxy 组件所以也需要在 K3s worker 节点的 “/etc/rancher/k3s/config.yaml” 中添加如下配置:
# /etc/rancher/k3s/config.yaml
kube-proxy-arg:
- metrics-bind-address0.0.0.0安装 K3s 集群
K3s master 节点
1.配置 K3s masterIP172.31.38.19
rootip-172-31-38-19:~# mkdir -p /etc/rancher/k3s/
rootip-172-31-38-19:~# cat /etc/rancher/k3s/config.yaml EOL
# /etc/rancher/k3s/config.yaml
kube-controller-manager-arg:
- bind-address0.0.0.0
kube-proxy-arg:
- metrics-bind-address0.0.0.0
kube-scheduler-arg:
- bind-address0.0.0.0
# 公开 etcd metrics
etcd-expose-metrics: true
EOL2.安装 K3s master
rootip-172-31-38-19:~# curl -sfL https://get.k3s.io | K3S_TOKENSECRET sh -s - server --cluster-initK3s worker 节点
1.配置 K3s workerIP172.31.41.39
rootip-172-31-41-39:~# mkdir -p /etc/rancher/k3s/
rootip-172-31-41-39:~# cat /etc/rancher/k3s/config.yaml EOL
# /etc/rancher/k3s/config.yaml
kube-proxy-arg:
- metrics-bind-address0.0.0.0
EOL2.安装 K3s worker
rootip-172-31-41-39:~# curl -sfL https://get.k3s.io | K3S_TOKENSECRET sh -s - agent --server https://ip or hostname of server:6443现在每个服务都有可用的侦听器Prometheus 就可以抓取这些 metrics
# kubeControllerManager port: 10257
# kubeScheduler port: 10259
# kubeProxy port: 10249rootip-172-31-38-19:~# ss -lntp | grep -E 10257|10259|10249
LISTEN 0 4096 *:10249 *:* users:((k3s-server,pid3504,fd203))
LISTEN 0 4096 *:10259 *:* users:((k3s-server,pid3504,fd201))
LISTEN 0 4096 *:10257 *:* users:((k3s-server,pid3504,fd178))修改 Traefik Metrics 端口
K3s 使用 Traefik 作为开箱即用的 Ingress 控制器在启动 K3s 时默认部署。默认配置文件位于 /var/lib/rancher/k3s/server/manifests/traefik.yamlTraefik 默认的 metrics 端口为 9100并且使用 HostPort 启动这样就和 node-exporter 的 9100 端口冲突所以我们需要提前修改 Traefik 的 metrics 端口。
要修改 Traefik 的配置信息不要手动编辑 traefik.yaml 文件因为 K3s 会在启动时使用默认值替换该文件。相反你需要通过在 /var/lib/rancher/k3s/server/manifests 中创建 HelmChartConfig 清单来自定义 Traefik。有关更多详细信息和示例请参阅使用 HelmChartConfig 自定义打包组件。有关配置 traefik 配置的更多信息请参阅官方 Traefik Helm 配置参数。
## 本示例将 traefik 的 metrics 端口修改为 9900
rootip-172-31-38-19:~# cat /var/lib/rancher/k3s/server/manifests/traefik-config.yaml EOL
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:name: traefiknamespace: kube-system
spec:valuesContent: |-ports:metrics:port: 9900exposedPort: 9900
EOLHelm 自定义 values.yaml 文件
在使用 Helm 安装 kube-prometheus-stack 之前我们需要创建一个自定义 values.yam 文件来调整 K3s 集群的默认 chart 配置。
覆盖管理组件配置
我们放在 K3s master 节点 (172.31.38.19) 上的 config.yaml 文件中公开了 Kube Controller Manager、Kube Proxy 和 Kube Scheduler 上的 metrics并且在 K3s worker 节点上公开了 Kube Proxy 的 metrics。所以需要在 values.yaml 中指定对应的 endpoints 和 port。如果没有这些显式的设置kube-prometheus-stack 将无法找到这些 metrics。 endpoints 是一个数组因此如果你有 3 个 HA master 节点则需要指定所有 3 个 IP 地址。以下配置中其实只设置 endpoints 即可其他参数均为默认值加上这些配置值是为了更详细的说明配置项。 kubeControllerManager:enabled: trueendpoints:- 172.31.38.19service:enabled: trueport: 10257targetPort: 10257serviceMonitor:enabled: truehttps: falsekubeScheduler:enabled: trueendpoints:- 172.31.38.19service:enabled: trueport: 10259targetPort: 10259serviceMonitor:enabled: truehttps: falsekubeProxy:enabled: trueendpoints:- 172.31.38.19- 172.31.41.39service:enabled: trueport: 10249targetPort: 10249覆盖 ETCD 配置
kubeEtcd:enabled: trueendpoints:- 172.31.38.19持久化存储
生产环境请务必为 AlertManager、Grafana 和 Prometheus 使用外部存储。如果不这样做将使用一个 emptyDir该目录仅在 Pod 生命周期内有效。 即使使用 K3s local-path storage class 也只能提供节点级别的持久化。本文为了方便演示使用的是 local-path。生产环境建议使用像 Longhorn 这样成熟的集群存储解决方案。 alertmanager:alertmanagerSpec:storage:volumeClaimTemplate:spec:storageClassName: local-pathaccessModes: [ReadWriteOnce]resources:requests:storage: 10Giprometheus:prometheusSpec:storageSpec:## Using PersistentVolumeClaim##volumeClaimTemplate:spec:storageClassName: local-pathaccessModes: [ReadWriteOnce]resources:requests:storage: 10Gigrafana:persistence:type: pvcenabled: truestorageClassName: local-pathaccessModes: [ReadWriteOnce]size: 1024Mi完整的 values.yaml 文件
我在 github 中有一个监控 K3s 集群的完整示例 values.yaml 文件。这个示例 values.yaml 文件中包含了 Ingress 和 公开 AlertManager、Grafana 和 Prometheus 的设置还有一些关于 AlertManager 的告警配置信息但这些设置并非特定于 K3s。
这个示例中也包含了监控 traefik 的 prometheus 配置如果大家有需求也可以参考。
Helm 安装 kube-prometheus-stack
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update# kubectl create namespace monitoring
# helm install prometheus-community prometheus-community/kube-prometheus-stack --namespace monitoring -f values.yaml如果你修改 values.yaml 文件并需要更新版本请将 install 更改为 upgrade。
# helm -n monitoring upgrade prometheus-community prometheus-community/kube-prometheus-stack -f values.yaml验证安装状态:
# 列出所有 namespace 中的 releases
helm list -A
# 列出 monitoring namespace 中的 releases
helm list -n monitoring# 检查 prometheus stack release 状态
helm status prometheus-community -n monitoring安装完成后我们就可以访问 Prometheus、Alertmanager、Grafana 的 UI 来查看 K3s 集群的状态 总 结
监控是运维工作中的重要一环能够帮你及时发现和解决潜在问题提高集群的可用性和效率。按照本文的步骤你可以轻松地使用 kube-prometheus-stack 监控 K3s 集群确保其稳定性和性能。借助 Prometheus、Alertmanager 和 Grafana你可以创建交互式仪表板和可视化深入了解集群的运行状况为你的应用程序提供更好的支持和管理。希望本文对你有所帮助让你更好地运维和管理 K3s 集群。