3. Kubecost 部署实战:Helm 安装、命名空间规划、持久化存储配置、Ingress 暴露

本章将带领你完成 Kubecost 在生产环境中的完整部署流程。我们将采用 Helm Chart 作为安装载体,并围绕命名空间隔离、持久化存储、安全暴露三个核心维度进行生产级配置。部署完成后,你将拥有一个具备历史数据持久化能力、可通过域名安全访问的 Kubecost 实例,为后续的压测与容量预测沙盘打下基础设施基础。

3.1 命名空间规划与资源隔离

Kubecost 默认部署在 kubecost 命名空间,但在多租户或严格安全管控的集群中,建议按以下策略进行规划:

环境 命名空间 说明
生产集群 cost-monitoring 与业务命名空间隔离,便于 RBAC 和 NetworkPolicy 管控
压测沙盘 kubecost-sandbox 独立沙盘环境,可随时重建,不影响生产数据
多集群聚合 kubecost-global 用于 Thanos 或 Prometheus 联邦场景下的统一视图
最佳实践: 建议在压测沙盘中使用 kubecost-sandbox 命名空间,并提前创建 NetworkPolicy 限制仅允许监控系统与 Ingress Controller 访问,避免压测流量污染集群网络基线。

3.2 Helm 安装与核心参数配置

Kubecost 官方 Helm Chart 仓库地址为 https://kubecost.github.io/cost-analyzer。以下为生产级安装命令,包含持久化、Ingress 和资源限制配置:

# 添加 Helm 仓库
helm repo add kubecost https://kubecost.github.io/cost-analyzer
helm repo update

# 创建命名空间
kubectl create namespace kubecost-sandbox

# 安装 Kubecost(含持久化与 Ingress 配置)
helm upgrade --install kubecost kubecost/cost-analyzer \
  --namespace kubecost-sandbox \
  --set global.prometheus.enabled=true \
  --set global.prometheus.storageSpec.volumeClaimTemplate.spec.accessModes[0]=ReadWriteOnce \
  --set global.prometheus.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi \
  --set global.prometheus.storageSpec.volumeClaimTemplate.spec.storageClassName=gp3 \
  --set persistentVolumeClaim.size=10Gi \
  --set persistentVolumeClaim.storageClass=gp3 \
  --set ingress.enabled=true \
  --set ingress.annotations."nginx\.ingress\.kubernetes\.io/auth-type"=basic \
  --set ingress.hosts[0].host=kubecost.sandbox.example.com \
  --set ingress.hosts[0].paths[0].path=/ \
  --set ingress.tls[0].hosts[0]=kubecost.sandbox.example.com \
  --set ingress.tls[0].secretName=kubecost-tls \
  --set kubecostToken="dGhpcyBpcyBhIHRva2Vu" \
  --set prometheus.nodeExporter.enabled=false \
  --set prometheus.serviceAccounts.nodeExporter.create=false
注意: 生产环境中务必禁用 prometheus.nodeExporter.enabled 以避免与集群已有的 Node Exporter 冲突。如果集群已部署 Prometheus Operator,建议设置 global.prometheus.enabled=false 并配置 global.prometheus.fqdn 指向已有 Prometheus 服务。

3.3 持久化存储配置详解

Kubecost 依赖 Prometheus 存储历史指标数据,同时自身也维护一份成本分配缓存。持久化配置分为两个层面:

  • Prometheus 数据卷: 存储容器指标、节点指标、命名空间成本数据,建议分配 50Gi~200Gi 取决于集群规模。
  • Kubecost 自身 PVC: 存储资产缓存、云账单数据、自定义配置,建议分配 10Gi~30Gi。

以下为存储配置参数对照表:

参数路径 默认值 生产推荐值 说明
global.prometheus.storageSpec.volumeClaimTemplate.spec.resources.requests.storage 32Gi 100Gi Prometheus 数据保留 15 天所需容量
persistentVolumeClaim.size 32Gi 20Gi Kubecost 自身缓存与资产数据
persistentVolumeClaim.storageClass standard gp3 / premium-rwo 建议使用 SSD 类 StorageClass 保障 IOPS
global.prometheus.storageSpec.volumeClaimTemplate.spec.storageClassName standard gp3 Prometheus 写入密集型场景需高 IOPS
压测沙盘存储建议: 沙盘环境建议使用 gp3 或 csi-hostpath 类 StorageClass,容量设置为 50Gi(Prometheus)+ 10Gi(Kubecost),保留周期设为 7 天即可满足压测数据回放需求。

3.4 Ingress 暴露与安全加固

Kubecost 的 Dashboard 默认通过 ClusterIP 服务暴露,生产环境必须通过 Ingress 进行安全暴露。以下为推荐的 Ingress 配置清单:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubecost-ingress
  namespace: kubecost-sandbox
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: kubecost-auth
    nginx.ingress.kubernetes.io/auth-realm: "Kubecost - Authentication Required"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "100m"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - kubecost.sandbox.example.com
    secretName: kubecost-tls
  rules:
  - host: kubecost.sandbox.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubecost-cost-analyzer
            port:
              number: 9090
安全加固要点:
  • 必须启用 Basic Auth 或 OAuth2 Proxy 进行身份认证,避免 Kubecost API 直接暴露。
  • 配置 SSL 强制重定向,禁止 HTTP 明文访问。
  • 设置 proxy-body-size 为 100m 以支持大查询请求体。
  • 建议额外配置 IP 白名单 或 VPN 访问 限制来源。

3.5 部署架构总览

下图展示了 Kubecost 在压测沙盘中的完整部署架构,包含命名空间隔离、持久化存储、Ingress 暴露以及数据流向:

Kubecost 压测沙盘部署架构图 运维/分析师 Ingress (Nginx) Kubecost cost-analyzer Pod Prometheus 指标采集与存储 Kubecost PVC 缓存 / 资产数据 (10Gi) Prometheus PVC 指标数据 (50Gi) 命名空间: kubecost-sandbox 安全说明 Basic Auth 认证 SSL 强制重定向 IP 白名单限制

3.6 部署验证与快速检查清单

部署完成后,执行以下命令验证所有组件正常运行:

# 检查 Pod 状态
kubectl get pods -n kubecost-sandbox

# 检查 PVC 是否绑定
kubectl get pvc -n kubecost-sandbox

# 检查 Ingress 是否配置正确
kubectl get ingress -n kubecost-sandbox

# 查看 Kubecost 日志确认启动无报错
kubectl logs -n kubecost-sandbox deployment/kubecost-cost-analyzer --tail=50

# 通过端口转发快速验证 UI(临时)
kubectl port-forward -n kubecost-sandbox deployment/kubecost-cost-analyzer 9090:9090
快速检查清单:
  • ☐ 所有 Pod 处于 Running 状态,且 READY 列为 1/1
  • ☐ PVC 状态为 Bound,StorageClass 与预期一致
  • ☐ Ingress 的 ADDRESS 列已分配 IP 或域名
  • ☐ 通过浏览器访问 https://kubecost.sandbox.example.com 弹出 Basic Auth 认证框
  • ☐ 登录后 Dashboard 正常加载,且右上角显示集群名称与时间范围

至此,Kubecost 已成功部署在压测沙盘环境中,具备持久化存储、安全 Ingress 暴露和命名空间隔离能力。下一阶段将基于此环境进行安全基线水位压测与容量预测模型训练。