在企业级环境中,Kubernetes (K8s) 已经成为云原生应用部署和管理的首选平台。然而,从零开始搭建一个高可用、可扩展的 K8s 集群,并实现微服务的优雅暴露和完善的监控告警机制,仍然面临诸多挑战。本文将深入探讨这些关键环节,分享最佳实践和避坑经验。
K8s 集群搭建:高可用方案选型
Etcd 集群搭建
Etcd 是 K8s 的核心组件,用于存储集群状态和配置信息。为了保证高可用,Etcd 集群至少需要部署 3 个节点。我们推荐使用静态成员发现方式配置 Etcd 集群,避免依赖 DNS 或其他服务发现机制。
# etcd.conf.yml
name: etcd-1
data-dir: /var/lib/etcd
listen-client-urls: http://10.0.0.1:2379
advertise-client-urls: http://10.0.0.1:2379
initial-advertise-peer-urls: http://10.0.0.1:2380
listen-peer-urls: http://10.0.0.1:2380
initial-cluster-token: etcd-cluster
initial-cluster: etcd-1=http://10.0.0.1:2380,etcd-2=http://10.0.0.2:2380,etcd-3=http://10.0.0.3:2380
initial-cluster-state: new
Kubernetes Master 节点初始化
使用 kubeadm 工具可以快速初始化 K8s Master 节点。在初始化过程中,需要指定 Etcd 集群的地址和 Kubernetes 版本。
kubeadm init --apiserver-advertise-address=10.0.0.1 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.27.0 --control-plane-endpoint="10.0.0.1:6443" --ignore-preflight-errors=all
--apiserver-advertise-address: 指定 API Server 监听的 IP 地址。--pod-network-cidr: 指定 Pod 网络 CIDR。--kubernetes-version: 指定 Kubernetes 版本。--control-plane-endpoint:指定高可用集群的 endpoint 地址,通常使用负载均衡器地址。
Kubernetes Worker 节点加入集群
使用 kubeadm join 命令可以将 Worker 节点加入到 K8s 集群中。
kubeadm join 10.0.0.1:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
微服务暴露:Ingress Controller 选型与配置
Ingress Controller 选型
Ingress Controller 负责将外部流量路由到 K8s 集群内部的 Service。常见的 Ingress Controller 包括 Nginx Ingress Controller 和 Traefik。
- Nginx Ingress Controller: 基于 Nginx,稳定可靠,社区活跃。支持多种配置方式,包括 ConfigMap 和 IngressClass。
- Traefik: 云原生 Ingress Controller,支持动态配置和自动证书管理。更易于与云平台集成。
本文以 Nginx Ingress Controller 为例进行讲解。在实际生产环境中,需要根据业务需求和团队技术栈选择合适的 Ingress Controller。
Nginx Ingress Controller 部署
可以通过 Helm Chart 快速部署 Nginx Ingress Controller。
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --create-namespace
Ingress 规则配置
通过 Ingress 规则可以将外部域名或路径映射到 K8s Service。
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
nginx.ingress.kubernetes.io/rewrite-target: 指定 URL 重写规则,将请求转发到后端 Service 时去掉 Ingress 中定义的路径前缀。
监控告警:Prometheus + Grafana 方案
Prometheus 部署
Prometheus 是一款开源的监控和告警系统,可以采集 K8s 集群和应用程序的指标数据。同样可以使用 Helm Chart 进行快速部署。
helm install prometheus prometheus-community/prometheus --namespace prometheus --create-namespace
K8s 集群监控配置
Prometheus 可以通过 Service Discovery 机制自动发现 K8s 集群中的 Pod 和 Service,并采集其指标数据。需要配置相应的 ServiceMonitor 和 PodMonitor 资源。
# servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-service-monitor
namespace: default
spec:
selector:
matchLabels:
app: my-service # 匹配 Service 的 labels
endpoints:
- port: web
Grafana 仪表盘配置
Grafana 是一款开源的数据可视化工具,可以与 Prometheus 集成,展示 K8s 集群和应用程序的监控数据。Grafana 提供了丰富的仪表盘模板,可以快速创建 K8s 监控仪表盘。
Alertmanager 告警配置
Alertmanager 是 Prometheus 的告警组件,可以根据预定义的规则发送告警通知。可以配置告警规则,例如 CPU 使用率超过 80% 时发送告警通知。
# alert.rules.yml
alert: HighCPUUsage
expr: sum(rate(process_cpu_seconds_total{job="node-exporter"}[5m])) by (instance) > 0.8
for: 1m
labels:
severity: warning
annotations:
summary: Instance {{ $labels.instance }} CPU usage is above 80%
实战避坑经验总结
- Etcd 集群备份: 定期备份 Etcd 集群数据,防止数据丢失。
- Ingress 资源限制: 限制 Ingress 资源的创建权限,避免恶意 Ingress 规则影响集群稳定性。
- Prometheus 存储容量规划: 合理规划 Prometheus 的存储容量,避免磁盘空间不足。
- 告警规则优化: 根据实际业务需求优化告警规则,避免误报和漏报。
通过以上实践,可以搭建一个稳定可靠的企业级 K8s 集群,并实现微服务的优雅暴露和完善的监控告警机制。在实际部署过程中,还需要根据具体情况进行调整和优化,不断提升 K8s 运维能力。
冠军资讯
代码一只喵