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

组件类型 | 组件名称 | 作用说明 |
---|---|---|
控制平面组件 | 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 disable
或firewall-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
工具模拟负载(需要先安装siege
:sudo 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 <节点名>
,看Allocatable
和Used
;
– 查看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