Kubernetes 已成为 DevOps 工程师在一台或多台服务器上部署、管理容器化应用的常用工具。这些计算节点组成集群,集群性能对应用能否成功运行至关重要。
集群运行不理想时,应用可用性与性能会受影响,导致用户不满,甚至收入损失。幸运的是,Kubernetes 生态中有多种工具可以有效监控集群,包括 Prometheus。
本文介绍 Kubernetes Operator 的优势,如何部署并使用 Prometheus Operator 配置与管理集群中的 Prometheus 实例,以及如何在集群中部署 Grafana,分析和可视化集群健康状况。
为什么用 Prometheus 监控 Kubernetes 集群?
Prometheus 是用于云原生环境监控与告警的开源工具。它采集环境指标,以时间序列形式存储,将带时间戳的信息记录在内存或本地磁盘中。
可以使用 Prometheus Operator 这样的 Kubernetes Operator,在集群中安装和配置 Prometheus。
什么是 Kubernetes Operator?
Kubernetes Operator 是软件扩展,通过扩展 Kubernetes API 的功能,配置和管理其他 Kubernetes 应用。它们使用自定义资源管理应用及其组件。
Kubernetes 控制器
Kubernetes 中的控制循环称为控制器,用于监控集群状态,使实际状态接近或等于期望状态。例如,要部署新的容器化应用,可使用 kubectl 客户端 或 Kubernetes 仪表板,在集群中创建包含所需信息的 Deployment 对象。控制器收到新对象信息后,执行部署应用所需的操作;修改对象时,控制器也会接收更新并执行相应操作。
Kubernetes Operator
Operator 以略有不同的方式使用控制器模式。它面向特定应用,不同应用可以有自己的 Operator,可在 OperatorHub.io 查找。Operator 监控集群中的应用并执行任务,使应用达到你通过自定义资源定义(CRD)配置的期望状态。
不使用 Prometheus Operator 或 Prometheus Helm chart,而手动部署 Prometheus 实例,可能繁琐且耗时。你需要配置 ConfigMap、Secret、Deployment、Service 等对象,Operator 可以替你抽象处理这些工作。它还帮助管理资源的动态更新,例如零停机更新 Prometheus 规则。
使用 Kubernetes Operator 的优势
Operator 为 Kubernetes 生态提供多方面优势。
1. 打包、部署和管理应用
Operator 让应用部署与管理更顺畅。安装与维护复杂的云原生应用,可以通过自定义资源自动化、简化这些流程。它也改善数据库等有状态应用的管理,让备份与配置更容易。使用 Operator 可以自动化这些复杂过程。
2. 使用 kubectl 执行基本操作
Operator 扩展 API 服务器功能,因此允许使用 kubectl 对自定义资源执行 GET、LIST 等基本命令。这样可在终端中用已经熟悉的命令管理自定义资源。
3. 简化资源监控
Operator 根据 CRD 对应用执行自定义任务,会持续监控应用与集群,发现不符合预期的情况。例如应用不处于期望状态时,它会自动纠正,减少管理员识别和修复集群问题的负担。
在 Kubernetes 中部署和配置 Prometheus Operator
Prometheus 适合监控集群中的应用和资源。下面使用 Operator 部署和配置 Prometheus 实例。
前提条件
- 一个正在运行的 Kubernetes 集群。可以使用支持 Linux、Mac 和 Windows 的 minikube,在计算机上搭建本地集群。
- 计算机已安装 kubectl 客户端。
%3Aquality(90)%2F&w=3840&q=75)
部署 Prometheus Operator
先在集群中部署 Operator,再配置权限,使 Prometheus 可以抓取集群中的目标。应用官方仓库中的 bundle.yaml:
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml
如果遇到 The CustomResourceDefinition "prometheuses.monitoring.coreos.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes,运行:
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml --force-conflicts=true --server-side=true
原文使用服务器端应用与强制冲突选项安装 CRD,应对注释超过 Kubernetes 限制的情况。--force-conflicts 必须与 --server-side 一起使用。更多信息见服务器端应用文档。
参数含义:
--server-side采用服务器端应用,避免客户端应用将完整清单写入 last-applied 注释;--force-conflicts处理字段所有权冲突,并非通用的“忽略警告”选项。此处保留原文命令,应用前应理解其所有权影响。
执行后应得到类似原文的输出:
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
clusterrole.rbac.authorization.k8s.io/prometheus-operator created
deployment.apps/prometheus-operator created
serviceaccount/prometheus-operator created
service/prometheus-operator created
运行 kubectl get deployments 可看到 Operator 已部署:
NAME READY UP-TO-DATE AVAILABLE AGE
prometheus-operator 1/1 1 1 6m1s
接着配置基于角色的访问控制(RBAC),允许 Prometheus 访问 Kubernetes API 抓取目标,并访问 Alertmanager 集群。部署 ServiceAccount:创建 prometheus_rbac.yaml 并填入:
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/metrics
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources:
- configmaps
verbs: ["get"]
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: default
将文件应用到集群:
kubectl apply -f prometheus_rbac.yaml
原文中的响应示例:
serviceaccount/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
部署 Prometheus
Operator 部署完成后,使用 YAML 文件中定义的 Prometheus CRD 创建实例。创建 prometheus_instance.yaml:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceAccountName: prometheus
serviceMonitorSelector: {}
resources:
requests:
memory: 300Mi
然后运行:
kubectl apply -f prometheus_instance.yaml
serviceAccountName 引用前面为 ClusterRoleBinding 创建的 ServiceAccount。serviceMonitorSelector 指向 ServiceMonitor,以监控集群中的特定服务。若要选择所有已有 ServiceMonitor,将其设为 {};若不想选择任何 ServiceMonitor,则不在该 Prometheus CRD 中包含这一字段。
选择特定 ServiceMonitor 的写法例如:
serviceMonitorSelector:
matchLabels:
app: frontend
应用 prometheus_instance.yaml 后,会创建 prometheus-operated 服务;可通过 kubectl get svc 查看。将本地端口转发到该服务,以访问服务器:
kubectl port-forward svc/prometheus-operated 9090:9090
在浏览器打开 http://localhost:9090,可看到 Prometheus 界面。
原文此处的图注:Prometheus UI。
配置 Prometheus 监控服务和应用
在同时运行多个应用的集群中,你可能不希望单个实例抓取所有应用的指标。可通过 ServiceMonitor CRD 指定需要抓取指标的应用。
ServiceMonitor CRD 可定制抓取行为。例如,让 Prometheus 抓取所有匹配 Frontend 或 Staging 标签的服务,或配置抓取一组服务的时间间隔。它提供了广泛的服务监控控制能力。
创建 ServiceMonitor CRD
创建示例文件 service_monitor.yaml:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
name: prometheus
name: prometheus
spec:
endpoints:
- interval: 30s
targetPort: 9090
path: /metrics
namespaceSelector:
any: true
selector:
matchLabels:
operated-prometheus: "true"
该配置让 Prometheus 每30秒抓取带 operated-prometheus: "true" 标签的服务,指标位于 /metrics 端点。因此,这里 Prometheus 抓取自己的数据、监控自身健康状况。matchLabels 的键值只是本文示例,实际使用应改成要监控服务的标签。
应用到集群:
kubectl apply -f service_monitor.yaml
通过 CRD 对象配置 Operator
Operator 提供多类 CRD,可在集群中应用以管理 Prometheus。本文已介绍 Prometheus 和 ServiceMonitor,其他类型包括 PrometheusRules、Alertmanager、PodMonitor。更多说明见 GitHub 文档。
在集群中部署 Grafana
Grafana 让你无论指标存储在哪里,都能查询、可视化、告警并理解指标。在终端运行:
kubectl create deployment grafana --image=docker.io/grafana/grafana:latest
用 kubectl get deployments 确认部署:
NAME READY UP-TO-DATE AVAILABLE AGE
grafana 1/1 1 1 7m27s
为 Deployment 创建服务:
kubectl expose deployment grafana --port 3000
把本地3000端口转发到服务:
kubectl port-forward svc/grafana 3000:3000
打开 http://localhost:3000 访问 Grafana。原文示例用 admin 作为初始用户名和密码登录,随后重定向到修改密码页面,修改后进入首页。
原文此处的图注:Grafana 用户首页截图。
点击 Data Sources,选择 Prometheus,填写服务器 URL、访问方式、认证类型与抓取间隔等配置。
不能把 http://localhost:9090 用作这里的 HTTP URL,因为 Grafana 容器无法通过该地址访问另一个服务。原文用 NodePort 或 LoadBalancer 暴露 Prometheus。创建 expose_prometheus.yaml:
apiVersion: v1
kind: Service
metadata:
name: prometheus
spec:
type: NodePort
ports:
- name: web
nodePort: 30900
port: 9090
protocol: TCP
targetPort: web
selector:
prometheus: prometheus
运行 kubectl apply -f expose_prometheus.yaml。Grafana 可从 http://<node_ip>:30900 获取指标。执行 kubectl get nodes -o wide 查看 <node_ip>。
在 URL 框中输入该地址,点击 Save & Test。
原文此处的图注:在 Grafana 中添加 Prometheus 数据源。
创建监控 Kubernetes 事件的 Grafana 仪表板
创建一个显示 Prometheus pod 处理的 Kubernetes 事件总数的图表。将鼠标移到左侧面板,选择 Dashboards → New dashboard,然后选择 Add a new panel。
选择 Prometheus 数据源,指标选择 prometheus_sd_kubernetes_events_total,标签输入 prometheus-prometheus-0;也可以选择自己要监控的其他指标和标签。点击 Run queries。
原文此处的图注:添加要监控的指标。
在面板配置右侧,可设置图表样式、图例位置、图表标题等细节。
原文此处的图注:配置 Grafana 图表。
完成后点击 Apply,页面会跳转到包含该仪表板的新页面。点击 Add panel 添加更多面板,或点击 Save dashboard 完成创建。
原文此处的图注:显示 pod 事件监控数据的仪表板面板。
点击 Save,为仪表板取自定义名称并保存。
原文此处的图注:保存 Grafana 仪表板。
配置完成后,可以添加任意数量面板,监控集群中 Prometheus 实例抓取的不同指标。
原文此处的图注:Grafana 中监控多个指标。
结论
管理员与用户常常难以部署和管理复杂应用,Kubernetes Operator 能提供帮助。针对具体应用的 Operator,将部署与管理流程交给 Kubernetes API,简化管理员的工作。Prometheus Operator 尤其简化了 Prometheus 管理:其 CRD 更容易抓取集群与应用指标进行监控。
虽然 Operator 可被视为复杂系统中又一层需要维护的抽象,但它带来的效率不容忽视。自动化配置与运维流程,能释放时间投入更有价值的创新工作。
如果希望监控 Kubernetes 集群,又不想完全自己搭建,Grafana 提供 Grafana Cloud 中的 Kubernetes Monitoring。它面向各种规模的 Kubernetes 使用场景,开箱即可访问基础设施指标、日志和 Kubernetes 事件,并提供预置仪表板与告警。该功能面向所有 Grafana Cloud 用户,包括免费层用户。尚无账户时,可注册免费账户。
来源:使用 Prometheus Operator 监控 Kubernetes 集群。作者:Daniel Olaogun(2023年1月20日)。原文版权归原作者或所属机构所有。











暂无评论内容