Kubeadm和二进制方式对比

Kubeadm方式搭建K8S集群

1.环境准备

  • 准备 3 台机器(1 Master + 2 Node)
  • 系统建议:Ubuntu / Rocky / AlmaLinux

2.系统初始化(关键步骤)

1
2
3
4
5
6
7
8
# 关闭 swap
swapoff -a

# 关闭 selinux
setenforce 0

# 开启桥接
modprobe br_netfilter

3.安装 containerd

为什么用 containerd 而不是 Docker?两者区别

Kubernetes 已经不再直接支持 Docker(从 v1.24 开始)

Kubernetes 不再直接使用 Docker,而是使用 containerd 作为容器运行时,因为 containerd 更轻量、架构更简单,并且符合 CRI 标准。

1
2
3
yum install -y containerd
systemctl enable containerd
systemctl start containerd

4.安装 kubeadm / kubelet / kubectl

1
2
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
systemctl enable kubelet

5.初始化 Master

1
2
3
4
5
kubeadm init \
  --apiserver-advertise-address=192.168.1.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --pod-network-cidr=192.168.0.0/16

–apiserver-advertise-address (控制平面对外通信IP) Master 节点的内网IP

–image-repository (镜像仓库地址)

–kubernetes-version (指定版本)

–pod-network-cidr (Pod 网段) 这个必须和网络插件匹配!

插件默认 CIDR
Flannel10.244.0.0/16
Calico192.168.0.0/16
Cilium10.0.0.0/8(常见)

为什么必须初始化?不做会怎样?

本质:把一个普通Linux机器变成“控制平面节点”

① 生成证书(超级重要)

  • API Server 证书
  • kubelet 证书

② 启动核心组件(以Pod形式)

  • API Server
  • Scheduler
  • Controller Manager
  • etcd

③ 初始化 etcd

👉存储集群数据

④ 生成 join token

👉 给 Node 用来加入集群

⑤ 配置 kubeconfig

👉 让 kubectl 能操作集群

如果某一步失败:

步骤失败后果
证书所有组件通信失败
etcd集群数据无法存储
API Server集群不可访问
kubeletPod起不来

6.配置 kubectl

1
2
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config

7.安装网络插件(CNI)

1
kubectl apply -f calico.yaml

Calico / Cilium / Flannel 区别

本质:它们都是 CNI(网络插件)

作用:让 Pod 之间可以通信

特性FlannelCalicoCilium
难度简单中等
性能一般非常高
网络策略❌ 不支持✔ 支持✔ 强大
原理overlayBGP/iptableseBPF
企业使用⭐主流⭐高端

8.Node 加入集群

1
kubeadm join <master-ip>:6443 --token xxx --discovery-token-ca-cert-hash xxx

9.验证集群

1
2
kubectl get nodes
kubectl get pods -A

二进制方式搭建K8S集群

手动搭建:证书体系 + etcd + 控制平面 + 节点组件

1.环境初始化

  • 关闭 swap
  • 配置主机名
  • 配置 hosts
  • 时间同步

2.生成证书

使用 cfssl:CA → 签发所有组件证书

包括:

  • etcd
  • apiserver
  • kubelet
  • kubectl

3.部署 etcd 集群

3节点 etcd + TLS通信

1
systemctl start etcd

4.部署 Control Plane

kube-apiserver(最核心)

必须指定:

  • etcd 地址
  • TLS证书
  • service CIDR
controller-manager
  • 控制循环
  • 需要 kubeconfig
scheduler
  • 调度 Pod

5.部署 Node

安装:

  • containerd
  • kubelet
  • kube-proxy

kubelet 加入流程

1
kubelet → 请求证书 → CSR → 手动批准 → Node Ready

批准:

1
2
kubectl get csr
kubectl certificate approve xxx

6.安装 CNI

Calico / Flannel

7.验证集群

1
2
kubectl get nodes
kubectl get pods -A

kubeadm vs 二进制部署 对比

对比维度kubeadm 部署二进制部署
本质自动化部署工具手动部署所有组件
复杂度⭐ 简单(几条命令)❗ 非常复杂
学习价值入门/生产实用深入理解原理
部署速度快(分钟级)慢(小时级)
证书管理自动生成 ✔手动生成(cfssl)❗
组件配置自动生成 ✔手动编写所有配置 ❗
etcd部署自动 ✔手动搭建集群 ❗
控制平面组件自动以 Pod 运行 ✔手动 systemd 管理 ❗
kubelet加入集群自动 join ✔手动 CSR 审批 ❗
出错排查简单(标准化)困难(自由度高)
可控性中等⭐ 极高
灵活性一般⭐ 极强
升级维护简单(kubeadm upgrade)✔❗ 非常复杂
生产环境使用⭐⭐⭐⭐⭐ 主流⭐ 少数(定制场景)
适合人群运维 / DevOps架构师 / 深度学习
是否推荐✅ 强烈推荐❗ 学习用

kubeadm 本质上是对二进制部署流程的封装,它自动完成证书生成、组件配置和集群初始化,而二进制部署则需要手动实现这些步骤,因此二进制方式更灵活但运维成本更高。

故障模拟解决

通用问题解决框架:

① 节点(Node)是否正常 ② 组件(Control Plane / kubelet)是否正常 ③ 网络(CNI / DNS / Service)是否正常 ④ 资源对象(Pod / Deployment)是否异常

1
2
3
4
kubectl get nodes
kubectl get pods -A
kubectl describe xxx
kubectl logs xxx

场景1:kubeadm init 卡住

拉镜像失败(最常见)

1
2
3
卡在:pulling images

排查:kubeadm config images pull

2.containerd / CRI 问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
卡在:waiting for kubelet

#排查:
systemctl status containerd
systemctl status kubelet

常见原因:
- containerd 没启动
- cgroup 不一致

# 修复
containerd config default | tee /etc/containerd/config.toml
systemctl restart containerd

3.端口被占用

1
2
3
netstat -lntp | grep 6443

# 常见端口:6443(API Server);2379(etcd)

4. swap 没关

1
2
3
4
free -h

# 如果有 swap:
swapoff -a

场景2:Node NotReady(超高频)


一步判断

1
2
3
kubectl get nodes

kubectl describe node <node>

常见原因

1. CNI没装(最常见)

1
2
3
4
NotReady
Reason: NetworkPluginNotReady

解决:kubectl apply -f calico.yaml

2.kubelet异常

1
2
3
4
systemctl status kubelet
journalctl -u kubelet -f

常见问题:配置错误;证书问题

3.containerd异常

1
systemctl status containerd

4.节点资源不足

1
2
3
#  CPU / 内存不够
top
free -h

5.时间不同步

1
2
# TLS认证失败
timedatectl

场景3:Pod Pending

常见原因

1.没有可用节点(调度失败)

1
2
3
0/2 nodes are available

# 原因:Node NotReady;资源不足

2.资源不足

1
2
Insufficient CPU / memory
# 解决:减少资源请求;增加节点

3.PVC 未绑定(存储问题)

1
2
3
PersistentVolumeClaim is not bound

# 排查:kubectl get pvc

4.网络问题(CNI)

Pod一直 Pending 或 ContainerCreating

5.镜像拉取失败(有时是 Pending → ImagePullBackOff)

1
2
3
kubectl describe pod

# 原因:私有仓库没认证;网络问题