在企业级环境中,Kubernetes (K8s) 已经成为微服务架构的事实标准。本文将深入探讨如何从零开始搭建一个生产级别的 K8s 集群,并使用 Ingress 暴露微服务,最后集成 Prometheus 实现监控告警。
集群搭建:从裸机到容器编排
基础环境准备
首先,我们需要准备至少三台服务器(建议四核 8G 内存起步),操作系统选择 CentOS 7 或 Ubuntu 20.04。确保服务器之间网络互通,并关闭防火墙或开放必要的端口(6443, 2379-2380, 10250-10252, 30000-32767)。
安装 Docker 和 Kubeadm
在所有节点上安装 Docker 和 Kubeadm 工具。
# 以 CentOS 7 为例
yum install -y docker
systemctl start docker
systemctl enable docker
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
初始化 Kubernetes 集群
在一台服务器上作为 Master 节点执行以下命令进行初始化:
kubeadm init --apiserver-advertise-address=<Master 节点 IP> --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 安装 Calico 网络插件(或其他 CNI 插件)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
记录下 kubeadm join 命令,用于将其他节点加入集群。
加入 Worker 节点
在其他服务器上执行 kubeadm join 命令,将它们加入到 Kubernetes 集群。
kubeadm join <Master 节点 IP>:<端口> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
验证集群状态
在 Master 节点上执行 kubectl get nodes 命令,确认所有节点都处于 Ready 状态。
微服务暴露:Ingress 的配置与使用
安装 Ingress Controller
Ingress Controller 负责将外部流量路由到集群内部的微服务。这里我们选择使用 Nginx Ingress Controller。 在K8S集群中, 提到Nginx,不可避免的会想到反向代理,负载均衡,以及面对高并发场景下,对Nginx的配置优化,例如调整worker_processes,worker_connections 等参数。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
配置 Ingress 规则
假设我们有一个名为 myapp 的微服务,它的 Service 名称是 myapp-service,监听端口是 80。我们可以创建一个 Ingress 资源来暴露它:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com # 修改为你自己的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
将以上内容保存为 myapp-ingress.yaml 文件,然后执行 kubectl apply -f myapp-ingress.yaml 命令创建 Ingress 资源。
DNS 解析
将域名 myapp.example.com 解析到 Ingress Controller 的外部 IP 地址。
监控告警:Prometheus 监控体系搭建
安装 Prometheus
使用 Helm 安装 Prometheus Operator:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack
配置 ServiceMonitor
ServiceMonitor 用于监控特定的 Service。例如,要监控 myapp-service,可以创建以下 ServiceMonitor 资源:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-servicemonitor
labels:
release: prometheus
spec:
selector:
matchLabels:
app: myapp # 匹配 myapp-service 的 labels
endpoints:
- port: web # 监控的端口名称
interval: 30s
配置 Alertmanager
Alertmanager 负责接收 Prometheus 的告警,并根据配置的规则进行通知。可以通过修改 prometheus-kube-prometheus-alertmanager 的 ConfigMap 来配置告警规则。
实战避坑经验总结
- 网络问题:确保集群内部网络互通,CNI 插件配置正确。
- 资源限制:合理设置 Pod 的资源限制 (CPU/Memory),防止资源耗尽。
- 版本兼容性:注意各个组件的版本兼容性,例如 Kubernetes 版本、Ingress Controller 版本、Prometheus Operator 版本等。
- 监控覆盖率:确保监控覆盖到所有关键指标,例如 CPU 使用率、内存使用率、磁盘 IO、网络流量、应用响应时间等。
- 告警阈值:合理设置告警阈值,避免误报和漏报。 对于企业级应用来说,经常使用的宝塔面板也是一种快速部署和管理服务器的方式,但需要注意安全配置。
通过本文,你应该能够成功搭建一个企业级的 K8s 集群,并使用 Ingress 暴露微服务,最后集成 Prometheus 实现监控告警。记住,实践是检验真理的唯一标准,多动手尝试才能真正掌握这些技术。
冠军资讯
程序员老猫