K8S R&D: Prometheus与Kubernetes高级配置与管理实践:监控、持久化、高可用及安全机制详解

Prometheus 可视化与查询界面


Prometheus 提供两种可视化方案:

  1. 原生Web界面:内置查询控制台,支持基础监控指标检索,但功能较为局限。
  2. Grafana集成方案:通过配置Grafana数据源为Prometheus,结合 PromQL 查询语言实现动态仪表盘,利用其可视化引擎动态渲染监控仪表盘,实现多维度数据分析与展示。
# Grafana配置Prometheus数据源示例 (grafana-datasource.yaml)  
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: grafana-datasources  
data:  
  prometheus.yaml: |-  
    apiVersion: 1  
    datasources:  
    - name: Prometheus  
      type: prometheus  
      url: http://prometheus-service:9090  # Prometheus服务地址  
      access: proxy  

技术细节 Grafana需通过datasources.yaml配置Prometheus数据源:

datasources:
  - name: Prometheus 
    type: prometheus 
    url: http://prometheus-server:9090 
    access: proxy 

核心流程为:Prometheus 采集数据 → Grafana 拉取数据 → 可视化渲染。此方案需部署 Grafana 组件并建立数据源链路

核心优势:将 Prometheus 的存储查询能力与 Grafana 的可视化引擎解耦,提升监控数据利用率

Prometheus 数据抓取模式(推 vs 拉)


1 ) 拉模式(默认)

  • 主动抓取机制:Prometheus Server 定期访问 Targets 的 /metrics 接口拉取数据
  • 工作流程:Prometheus主动从监控目标轮询拉取数据,需在配置文件中定义抓取目标(targets)。
  • 配置示例:
    # prometheus.yml 片段  
    scrape_configs:  
      - job_name: 'node_exporter'  
        static_configs:  
          - targets: ['node1:9100', 'node2:9100']  # 被监控节点列表  
    

2 ) 推模式(需Pushgateway中转)

被动接收机制:通过 Pushgateway 组件中转短期任务数据

Push 指标
Pull 数据
Client
Pushgateway
Prometheus
  • 工作流程:客户端主动推送数据至Pushgateway,Prometheus再从Pushgateway拉取。
  • 适用场景:短期任务或无法暴露端点的服务。
    # 客户端推送指标示例  
    echo "metric_name 3.14" | curl --data-binary @- http://pushgateway:9091/metrics/job/job_name  
    
  • 典型用例:批处理任务、生命周期短暂的容器等无法暴露HTTP端点的场景
  • 关键约束:Pushgateway 不适用持久化监控场景,可能引发数据堆积问题。

核心差异: 推模式适用于短生命周期任务(如批处理作业),拉模式适合常驻服务监控。

Prometheus 持久化存储配置


存储类型与配置方法

存储方式配置要点适用场景
本地存储--storage.tsdb.path=/data 指定TSDB路径单机测试环境
远程存储(NFS/S3)配置 remote_writeremote_read 指向外部存储系统分布式环境
PVC动态卷通过StorageClass动态绑定云存储(AWS EBS, Ceph等)Kubernetes集群部署

1 ) 本地存储

配置prometheus.yml指定存储路径与保留策略(retention):
存储路径与保留策略(如 --storage.tsdb.path--storage.tsdb.retention.time):

# prometheus.yaml 配置片段
storage:
  tsdb:
    path: /data/prometheus  # 存储目录 
    retention: 30d          # 数据保留30天 

2 ) 远程存储
支持对接云存储(如S3、GCS)或分布式存储(如Ceph):

remote_write:
  - url: "http://remote-storage:1234/write"
remote_read:
  - url: "http://remote-storage:1234/read"

3 ) Kubernetes PV/PVC持久卷

通过PVC绑定底层存储(NFS/GlusterFS等),确保服务重启后数据不丢失:

# Prometheus部署模板(Helm values.yaml)
persistence:
  enabled: true 
  storageClass: "ssd-storage"
  accessModes: ["ReadWriteOnce"]
  size: 100Gi 

# values.yaml (Helm部署)
server:
  persistentVolume:
    enabled: true
    storageClass: "local-storage"
    accessModes: ["ReadWriteOnce"]
    size: 50Gi
  retention: 30d  # 数据保留30天

动态绑定存储卷(支持LocalPV、NFS、Ceph)

# Prometheus StatefulSet PVC配置片段  
volumeClaimTemplates:  
  - metadata:  
      name: prometheus-storage  
    spec:  
      storageClassName: ssd  
      accessModes: [ "ReadWriteOnce" ]  
      resources:  
        requests:  
          storage: 100Gi  

优化策略:

  • 启用压缩:启用TSDB压缩减少磁盘占用(--storage.tsdb.wal-compression=true) 或 (--storage.tsdb.compression
  • 保留策略:通过retention.time控制数据生命周期。

数据生命周期管理

  • 保留策略:启动参数 --storage.tsdb.retention.time=30d 控制数据保留周期
  • 空间优化:启用 --storage.tsdb.wal-compression 进行写入压缩,降低磁盘占用
    灾难恢复原则:存储卷必须与Prometheus实例分离,防止节点故障导致数据丢失。

Prometheus 高可用(HA)部署方案


核心挑战:原生不支持HA,需借助多实例与协同工具。

Prometheus 不原生支持HA,需通过以下架构实现:

Prometheus集群
上传数据
上传数据
聚合查询
聚合查询
对象存储
Prometheus实例1
Prometheus实例2
Thanos Query
Grafana

1 ) 方案1:多实例冗余

部署配置完全相同的Prometheus实例,同时抓取相同目标,实现数据冗余。

2 ) 方法二:Thanos集成

2.1. 组件架构:

  • Sidecar容器: 每个Prometheus实例侧挂Thanos Sidecar容器,与每个Prometheus实例同Pod运行,上传数据至对象存储(如S3)
  • Store Gateway:从对象存储读取数据
  • Query:聚合多实例数据并提供统一查询入口

部署示例(Kubernetes Pod内共存):

# Prometheus + Thanos Sidecar部署片段  
containers:  
- name: prometheus  
  image: prom/prometheus:v2.30  
- name: thanos-sidecar  
  image: thanosio/thanos:v0.24  
  args:  
    - sidecar  
    - --prometheus.url=http://localhost:9090  
    - --objstore.config-file=/etc/thanos/bucket.yaml  

2.2. 故障转移:Query组件负载均衡查询请求,单实例故障不影响整体可用性。

核心组件作用

  • Thanos Sidecar:挂载于每个Prometheus Pod,实时同步数据到对象存储
    • 多实例数据通过对象存储持久化
  • Thanos Query:提供全局查询入口,合并多实例数据并实现负载均衡
    故障转移逻辑:任一Prometheus实例宕机,Query自动切换至健康实例获取数据。

Prometheus 持续查询机制 (Recording Rules)

机制:定期预计算常用查询,结果存储为新时间序列,提升查询效率

# recording_rules.yml 示例  
groups:  
- name: http_requests_total_5m  
  rules:  
  - record: job:http_requests_total:rate5m  
    expr: sum(rate(http_requests_total[5m])) by (job)  

持续查询(Continuous Queries) 定期执行预定义PromQL,将结果保存为新时间序列,用于:

  • 长期趋势分析(如CPU日均使用率)
  • 降低实时查询计算开销
# 示例:计算5分钟平均CPU使用率并持久化 
CREATE CONTINUOUS QUERY cq_cpu_avg ON metrics 
BEGIN 
  SELECT avg(cpu_usage) INTO cpu_avg_5m 
  FROM node_cpu 
  GROUP BY time(5m), instance 
END 

Kubernetes RBAC 配置与管理

核心概念

RBAC(Role-Based Access Control)通过角色绑定控制资源权限:

  • Role:命名空间内权限集合(如Pod读写权限)
  • ClusterRole:跨命名空间权限
  • RoleBinding:将Role绑定到用户/服务账号
# 创建Role 
apiVersion: rbac.authorization.k8s.io/v1 
kind: Role 
metadata:
  namespace: dev 
  name: pod-editor 
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "create", "delete"]
---
# 创建RoleBinding 
apiVersion: rbac.authorization.k8s.io/v1 
kind: RoleBinding 
metadata:
  name: bind-pod-editor 
  namespace: dev 
subjects:
- kind: User 
  name: dev-user 
  apiGroup: rbac.authorization.k8s.io 
roleRef:
  kind: Role 
  name: pod-editor 
  apiGroup: rbac.authorization.k8s.io 

Kubernetes 敏感信息传递 (Secrets)

Secret资源使用方式

1 )Secret资源加密存储

# 创建存储MySQL密码的Secret
kubectl create secret generic mysql-pass \
  --from-literal=password='S!B\*d$zDsb='

2 ) 环境变量注入:

env:
  - name: DB_PASSWORD 
    valueFrom:
      secretKeyRef:
        name: db-secret 
        key: password 

3 ) 卷挂载:

volumes:
  - name: cred-volume 
    secret:
      secretName: db-secret 
containers:
  - volumeMounts:
      - name: cred-volume 
        mountPath: "/etc/credentials"

安全实践:启用Secret加密(EncryptionConfiguration)保护静态数据。

4 )容器注入方式对比

注入方式实现命令/配置安全等级
环境变量注入env.valueFrom.secretKeyRef中(日志泄露风险)
卷挂载volumes[0].secret.secretName + volumeMounts

Kubernetes 容器安全管理


策略实施方法
最小权限原则容器以非root用户运行:securityContext: { runAsUser: 1000 }
安全上下文禁用特权容器:securityContext: { privileged: false }
网络策略隔离限制Pod间通信:NetworkPolicy 定义ingress/egress规则
镜像漏洞扫描使用Trivy/Clair扫描镜像,阻断高风险镜像部署
RBAC授权控制限制服务账号权限(如automountServiceAccountToken: false
定期更新维护滚动更新基础镜像(Alpine/Distroless)修复CVE
审计日志监控启用审计日志(--audit-log-path)并集成SIEM系统

核心防御层级

最小特权原则
安全上下文
网络策略
镜像扫描
RBAC管控

容器安全管理实践

1 )最小权限原则:容器以非root用户运行

securityContext:  
  runAsUser: 1000  
  runAsGroup: 3000  
  allowPrivilegeEscalation: false  

2 )安全上下文(SecurityContext):限制内核能力。

securityContext:
 privileged: false 
 capabilities:
   drop: ["ALL"]
   add: ["NET_BIND_SERVICE"]  

3 )网络策略隔离:

apiVersion: networking.k8s.io/v1  
kind: NetworkPolicy  
metadata:  
 name: db-isolation  
spec:  
 podSelector:  
   matchLabels:  
     role: db  
 ingress:  
 - from:  
   - podSelector:  
       matchLabels:  
         role: frontend  

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy 
spec:
 podSelector: {matchLabels: {app: db}}
 ingress:
   - from: [{podSelector: {matchLabels: {app: web}}}]

4 )镜像漏洞扫描:使用Trivy或Clair定期扫描镜像。

5 )RBAC 与认证:强制 TLS 证书和服务账号认证

6 )定期更新:基础镜像与依赖项漏洞修复

7 )审计日志:启用 kube-apiserver 审计日志监控安全事件结合kube-audit记录安全事件

Kubernetes 多环境部署策略


隔离维度实现方式适用场景
命名空间隔离prod/staging/dev 命名空间划分环境严格隔离
配置与变量注入ConfigMap + 环境变量动态切换应用配置差异化
标签选择器nodeSelector: env: production硬件资源分区

1 ) 命名空间隔离

kubectl create namespace dev 
kubectl create namespace prod

# 简单示例
kubectl create ns dev
kubectl create ns prod

2 ) 配置差异化

  • ConfigMap按环境划分:configmap-dev.yaml / configmap-prod.yaml

    envFrom:
      - configMapRef:
          name: dev-config 
    
  • 环境变量直配

    env:
      - name: LOG_LEVEL 
        value: "DEBUG"
    
  • 使用Kustomize管理环境变量与配置文件

    # kustomization.yaml 
    bases:
      - ../base 
    patchesStrategicMerge:
      - env_vars.yaml 
    

3 ) 节点标签调度:分配专用节点至特定环境

kubectl label nodes node01 env=production 
kubectl label nodes node02 env=development 
# 标记节点 
kubectl label nodes node1 env=dev 
# Pod指定节点 
nodeSelector:
  env: dev 

spec:  
  nodeSelector:  
    tier: prod  

Kubernetes 与 CI/CD 工具集成方式


1 )Jenkins Kubernetes 插件:动态创建 Agent Pod

2 )kubeconfig 多集群管理:切换上下文部署

kubectl config use-context dev-cluster 

3 )Helm 包管理:版本化应用发布

helm upgrade --install myapp ./chart -f values-prod.yaml 

Kubernetes 集群备份方案

备份策略:

  • 全量备份(ETCD 快照)
  • 增量备份(仅变化数据)
  • 周期性执行(如每日)
  • 多版本存储
类型说明工具
ETCD全量备份备份整个集群状态etcdctl snapshot save
增量备份仅备份变更资源(如Velero)Velero + Restic
周期性备份定时任务(如CronJob)K8s CronJob
  • 全量备份:ETCD快照(含所有资源状态)。
  • 增量备份:仅备份变更数据(如Velero)。

ETCD备份命令

ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/etcd/ca.crt \
  --cert=/etc/etcd/server.crt \
  --key=/etc/etcd/server.key 

# 简化
etcdctl --endpoints=$ENDPOINT snapshot save snapshot.db

Velero备份示例:

velero install --provider aws --bucket velero-backups \  
  --secret-file ./credentials-aws  
velero create backup daily-backup --include-namespaces prod  

Kubernetes 资源优化管理

1 ) 资源配额(Requests/Limits)

resources:
  requests:
    cpu: "100m"
    memory: "256Mi"
  limits:
    cpu: "500m"
    memory: "1Gi"

2 ) 自动扩缩容

  • HPA(水平扩展):基于CPU/内存扩缩Pod数量
    apiVersion: autoscaling/v2 
    kind: HorizontalPodAutoscaler 
    metadata:
      name: app-hpa 
    spec:
      scaleTargetRef:
        apiVersion: apps/v1 
        kind: Deployment 
        name: my-app 
      minReplicas: 2 
      maxReplicas: 10 
      metrics:
      - type: Resource 
        resource:
          name: cpu 
          target:
            type: Utilization 
            averageUtilization: 80 
    
  • VPA(垂直扩展):自动调整Pod资源规格(注意:需避免与HPA同时使用)

3 ) 节点亲和性调度

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: disktype
              operator: In
              values: ["ssd"]

4 ) 调度优化

  • 污点与容忍度:taints/tolerations
  • Pod拓扑分布约束:topologySpreadConstraints

容器安全补丁管理


1 ) 基础镜像更新

  • 使用Alpine/Distroless等最小化镜像
  • 定期重建镜像:FROM alpine:3.18(锁定小版本)

2 ) 漏洞扫描流水线

定期扫描镜像漏洞(工具:Trivy/Clair)

无漏洞
高危漏洞
CI构建镜像
Trivy扫描
推送至仓库
阻断部署
trivy image my-app:latest  

3 ) 更新应用程序依赖项并重构镜像

4 )安全上下文加固

securityContext:
  readOnlyRootFilesystem: true 
  allowPrivilegeEscalation: false 
  capabilities:
    drop: ["ALL"]

Kubernetes 故障转移与自愈

机制实现原理
控制器自愈Deployment/StatefulSet自动重建故障Pod,维持replicas数量
健康检查Liveness探针失败时重启容器;Readiness探针屏蔽流量
控制平面高可用多Master节点运行etcd/API-Server,故障时Leader选举切换
存储卷故障转移StatefulSet + PersistentVolume自动挂载新节点
服务负载均衡Service通过Endpoint列表动态路由,自动剔除不可用Pod

1 ) 控制器自愈:Deployment/ReplicaSet 维持 Pod 副本数

Deployment自愈:Pod故障后自动重建

2 ) 健康检查(Liveness探针示例):

livenessProbe:  
  httpGet:  
    path: /healthz  
    port: 8080  
  initialDelaySeconds: 15  
  periodSeconds: 20  

3 ) 控制平面HA:Master节点多实例部署(kube-apiserver负载均衡)

4 )服务负载均衡:Service 自动路由至健康 Pod

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值