1. 为什么需要Kubernetes集群部署?
在当今云原生时代,Kubernetes(简称K8s)已经成为容器编排的事实标准。我仍然记得第一次在生产环境部署K8s集群时的场景——当时我们团队有超过20个微服务需要管理,手动维护Docker容器简直是噩梦。K8s集群部署不仅解决了我们的服务编排问题,更重要的是带来了以下核心价值:
- 资源利用率提升:通过智能调度将容器分配到最优节点,我们的服务器成本降低了40%
- 高可用保障:当某个节点故障时,K8s会自动迁移Pod到健康节点,这是我们之前用Docker Swarm无法实现的
- 声明式配置:所有部署状态通过YAML文件定义,彻底告别了"这个服务为什么能跑?"的灵魂拷问
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 生产级K8s集群部署方案设计
2.1 集群架构选型
根据多年实践经验,我推荐以下三种主流架构方案:
| 架构类型 | 适用场景 | 优缺点对比 |
|---|---|---|
| 单Master多Node | 开发测试环境 | 部署简单但存在单点故障风险 |
| 多Master高可用 | 中小型生产环境 (推荐) | 需要3台以上奇数Master节点 |
| 联邦集群 | 跨云/跨地域大型部署 | 复杂度高但容灾能力极强 |
提示:90%的中型企业选择多Master架构即可满足需求,不必过度设计
2.2 节点规格建议
以部署10个常规微服务为例,硬件配置参考:
Master节点:
- CPU: 4核以上
- 内存: 8GB+
- 磁盘: 100GB SSD (etcd特别需要低延迟存储)
Worker节点:
- CPU: 按业务需求,建议预留30%buffer
- 内存: 每个Pod预留0.5-1GB系统开销
- 磁盘: 建议单独挂载/var/lib/docker
3. 手把手部署Kubernetes集群
3.1 环境准备(以Ubuntu 22.04为例)
bash复制# 所有节点执行
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update && sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 禁用swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3.2 初始化Master节点
bash复制sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<MASTER_IP> \
--control-plane-endpoint=<LOAD_BALANCER_IP>:6443
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 安装CNI网络插件
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3.4 加入Worker节点
使用kubeadm init输出的join命令:
bash复制kubeadm join <MASTER_IP>:6443 --token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
4. 关键配置与优化技巧
4.1 必须修改的默认参数
在/etc/kubernetes/kubelet.conf中添加:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "500Mi"
4.2 存储方案选择
根据业务需求选择适合的StorageClass:
-
本地存储:适用于高性能需求
yaml复制kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer -
网络存储:推荐使用Rook+Ceph
bash复制
kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
5. 常见问题排查指南
5.1 节点NotReady状态排查
bash复制# 查看kubelet日志
journalctl -u kubelet -f
# 检查网络连通性
kubectl get pods -n kube-system
ping <其他节点IP>
# 常见原因:
# 1. 网络插件未正确安装(重装Flannel/Calico)
# 2. 节点资源不足(free -h检查内存)
# 3. 证书过期(kubeadm certs check-expiration)
5.2 Pod一直处于Pending状态
bash复制kubectl describe pod <pod-name>
kubectl get events --sort-by='.metadata.creationTimestamp'
# 典型错误:
# 1. Insufficient cpu/memory(调整资源请求)
# 2. No nodes available to schedule(检查节点污点设置)
# 3. PersistentVolumeClaim未绑定(检查StorageClass)
6. 生产环境必备组件
6.1 监控方案部署
bash复制# 安装Prometheus Operator
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
6.2 日志收集方案
yaml复制# Filebeat DaemonSet示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
spec:
template:
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.14.0
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
7. 集群维护与升级
7.1 版本升级步骤
bash复制# 1. 升级kubeadm
apt-get update && apt-get install -y kubeadm=<新版本>
kubeadm upgrade plan
kubeadm upgrade apply v<新版本>
# 2. 排空节点
kubectl drain <node> --ignore-daemonsets
# 3. 升级kubelet和kubectl
apt-get update && apt-get install -y kubelet=<新版本> kubectl=<新版本>
systemctl restart kubelet
# 4. 解除节点保护
kubectl uncordon <node>
7.2 日常维护命令
bash复制# 查看集群状态
kubectl get componentstatuses
# 检查证书有效期
kubeadm certs check-expiration
# 节点资源监控
kubectl top nodes
# 清理终止的Pod
kubectl get pods | grep Terminating | awk '{print $1}' | xargs kubectl delete pod
在管理生产集群三年后,我最大的体会是:一定要建立完整的监控告警体系,90%的严重故障都有前期征兆。建议至少监控以下指标:
- 节点内存/磁盘使用率
- API Server响应延迟
- etcd写入延迟
- 网络丢包率
