使用 Prometheus Operator 监控 Kubernetes 集群

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 客户端。
以 Kubernetes 标志为主题的原文插图。
以 Kubernetes 标志为主题的原文插图。

部署 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日)。原文版权归原作者或所属机构所有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容