Prometheus Operator与kube-prometheus之二-如何监控1.23+ kubeadm集群
简介
- 系列文章: 标签 - Prometheus - 东风微鸣技术博客 (ewhisper.cn)
- Prometheus Operator 的上一篇: Prometheus Operator 与 kube-prometheus 之一 - 简介 - 东风微鸣技术博客 (ewhisper.cn)
kube-prometheus-stack捆绑了监控Kubernetes 集群所需的Prometheus Operator、Exporter、Rule、Grafana 和 AlertManager。
但要为使用kubeadm构建的Kubernetes集群定制Helm安装,还是有必要进行定制。
这一次结合近期比较新的 Kubernetes 版本 v1.23+, 以及较为常见的安装方式 kubeadm, 来实战说明:
- kubeadm 需要哪些特殊配置
- 如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart
- 如何配置对 kubeadm 安装的集群的组件监控
开始!
前提条件
- kubeadm
- helm3
kubeadm 需要哪些特殊配置
为了后面能够正常通过 Prometheus Operator 获取到 kubeadm 搭建的 Kubernetes v1.23+ 集群的指标, 需要对 kubeadm 做一些特殊配置.
默认情况下,kubeadm将它的几个管理组件绑定到 node 的 localhost 127.0.0.1 地址上, 涉及到: Kube Controller Manager、Kube Proxy和Kube Scheduler。
然而,对于监控来说,我们需要这些端点的暴露,以便他们的指标可以被Prometheus提取。因此,我们需要将这些组件暴露在他们的 0.0.0.0 地址上。
当登录到kubeadm主节点时,运行以下修改:
Controller Manager 和 Scheduler 组件
默认情况下,kubeadm 并没有公开我们要监控的两个服务(kube-controller-manager 和 kube-scheduler)。因此,为了充分利用kube-prometheus-stack helm chart,我们需要对Kubernetes集群做一些快速调整。后面我们会监控kube-controller-manager和kube-scheduler,我们必须将它们的地址端口暴露给集群。
默认情况下,kubeadm 在你的主机上运行这些 pod,并绑定到 127.0.0.1。有几种方法可以改变这一点。建议改变这些配置的方法是使用 kubeadm config file。下面是配置示例:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
...
controllerManager:
extraArgs:
bind-address: "0.0.0.0"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
...
kubernetesVersion: "v1.23.1"
...
上面的 .scheduler.extraArgs 和 .controllerManager.extraArgs。这样就把 kube-controller-manager 和 kube-scheduler 服务暴露给集群的其他组件。
另外, 如果你把 kubernetes 核心组件作为pods放在 kube-system namespace,就要确保kube-prometheus-exporter-kube-scheduler 和 kube-prometheus-exporter-kube-controller-manager service (这 2 个 service 是 kube-prometheus-stack 创建出来用于 Prometheus Operator 通过 ServiceMonitor 监控这两个组件用的)的spec.selector 值与pods的值一致。
如果你已经有一个部署了 kubeadm 的Kubernetes,可以直接 kube-controller-manager 和 kube-scheduler 的监听地址:
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml
Kube Proxy 组件
Notes:
一般情况下, kube-proxy 总是绑定所有地址的, 但是对应的metricsBindAddress可能并不一定会follow 配置. 具体如下面的"改动前"
对于 Kube Proxy 组件, 在使用 kubeadm 安装完成之后, 需要修改 kube-system 下的 configmap kube-proxy 的 metricsBindAddress.
改动如下:
改动前:
...
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 127.0.0.1:10249
...
改动后:
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
并重启:
kubectl -n kube-system rollout restart daemonset/kube-proxy
Etcd 配置
Etcd 配置, 这里就不详细说明了, 可以直接参见: Prometheus Operator 监控 etcd 集群-阳明的博客
但是上面链接提到的方法比较麻烦, 推荐一个更简单的: 可以在 etcd 的配置中加上监听 Metrics URL 的flag:
# 在 etcd 所在的机器上
master_ip=192.168.1.5
sed -i "s#--listen-metrics-urls=.*#--listen-metrics-urls=http://127.0.0.1:2381,http://$master_ip:2381#" /etc/kubernetes/manifests/etcd.yaml
验证 kubeadm 配置
小结一下, 通过之前的这些配置, Kubernetes 组件的 Metrics 监听端口分别为:
- Controller Manager: (Kubernetes v1.23+)
- 端口: 10257
- 协议: https
- Scheduler: (Kubernetes v1.23+)
- 端口: 10259
- 协议: https
- Kube Proxy
- 端口: 10249
- 协议: http
- etcd
- 端口: 2381
- 协议: http
可以通过 netstat 命令查看之前的配置是否全部生效:
在 master 和 etcd node 上执行:
$ sudo netstat -tulnp | grep -e 10257 -e 10259 -e 10249 -e 2381
tcp 0 0 192.168.1.5:2381 0.0.0.0:* LISTEN 1400/etcd
tcp 0 0 127.0.0.1:2381 0.0.0.0:* LISTEN 1400/etcd
tcp6 0 0 :::10257 :::* LISTEN 1434/kube-controlle
tcp6 0 0 :::10259 :::* LISTEN 1486/kube-scheduler
tcp6 0 0 :::10249 :::* LISTEN 4377/kube-proxy
# 测试etcd指标
curl -k http://localhost:2381/metrics
# 测试 kube-proxy 指标
curl -k http://localhost:10249/metrics
通过 kube-prometheus-stack 安装并定制 helm values
这里直接完成上面提到的 2 步:
- 如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart
- 如何配置对 kubeadm 安装的集群的组件监控
在我们用 Helm 安装kube-prometheus-stack之前,我们需要创建一个values.yaml来调整kubeadm 集群的默认 chart value。
为 Prometheus 和 AlertManager 配置持久化存储
推荐要为 Prometheus 和 AlertManager 配置持久化存储, 而不要直接使用 emptyDir.
存储具体如何配置根据您的集群的实际情况来, 这边就不做过多介绍.
etcd 相关配置
Kubeadm etcd 监控的端口是 2381(而不是Helm chart中指定的默认值: 2379)],所以我们需要明确覆盖这个值。
kubeEtcd:
enabled: true
service:
enabled: true
port: 2381
targetPort: 2381
Controller Manger 相关配置
这里不需要做太多配置, 关于 https 和 端口, 如果相关 key 为空或未设置,该值将根据目标Kubernetes 版本动态确定,原因是默认端口在Kubernetes 1.22中的变化。注意下面的: .kubeControllerManager.service.port 和 .kubeControllerManager.service.targetPort 以及 .kubeControllerManager.serviceMonitor.https 和 .kubeControllerManager.serviceMonitor.insecureSkipVerify.
如果配置后监控抓不到或有异常, 可以按实际情况调整.
kubeControllerManager:
enabled: true
...
service:
enabled: true
port: null
targetPort: null
serviceMonitor:
enabled: true
...
https: null
insecureSkipVerify: null
...
Kubernetes Scheduler
同上, 这里不需要做太多配置, 关于 https 和 端口, 如果相关 key 为空或未设置,该值将根据目标Kubernetes 版本动态确定,原因是默认端口在Kubernetes 1.23中的变化。注意下面的: .kubeScheduler.service.port 和 .kubeScheduler.service.targetPort 以及 .kubeScheduler.serviceMonitor.https 和 .kubeScheduler.serviceMonitor.insecureSkipVerify.
如果配置后监控抓不到或有异常, 可以按实际情况调整.
kubeScheduler:
enabled: true
...
service:
enabled: true
port: 10259
targetPort: 10259
serviceMonitor:
enabled: true
...
https: true
insecureSkipVerify: true
...
Kubernetes Proxy
也是如此, 根据 是否 https 和 端口进行调整, 如下:
kubeProxy:
enabled: true
endpoints: []
service:
enabled: true
port: 10249
targetPort: 10249
serviceMonitor:
enabled: true
...
https: false
...
通过 Helm 安装 kube-prometheus-stack
添加 Helm 仓库:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo list
helm repo update prometheus-community
安装:
helm upgrade --install \
--namespace prom \
--create-namespace \
-f values.yaml \
monitor prometheus-community/kube-prometheus-stack
验证
这里主要验证 kubeadm 的 Kubernetes 组件有没有正常监控到, 可以通过 Prometheus UI 或 Grafana UI 直接查看进行验证.
可以通过 Ingress 或 NodePort 将 Prometheus UI 或 Grafana UI 地址暴露出去, 然后访问:
Status -> Targets 查看监控状态, 这里举几个组件来进行说明:



Grafana 可以直接登录后查看对应的仪表板, 如下图:

️ 参考文档
- helm-charts/charts/kube-prometheus-stack at main · prometheus-community/helm-charts (github.com)
- Deploy to kubeadm - Prometheus Operator (prometheus-operator.dev)
- Prometheus Operator 监控 etcd 集群-阳明的博客
- Prometheus: installing kube-prometheus-stack on a kubeadm cluster | Fabian Lee : Software Engineer
本文由博客一文多发平台 OpenWrite 发布!
Prometheus Operator与kube-prometheus之二-如何监控1.23+ kubeadm集群的更多相关文章
- sentinel监控redis高可用集群(二)
一.端口转发. 如果在一个主机里面,安装了两个redis实例,可以在项目里面配置IP端口,用iptables转发. iptables -t nat -A PREROUTING -p tcp --dpo ...
- 二、基于kubernetes构建Docker集群环境实战
kubernetes是google公司基于docker所做的一个分布式集群,有以下主件组成 etcd: 高可用存储共享配置和服务发现,作为与minion机器上的flannel配套使用,作用是使每台 m ...
- 分布式实时日志系统(二) 环境搭建之 flume 集群搭建/flume ng资料
最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...
- ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 1.2 解压 1.3 配置环境变量 1.4 修改配置 1.5 启动 1. ...
- ZooKeeper学习之路(二)—— Zookeeper单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本Zookeeper,这里我下载的版本3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # w ...
- ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建
一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...
- Redis系列(二):Redis高可用集群
一.集群模式 Redis集群是一个由多个主从节点组成的高可用集群,它具有复制.高可用和分片等特性 二.集群部署 1.环境 3台主机分别是: 192.168.160.146 192.168.160.15 ...
- Docker Compose搭建Redis一主二从三哨兵高可用集群
一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...
- (二 )VMware workstation 部署虚拟集群实践——并行批量操作环境部署
在上一篇博客中,已经介绍了安装虚拟集群的过程和需要注意的细节问题. 这篇主要是介绍如何批量登陆远程主机和配置,这个过程中是在没有部署并行处理工具或者集群管理工具的前进行的. ------------首 ...
- 二)spring 集成 ehcache jgroups 集群
依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-co ...
随机推荐
- 【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
问题描述 使用 Azure Cache for Redis 服务,在两个Redis服务之间进行数据导入和导出测试.在Redis中原本有7G的数据值,但是导出时候发现文件大小仅仅只有30MB左右,这个压 ...
- vivo 在离线混部探索与实践
作者:来自 vivo 互联网服务器团队 本文根据甘青.黄荣杰老师在"2023 vivo开发者大会"现场演讲内容整理而成. 伴随 vivo 互联网业务的高速发展,数据中心的规模不断扩 ...
- Java 抽象类 练习
1 package com.bytezreo.template; 2 3 import java.util.Calendar; 4 import java.util.Scanner; 5 6 /** ...
- SQL之 逻辑库,数据表
SQL语言三大类 创建逻辑库 创建数据表 例子 数据表其他操作 ps:desc仅仅查看表的结构,不能查看内容 添加字段 ps: 修改字段类型和约束 修改字段名称 删除字段
- 远程服务调用(RPC与Rest本质区别)
一.背景 远程服务将计算机程序的工作范围从单机扩展到网络,从本地延伸至远程,是构建分布式系统的首要基础.远程服务调用(Remote Procedure Call,RPC)在计算机科学中已经存在了超过四 ...
- 软件架构(四)单体架构(Monolithic Architecture)
系列目录 软件架构(一)概览 软件架构(二)编程语言的历史 软件架构(三)名词解释:架构.设计.风格.模式 软件架构(四)单体架构(Monolithic Architecture) 软件架构(五)分层 ...
- javascript web development es6 pdf js - Cheat Sheet 表格 [vuejs / webcomponents-cheatsheet-2021] 共3套
ES6 预览 VUE2 预览 webcomponents 预览 ES6 2019 pdf下载: https://files.cnblogs.com/files/pengchenggang/javasc ...
- vxe table columns 要用data里的值,用computed的值会导致排序部分不好用。
vxe table columns 要用data里的值,用computed的值会导致排序部分不好用.
- MYSQL 主从不一致的原因分析
数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因. binlog同步模式导致主从不一致 在MYSQL 中主库向从库同步数据是利用binlog记录修改操作 ...
- linux脚本免密的方法/不用输入密码
第一种方法:使用管道(上一个命令的 stdout 接到下一个命令的 stdin):在脚本首行添加 #!/bin/bashecho password | sudo -S apt-get update 第 ...