原文链接:https://fuckcloudnative.io/posts/monitoring-calico-with-prometheus-operator/

Calico 中最核心的组件就是 Felix,它负责设置路由表和 ACL 规则等,以便为该主机上的 endpoints 资源正常运行提供所需的网络连接。同时它还负责提供有关网络健康状况的数据(例如,报告配置其主机时发生的错误和问题),这些数据会被写入 etcd,以使其对网络中的其他组件和操作人员可见。

由此可见,对于我们的监控来说,监控 Calico 的核心便是监控 FelixFelix 就相当于 Calico 的大脑。本文将学习如何使用 Prometheus-Operator 来监控 Calico。

本文不会涉及到 CalicoPrometheus-Operator 的部署细节,如果不知道如何部署,请查阅官方文档和相关博客。

1. 配置 Calico 以启用指标

默认情况下 Felix 的指标是被禁用的,必须通过命令行管理工具 calicoctl 手动更改 Felix 配置才能开启,需要提前配置好命令行管理工具。

本文使用的 Calico 版本是 v3.15.0,其他版本类似。先下载管理工具:

$ wget https://github.com/projectcalico/calicoctl/releases/download/v3.15.0/calicoctl -O /usr/local/bin/calicoctl
$ chmod +x /usr/local/bin/calicoctl

接下来需要设置 calicoctl 配置文件(默认是 /etc/calico/calicoctl.cfg)。如果你的 Calico 后端存储使用的是 Kubernetes API,那么配置文件内容如下:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "kubernetes"
kubeconfig: "/root/.kube/config"

如果 Calico 后端存储使用的是 etcd,那么配置文件内容如下:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "etcdv3"
etcdEndpoints: https://192.168.57.51:2379,https://192.168.57.52:2379,https://192.168.57.53:2379
etcdKeyFile: /opt/kubernetes/ssl/server-key.pem
etcdCertFile: /opt/kubernetes/ssl/server.pem
etcdCACertFile: /opt/kubernetes/ssl/ca.pem

你需要将其中的证书路径换成你的 etcd 证书路径。

配置好了 calicoctl 之后就可以查看或修改 Calico 的配置了,先来看一下默认的 Felix 配置:

$ calicoctl get felixConfiguration default -o yaml

apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
creationTimestamp: "2020-06-25T14:37:28Z"
name: default
resourceVersion: "269031"
uid: 52146c95-ff97-40a9-9ba7-7c3b4dd3ba57
spec:
bpfLogLevel: ""
ipipEnabled: true
logSeverityScreen: Info
reportingInterval: 0s

可以看到默认的配置中没有启用指标,需要手动修改配置,命令如下:

$ calicoctl patch felixConfiguration default  --patch '{"spec":{"prometheusMetricsEnabled": true}}'

Felix 暴露指标的端口是 9091,可通过检查监听端口来验证是否开启指标:

$ ss -tulnp|grep 9091
tcp LISTEN 0 4096 [::]:9091 [::]:* users:(("calico-node",pid=13761,fd=9)) $ curl -s http://localhost:9091/metrics
# HELP felix_active_local_endpoints Number of active endpoints on this host.
# TYPE felix_active_local_endpoints gauge
felix_active_local_endpoints 1
# HELP felix_active_local_policies Number of active policies on this host.
# TYPE felix_active_local_policies gauge
felix_active_local_policies 0
# HELP felix_active_local_selectors Number of active selectors on this host.
# TYPE felix_active_local_selectors gauge
felix_active_local_selectors 0
...

2. Prometheus 采集 Felix 指标

启用了 Felix 的指标后,就可以通过 Prometheus-Operator 来采集指标数据了。Prometheus-Operator 在部署时会创建 PrometheusPodMonitorServiceMonitorAlertManagerPrometheusRule 这 5 个 CRD 资源对象,然后会一直监控并维持这 5 个资源对象的状态。其中 Prometheus 这个资源对象就是对 Prometheus Server 的抽象。而 PodMonitorServiceMonitor 就是 exporter 的各种抽象,是用来提供专门提供指标数据接口的工具,Prometheus 就是通过 PodMonitorServiceMonitor 提供的指标数据接口去 pull 数据的。

ServiceMonitor 要求被监控的服务必须有对应的 Service,而 PodMonitor 则不需要,本文选择使用 PodMonitor 来采集 Felix 的指标。

PodMonitor 虽然不需要应用创建相应的 Service,但必须在 Pod 中指定指标的端口和名称,因此需要先修改 DaemonSet calico-node 的配置,指定端口和名称。先用以下命令打开 DaemonSet calico-node 的配置:

$ kubectl -n kube-system edit ds calico-node

然后在线修改,在 spec.template.sepc.containers 中加入以下内容:

        ports:
- containerPort: 9091
name: http-metrics
protocol: TCP

创建 Pod 对应的 PodMonitor

# prometheus-podMonitorCalico.yaml
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
labels:
k8s-app: calico-node
name: felix
namespace: monitoring
spec:
podMetricsEndpoints:
- interval: 15s
path: /metrics
port: http-metrics
namespaceSelector:
matchNames:
- kube-system
selector:
matchLabels:
k8s-app: calico-node
$ kubectl apply -f prometheus-podMonitorCalico.yaml

有几个参数需要注意:

  • PodMonitor 的 name 最终会反应到 Prometheus 的配置中,作为 job_name

  • podMetricsEndpoints.port 需要和被监控的 Pod 中的 ports.name 相同,此处为 http-metrics

  • namespaceSelector.matchNames 需要和被监控的 Pod 所在的 namespace 相同,此处为 kube-system

  • selector.matchLabels 的标签必须和被监控的 Pod 中能唯一标明身份的标签对应。

最终 Prometheus-Operator 会根据 PodMonitor 来修改 Prometheus 的配置文件,以实现对相关的 Pod 进行监控。可以打开 Prometheus 的 UI 查看监控目标:

注意 Labels 中有 pod="calico-node-xxx",表明监控的是 Pod。

3. 可视化监控指标

采集完指标之后,就可以通过 Grafana 的仪表盘来展示监控指标了。Prometheus-Operator 中部署的 Grafana 无法实时修改仪表盘的配置(必须提前将仪表盘的 json 文件挂载到 Grafana Pod 中),而且也不是最新版(7.0 以上版本),所以我选择删除 Prometheus-Operator 自带的 Grafana,自行部署 helm 仓库中的 Grafana。先进入 kube-prometheus 项目的 manifests 目录,然后将 Grafana 相关的部署清单都移到同一个目录下,再删除 Grafana:

$ cd kube-prometheus/manifests
$ mkdir grafana
$ mv grafana-* grafana/
$ kubectl delete -f grafana/

然后通过 helm 部署最新的 Grafana:

$ helm install grafana stable/grafana -n monitoring

访问 Grafana 的密码保存在 Secret 中,可以通过以下命令查看:

$ kubectl -n monitoring get secret grafana -o yaml

apiVersion: v1
data:
admin-password: MnpoV3VaMGd1b3R3TDY5d3JwOXlIak4yZ3B2cTU1RFNKcVY0RWZsUw==
admin-user: YWRtaW4=
ldap-toml: ""
kind: Secret
metadata:
...

对密码进行解密:

$ echo -n "MnpoV3VaMGd1b3R3TDY5d3JwOXlIak4yZ3B2cTU1RFNKcVY0RWZsUw=="|base64 -d

解密出来的信息就是访问密码。用户名是 admin。通过用户名和密码登录 Grafana 的 UI:

添加 Prometheus-Operator 的数据源:

Calico 官方没有单独 dashboard json,而是将其放到了 ConfigMap 中,我们需要从中提取需要的 json,提取出 felix-dashboard.json 的内容,然后将其中的 datasource 值替换为 prometheus。你可以用 sed 替换,也可以用编辑器,大多数编辑器都有全局替换的功能。如果你实在不知道如何提取,可以使用我提取好的 json

修改完了之后,将 json 内容导入到 Grafana:

最后得到的 Felix 仪表盘如下图所示:

如果你对我截图中 Grafana 的主题配色很感兴趣,可以参考这篇文章:Grafana 自定义主题


Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12离线安装包发布地址http://store.lameleg.com ,欢迎体验。 使用了最新的sealos v3.3.6版本。 作了主机名解析配置优化,lvscare 挂载/lib/module解决开机启动ipvs加载问题, 修复lvscare社区netlink与3.10内核不兼容问题,sealos生成百年证书等特性。更多特性 https://github.com/fanux/sealos 。欢迎扫描下方的二维码加入钉钉群 ,钉钉群已经集成sealos的机器人实时可以看到sealos的动态。

使用 Prometheus-Operator 监控 Calico的更多相关文章

  1. Prometheus Operator 监控Kubernetes

    Prometheus Operator 监控Kubernetes 1. Prometheus的基本架构 ​ Prometheus是一个开源的完整监控解决方案,涵盖数据采集.查询.告警.展示整个监控流程 ...

  2. 使用Prometheus Operator 监控Kubernetes(15)

    一.Prometheus概述: Prometheus是一个开源系统监测和警报工具箱. Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernete ...

  3. k8s Helm安装Prometheus Operator

    Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...

  4. Kubernetes 监控方案之 Prometheus Operator(十九)

    目录 一.Prometheus 介绍 1.1.Prometheus 架构 1.2.Prometheus Operator 架构 二.Helm 安装部署 2.1.Helm 客户端安装 2.2.Tille ...

  5. prometheus operator(Kubernetes 集群监控)

    一.Prometheus Operator 介绍 Prometheus Operator 是 CoreOS 开发的基于 Prometheus 的 Kubernetes 监控方案,也可能是目前功能最全面 ...

  6. Prometheus Operator自定义监控项

    Prometheus Operator默认的监控指标并不能完全满足实际的监控需求,这时候就需要我们自己根据业务添加自定义监控.添加一个自定义监控的步骤如下: 1.创建一个ServiceMonitor对 ...

  7. 简单4步,利用Prometheus Operator实现自定义指标监控

    本文来自Rancher Labs 在过去的文章中,我们花了相当大的篇幅来聊关于监控的话题.这是因为当你正在管理Kubernetes集群时,一切都会以极快的速度发生变化.因此有一个工具来监控集群的健康状 ...

  8. Kubernetes 监控:Prometheus Operator

    安装 前面的章节中我们学习了用自定义的方式来对 Kubernetes 集群进行监控,基本上也能够完成监控报警的需求了.但实际上对上 Kubernetes 来说,还有更简单方式来监控报警,那就是 Pro ...

  9. Kubernetes 监控:Prometheus Operator + Thanos ---实践篇

    具体参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/16291296.html 本章用到的yaml文件地址:https://files.cnblogs.com/ ...

  10. helm 安装prometheus operator 并监控ingress

    1.helm安装 curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.shchmod 7 ...

随机推荐

  1. jchdl - 初次使用建立项目示例

    https://mp.weixin.qq.com/s/HaarKjpHan08RUTlEX0XHg   一. 下载并安装JDK 8   下载链接:https://www.oracle.com/tech ...

  2. InnoSetup汉化版打包工具下载-附带脚本模板

    InnoSetup汉化版打包工具下载地址: https://www.90pan.com/b1907264 脚本模板 ; 脚本用 Inno Setup 脚本向导 生成.; 查阅文档获取创建 INNO S ...

  3. EntityFramework数据持久化 Linq语法应用

    Linq基础语法 LINQ概述 LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式查询的统一模型. LINQ的组成: LINQ To Object ...

  4. Java实现 LeetCode 594 最长和谐子序列(滑动窗口)

    594. 最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3, ...

  5. Java实现 蓝桥杯VIP 算法训练 寂寞的数

    问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和.例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1= ...

  6. Java实现 蓝桥杯 算法训练 纪念品分组

    问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价 ...

  7. Java实现 洛谷 Car的旅行路线

    输入输出样例 输入样例#1: 1 3 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出样例#1: 47.5 import java.util. ...

  8. java实现第五届蓝桥杯扑克序列

    扑克序列 AA223344,一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌. 4A3A2432, 2342A3A4 请填写出 ...

  9. Linux 用户组管理命令

    groupadd 组名,可以添加用户组 groupmod -n 新组名 老组名,可以修改组名 groupdel 组名,可以删除组(组中不能有初始用户存在,附加用户无所谓) gpasswd -a 用户名 ...

  10. class 类前向声明

    /*   使用前向引用声明虽然可以解决一些问题,但它并不是万能的.需要注意的是,   尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象,   也不能在内联成员函数中使用该类的 ...