Kubernetes集群部署全流程+弹性扩缩容实战指南

先搞懂:Kubernetes集群的核心组件

要部署K8s集群,得先明白它的“骨架”——控制平面(Control Plane)和工作节点(Worker Node)的核心组件,不然部署中出问题都找不到北。我整理了一张极简组件表,帮你快速记重点:

Kubernetes集群部署全流程+弹性扩缩容实战指南

组件类型 组件名称 作用说明
控制平面组件 kube-apiserver 集群“入口”,处理所有API请求(比如kubectl命令),是组件间通信的枢纽
控制平面组件 etcd 分布式键值存储,保存集群所有配置和状态(比如Pod、Deployment信息)
控制平面组件 kube-scheduler 负责把Pod调度到合适的工作节点(比如看节点资源、亲和性规则)
控制平面组件 kube-controller-manager 运行各种控制器(比如Deployment控制器维持Pod数量,节点控制器监控节点状态)
工作节点组件 kubelet 管理节点上的Pod生命周期(比如启动、停止Pod),向控制平面汇报节点状态
工作节点组件 kube-proxy 实现Pod网络代理(比如Service的负载均衡、端口转发)
工作节点组件 容器运行时(Containerd) 负责运行容器(替代旧版Docker,现在K8s默认推荐)

简单说:控制平面是“大脑”,工作节点是“手脚”,容器运行时是“肌肉”——这仨配合才能让集群跑起来。

部署前:你必须确认的环境准备

别着急敲命令!部署失败的80%原因是环境没配置对。我列了3个必查项,照做能避90%的坑:

1. 系统与硬件要求

  • 操作系统:优先选LTS版(比如Ubuntu 22.04 LTS、CentOS Stream 9),别用太新或太旧的系统(比如Ubuntu 24.04刚出的时候,kubeadm还没适配);
  • 硬件配置:控制平面节点至少2CPU+4GB内存+20GB硬盘(生产环境建议4CPU+8GB),工作节点根据业务需求调整(比如跑应用至少1CPU+2GB);
  • 网络要求:所有节点(控制平面+工作节点)必须能互通(用ping测试),且关闭防火墙(ufw disablefirewall-cmd --set-default-zone=trusted)和SELinux(setenforce 0临时关闭,修改/etc/selinux/config设为SELINUX=disabled永久关闭)。

2. 安装容器运行时

K8s从1.24版本开始弃用Docker作为默认容器运行时,现在推荐用Containerd(更轻量、更稳定)。以Ubuntu 22.04为例,安装步骤:

# 1. 安装依赖包
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg

# 2. 添加Containerd官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# 3. 添加Docker APT源(Containerd在Docker源里)
echo 
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu 
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 安装Containerd
sudo apt-get update && sudo apt-get install -y containerd.io

# 5. 配置Containerd(启用systemd cgroup驱动,K8s要求)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd && sudo systemctl enable containerd

3. 安装kubeadm、kubelet、kubectl

这三个是部署K8s集群的核心工具:
kubeadm:用于初始化集群、加入节点;
kubelet:运行在所有节点上,管理Pod;
kubectl:集群命令行工具。

安装步骤(Ubuntu 22.04):

# 1. 添加Kubernetes APT源
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 2. 安装指定版本(比如1.30.0,和Containerd适配)
sudo apt-get update && sudo apt-get install -y kubelet=1.30.0-00 kubeadm=1.30.0-00 kubectl=1.30.0-00
# 锁定版本,避免自动升级
sudo apt-mark hold kubelet kubeadm kubectl

动手部署:用kubeadm快速搭集群

kubeadm是官方推荐的“快速部署工具”,适合测试环境和中小规模生产环境。我用“1个控制平面节点+2个工作节点”的架构为例,步骤:

1. 初始化控制平面节点

登录控制平面节点,执行以下命令(替换192.168.1.100为你的控制平面节点IP,10.244.0.0/16是Pod网络CIDR,Calico等网络插件会用到):

sudo kubeadm init 
  --control-plane-endpoint "192.168.1.100:6443"  # 控制平面 endpoint(生产环境建议用负载均衡)
  --image-repository registry.aliyuncs.com/google_containers  # 用阿里云镜像源(国内拉取快)
  --pod-network-cidr=10.244.0.0/16  # Pod网络网段(和网络插件一致)
  --kubernetes-version=v1.30.0 # K8s版本

命令执行成功后,会输出加入工作节点的命令(比如kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash xxx),把这个命令保存好(后面工作节点要用到)。

2. 配置kubectl

控制平面节点初始化后,需要配置kubectl才能管理集群:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 测试是否生效:输出控制平面节点状态(Ready)
kubectl get nodes

3. 安装网络插件

K8s集群必须安装网络插件才能让Pod之间通信。推荐用Calico(稳定、功能全),执行:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 等待1-2分钟,查看Pod状态(全部Running就没问题)
kubectl get pods -n kube-system

4. 加入工作节点

登录每个工作节点,执行之前保存的kubeadm join命令:

sudo kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash xxx

加入成功后,在控制平面节点执行kubectl get nodes,会看到工作节点状态变为Ready

扩缩容实战:从手动到自动的两种方式

部署好集群后,最常用的操作就是扩缩容(增加或减少Pod数量)。我讲两种最实用的方法:

1. 手动扩缩容:用kubectl scale

适合临时调整Pod数量(比如活动期间临时加Pod)。以nginx Deployment为例(假设你已经创建了nginx Deployment):

# 查看当前Pod数量(比如3个)
kubectl get deployment nginx
# 扩缩容到5个Pod
kubectl scale deployment nginx --replicas=5
# 验证:Pod数量变成5个
kubectl get pods -l app=nginx

手动扩缩容的缺点是“不智能”——需要人工监控负载,适合简单场景。

2. 自动扩缩容:用HPA(Horizontal Pod Autoscaler)

HPA是K8s的“自动扩缩容神器”,能根据CPU、内存或自定义指标(比如QPS)自动调整Pod数量。步骤:

第一步:安装Metrics Server

HPA需要Metrics Server来获取Pod的资源使用情况(比如CPU利用率)。执行:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证:Metrics Server Pod运行正常
kubectl get pods -n kube-system -l k8s-app=metrics-server
第二步:创建HPA资源

nginx Deployment为例,配置HPA:

# 创建HPA:最小2个Pod,最大10个Pod,CPU利用率超过50%时扩容
kubectl autoscale deployment nginx --min=2 --max=10 --cpu-percent=50
# 查看HPA状态
kubectl get hpa
第三步:测试HPA

siege工具模拟负载(需要先安装siegesudo apt-get install siege):

# 1. 暴露nginx Service(如果没暴露的话)
kubectl expose deployment nginx --port=80 --type=NodePort
# 2. 获取Service端口(比如30080)
kubectl get svc nginx
# 3. 模拟100个并发请求
siege -c 100 -t 1m http://<工作节点IP>:30080
# 4. 查看HPA状态(CPU利用率上升,Pod数量自动增加)
kubectl get hpa -w

等负载下降后,HPA会自动缩容到最小Pod数量(2个),非常智能!

踩坑预警:部署与扩缩容中的常见问题

我部署过几十次K8s集群,总结了5个最常踩的坑,帮你快速排错:

1. kubeadm init失败:镜像拉取超时

原因:默认镜像源在国外,拉取慢或失败。
解决:用国内镜像源(比如阿里云registry.aliyuncs.com/google_containers),在kubeadm init时加--image-repository参数(前面步骤已经加了)。

2. 工作节点加入失败:token过期

原因:kubeadm生成的token默认24小时过期。
解决:重新生成token:

# 在控制平面节点执行
kubeadm token create --print-join-command

3. Pod状态一直是Pending:调度失败

原因:节点资源不足(比如CPU或内存不够),或有Taint(污点)。
解决
– 查看节点资源:kubectl describe node <节点名>,看AllocatableUsed
– 查看Taint:kubectl describe node <节点名> | grep Taints,如果有NoSchedule污点,用kubectl taint nodes <节点名> <taint-key>-删除。

4. HPA不生效:Metrics Server没安装或没权限

原因:Metrics Server没安装,或没配置--kubelet-insecure-tls(有些环境kubelet用自签证书)。
解决
– 重新安装Metrics Server,修改components.yaml,在spec.containers.args里加--kubelet-insecure-tls(跳过证书验证);
– 验证:kubectl top pod能看到Pod的CPU/内存使用情况。

5. 控制平面节点NotReady:etcd启动失败

原因:etcd数据损坏或端口被占用(etcd默认用2379/2380端口)。
解决
– 查看etcd日志:journalctl -u etcd -f
– 如果数据损坏,删除/var/lib/etcd目录(会丢失集群数据,谨慎操作),重新执行kubeadm init

最后:生产环境的小建议

如果要把集群用到生产环境,我再给3个建议:
1. 控制平面高可用:用3个控制平面节点(避免单点故障),前面加负载均衡(比如HAProxy、Nginx);
2. 数据持久化:etcd的数据要存到可靠的存储(比如SSD磁盘、云盘),避免节点宕机丢失数据;
3. 监控与告警:安装Prometheus+Grafana监控集群状态,用Alertmanager设置告警(比如节点NotReady、Pod重启次数过多)。

原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/242

(0)