Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
13. 部署Prometheus监控
# Prometheus介绍 >注意⚠️:如果已安装metrics-server需要先卸载,否则冲突 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。 Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker。 输出被监控组件信息的HTTP接口被叫做exporter。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息 (包括磁盘、内存、CPU、网络等等) 与其他监控系统相比,Prometheus的主要特点是: - 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸); - 非常高效的存储; - 一种灵活的查询语言; - 不依赖分布式存储,单个服务器节点; - 时间集合通过HTTP上的PULL模型进行; - 通过中间网关支持推送时间; - 通过服务发现或静态配置发现目标; - 多种模式的图形和仪表板支持。 # Grafana介绍 Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点: 1. 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式; 2. 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等; 3. 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知; 4. 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源; 5. 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记; 6. 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。 # 组件说明 - MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等。 - PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。 - NodeExporter:用于各node的关键度量指标状态数据。 - KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。 - Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。 - Grafana:是可视化数据统计和监控平台。 # 安装部署 项目地址:https://github.com/prometheus-operator/kube-prometheus 根据实际安装版本下载对应兼容prometheus版本 ![](/media/202407/2024-07-12_154036_4286020.6146457959897393.png) ``` #示例下载版本为 v1.12.0 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.12.0.tar.gz ``` ## 替换镜像地址 解压并进入kube-prometheus-0.12.0目录下操作 ``` # 查看原镜像下载地址 grep 'registry.k8s.io/' manifests/* -RH # 替换为国内加速镜像地址(注意,实际加速地址请自行替换) IMAGE_REPO='k8s.localvps.top' sed -i "s#registry.k8s.io/#$IMAGE_REPO/#g" manifests/*.yaml # 查看更新后的地址 grep "$IMAGE_REPO/" manifests/* -RH ``` ## 修改svc类型(可选) svc默认以clusterIP方式暴露,可改为NodePort或者使用ingress。 - 修改 `kube-prometheus/manifests/grafana-service.yaml` 文件,使用 nodepode 方式 ![](/media/202406/2024-06-08_201212_8682860.5046215812301802.png) - 修改 `kube-prometheus/manifests/prometheus-service.yaml`,改为nodepode方式 ![](/media/202406/2024-06-08_201310_8512020.5550459781472314.png) - 修改 kube-prometheus/manifests/alertmanager-service.yaml,改为 nodepode方式 ![](/media/202406/2024-06-08_201329_0407380.9725024189169378.png) ## 创建资源对象 ``` # 注意,由于某些 CRD 大小,我们使用的是自 kubernetes 1.22以来通常可用的 kubectl 服务器端应用特性。 # 如果您使用以前的 kubernetes 版本,这个特性可能不可用,您需要使用 kubectl create。 # 创建名称空间和 CRD kubectl create namespace monitoring kubectl apply --server-side -f manifests/setup # 等待名称空间和 CRD 可用 kubectl wait \ --for condition=Established \ --all CustomResourceDefinition \ --namespace=monitoring # 创建剩余的资源 kubectl apply -f manifests/ ``` ## 验证查看 查看pod状态 ``` [root@master1 kube-prometheus]# kubectl get pod -n monitoring NAME READY STATUS RESTARTS AGE alertmanager-main-0 2/2 Running 0 61s alertmanager-main-1 2/2 Running 0 61s alertmanager-main-2 2/2 Running 0 61s blackbox-exporter-576df9484f-lr6xd 3/3 Running 0 107s grafana-795ddfd4bd-jxlrw 1/1 Running 0 105s kube-state-metrics-bdfdcd5cd-7dgwl 3/3 Running 0 104s node-exporter-4qnrz 2/2 Running 0 104s node-exporter-8hjr7 2/2 Running 0 104s node-exporter-8s5hp 2/2 Running 0 103s node-exporter-kgb48 2/2 Running 0 104s node-exporter-p8b7q 2/2 Running 0 103s node-exporter-v4nz7 2/2 Running 0 103s prometheus-adapter-65b6bd474c-qvdb8 1/1 Running 0 102s prometheus-adapter-65b6bd474c-vlxhn 1/1 Running 0 102s prometheus-k8s-0 1/2 Running 0 58s prometheus-k8s-1 2/2 Running 0 58s prometheus-operator-6565b7b5f5-mgclf 2/2 Running 0 101s ``` 查看top信息 ``` [root@master1 kube-prometheus]# kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% master1 579m 14% 2357Mi 66% master2 383m 9% 1697Mi 48% master3 482m 12% 2069Mi 58% work1 131m 3% 1327Mi 37% work2 132m 3% 1134Mi 32% work3 176m 4% 1100Mi 31% [root@master1 kube-prometheus]# kubectl top pod NAME CPU(cores) MEMORY(bytes) myapp-58bbc79c4f-cc9g5 0m 1Mi myapp-58bbc79c4f-txnp5 0m 1Mi myapp-58bbc79c4f-zvlcr 0m 1Mi ``` ## 新增ingress资源 >注意⚠️:ingress-nginx配置和traefik配置二选其一即可 ``` # 为了便于区分,新建目录存放 mkdir manifests/ingress/ ``` **以ingress-nginx为例** ``` tee >manifests/ingress/ingress-prometheus.yaml<< EOF apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alertmanager namespace: monitoring annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: alertmanager.local.com http: paths: - path: / pathType: Prefix backend: service: name: alertmanager-main port: number: 9093 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grafana namespace: monitoring annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: grafana.local.com http: paths: - path: / pathType: Prefix backend: service: name: grafana port: number: 3000 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: prometheus namespace: monitoring annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: prometheus.local.com http: paths: - path: / pathType: Prefix backend: service: name: prometheus-k8s port: number: 9090 EOF ``` ---- **以traefik为例** ``` tee >manifests/ingress/ingress-prometheus.yaml<< EOF apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: alertmanager namespace: monitoring spec: entryPoints: - web routes: - match: Host(`alertmanager.local.com`) kind: Rule services: - name: alertmanager-main port: 9093 --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: grafana namespace: monitoring spec: entryPoints: - web routes: - match: Host(`grafana.local.com`) kind: Rule services: - name: grafana port: 3000 --- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: prometheus namespace: monitoring spec: entryPoints: - web routes: - match: Host(`prometheus.local.com`) kind: Rule services: - name: prometheus-k8s port: 9090 [root@master1 manifests]# kubectl apply -f ingress.yaml ingressroute.traefik.containo.us/alertmanager created ingressroute.traefik.containo.us/grafana created ingressroute.traefik.containo.us/prometheus created EOF ``` 部署应用资源 ``` kubectl apply -f manifests/ingress ``` ## web访问验证 新增hosts解析记录 ``` 192.168.10.10 alertmanager.local.com grafana.local.com prometheus.local.com ``` 访问`http://alertmanager.local.com`,查看当前激活的告警 ![](/media/202406/2024-06-08_201605_1145990.3489823581810997.png) 访问`http://prometheus.local.com/targets`,查看targets已全部up ![](/media/202406/2024-06-08_201649_9154120.301889459939774.png) 访问`http://grafana.local.com/login`,默认用户名和密码是admin/admin ![](/media/202406/2024-06-08_201708_9173740.8020281276577796.png) 查看数据源,以为我们自动配置Prometheus数据源 ![](/media/202406/2024-06-08_201718_3182630.9615600998379896.png) ## targets异常处理 查看targets可发现有两个监控任务没有对应的instance,这和serviceMonitor资源对象有关 ![](/media/202406/2024-06-08_201739_2801540.49814786088396656.png) 由于prometheus-serviceMonitorKubeScheduler文件中,selector匹配的是service的标签,但是namespace中并没有k8s-app=kube-scheduler的service 新建prometheus-kubeSchedulerService.yaml并apply创建资源 ``` apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-scheduler labels: k8s-app: kube-scheduler #与servicemonitor中的selector匹配 spec: selector: component: kube-scheduler # 与scheduler的pod标签一直 ports: - name: http-metrics port: 10251 targetPort: 10251 protocol: TCP ``` 新建prometheus-kubeControllerManagerService.yaml并apply创建资源 ``` apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-controller-manager labels: k8s-app: kube-controller-manager spec: selector: component: kube-controller-manager ports: - name: http-metrics port: 10252 targetPort: 10252 protocol: TCP ``` 再次查看targets信息 ![](/media/202406/2024-06-08_201812_8232830.6870693910197125.png) ## 部署pushgateway(可选) Pushgateway 是 Prometheus 监控系统的一个组件服务,允许无法被直接抓取的任务推送指标数据。以下是关于 Pushgateway 的详细解释及其适用场景。 **主要作用** Pushgateway 的主要作用是为短暂性或批处理作业提供一个推送指标数据的接口。通常情况下,Prometheus 通过拉取(pull)被监控目标的指标数据。但对于一些运行时间短或无法直接被拉取的任务,如批处理作业、临时任务,防火墙内服务等,Pushgateway 提供了一种推送(push)的方式来收集这些数据。它的工作原理如下: 1. 指标推送:短暂的作业(如批处理作业)将它们的指标数据推送到 Pushgateway。 2. 存储指标:Pushgateway 接收这些指标并存储它们,直到被新的数据覆盖或明确删除。 3. Prometheus 抓取:Prometheus 定期从 Pushgateway 拉取存储的指标数据,并将它们合并到自己的时间序列数据库中进行处理和展示。 **适用场景** - 短暂性任务:对于那些运行时间较短且不适合直接暴露服务的任务,如定时任务、批处理作业等,可以将它们的指标数据推送到 Pushgateway。 - 批处理作业:用于需要在作业完成后立即报告指标的批处理作业。 - 临时任务:用于运行时间不确定或不经常运行的临时任务。 创建资源清单 pushgetway目录下,创建这三个yaml文件。 ``` prometheus-pushgatewayServiceMonitor.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: labels: prometheus: k8s name: prometheus-pushgateway namespace: monitoring spec: endpoints: - honorLabels: true port: http jobLabel: k8s-app selector: matchLabels: app: prometheus-pushgateway ``` ``` ometheus-pushgatewayService.yaml apiVersion: v1 kind: Service metadata: labels: app: prometheus-pushgateway name: prometheus-pushgateway namespace: monitoring spec: type: NodePort ports: - name: http port: 9091 nodePort: 30400 targetPort: metrics selector: app: prometheus-pushgateway # type: ClusterIP ``` ``` prometheus-pushgatewayDeployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: prometheus-pushgateway name: prometheus-pushgateway namespace: monitoring spec: replicas: 1 selector: matchLabels: app: prometheus-pushgateway template: metadata: labels: app: prometheus-pushgateway spec: containers: - image: prom/pushgateway:v0.8.0 livenessProbe: httpGet: path: /#/status port: 9091 initialDelaySeconds: 10 timeoutSeconds: 10 name: prometheus-pushgateway ports: - containerPort: 9091 name: metrics readinessProbe: httpGet: path: /#/status port: 9091 initialDelaySeconds: 10 timeoutSeconds: 10 resources: limits: cpu: 50m memory: 100Mi requests: cpu: 50m memory: 100Mi ``` 创建资源 ``` kubectl apply -f . ```
Nathan
July 12, 2024, 5:36 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password