小白搭建K8S集群0基础教程
📌 第一步:准备工作(所有节点都要做)
在开始之前,你需要准备至少两台 Linux 服务器(可以是云服务器、虚拟机或物理机)。本教程以目前企业最主流的 Ubuntu 22.04 为例。
机器规划示例:
- Master 节点:控制集群的大脑(建议 2核4G 及以上)。
- Worker 节点:干活的小兵,运行容器的地方(建议 2核4G 及以上)。
1. 设置主机名(方便区分)
bash
# 在主节点上执行
sudo hostnamectl set-hostname k8s-master
# 在工作节点上执行
sudo hostnamectl set-hostname k8s-node1
2. 关闭防火墙和 Swap 分区
K8S 为了性能考虑,强制要求关闭 Swap(虚拟内存)。
bash
# 关闭防火墙
sudo ufw disable
sudo ufw status
# 临时关闭 Swap
sudo swapoff -a
# 永久关闭 Swap(注释掉带有 swap 的那一行)
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3. 设置内核参数
让 iptables 看到桥接流量,这是 K8S 网络通信的必备条件。
bash
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用配置
sudo sysctl --system
📌 第二步:安装容器运行时(所有节点都要做)
K8S 需要一个"干活"的底层工具来运行容器,这里我们选择最主流的 containerd。
bash
# 1. 安装基础工具
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 2. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 3. 设置仓库
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. 生成默认配置文件并修改
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 6. 关键一步:修改 SystemdCgroup 为 true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 7. 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
📌 第三步:安装 K8S 核心组件(所有节点都要做)
现在我们来安装 kubeadm(搭建工具)、kubelet(节点代理)和 kubectl(命令行工具)。
bash
# 1. 下载阿里云镜像源的 GPG 密钥(国内网络环境强烈推荐)
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
# 2. 添加阿里云 K8S 镜像源
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 3. 安装指定版本的 K8S 组件(以 1.28.0 为例,版本太新可能会有兼容性问题)
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl
# 4. 启动 kubelet 并设置开机自启
sudo systemctl enable kubelet
📌 第四步:初始化 Master 主节点(仅在 Master 上操作)
万事俱备,现在我们来拉起集群的"大脑"。
bash
# 1. 初始化集群
# --apiserver-advertise-address 填你的 Master 节点内网 IP
# --pod-network-cidr 是 Pod 的网络范围,后面装网络插件要用到
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \ # ⚠️记得替换成你的 Master IP
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--pod-network-cidr=10.244.0.0/16
💡 初始化成功后,终端会输出一大段内容,一定要仔细看!
你需要执行它提示的三条命令来配置 kubectl 权限,并且务必把最后那句 kubeadm join ... 复制保存下来,这是后续 Worker 节点加入集群的"通行证"。
bash
# 2. 配置 kubectl 命令补全(不然敲命令很累)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 3. 让 kubectl 命令支持 Tab 键补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
📌 第五步:安装网络插件(仅在 Master 上操作)
刚搭好的集群此时还是个"裸机",Pod 之间无法互相通信。我们需要安装一个 CNI(容器网络接口)插件。这里推荐使用轻量级的 Flannel。
bash
# 下载 Flannel 的 YAML 配置文件
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 稍微修改一下,让它和上面设置的 pod-network-cidr 对应
# 确认 kube-flannel.yml 中的 net-conf.json 里的 Network 字段是 10.244.0.0/16
# 应用配置,安装 Flannel
kubectl apply -f kube-flannel.yml
等待几十秒后,检查所有 Pod 是否处于 Running 状态:
bash
kubectl get pods -n kube-system
📌 第六步:加入 Worker 工作节点(仅在 Worker 上操作)
还记得在 Master 初始化完成时保存的那句 kubeadm join ... 吗?把它粘贴到你的 Worker 节点终端执行即可!
bash
# 示例(你的 token 和 hash 会和这个不一样,用你自己保存的那个)
sudo kubeadm join 192.168.1.100:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef...
⚠️ 如果忘记保存怎么办?
别慌,回到 Master 节点,执行以下命令重新生成一条:
bash
kubeadm token create --print-join-command
🎉 第七步:大功告成,验证集群!
回到 Master 节点,敲下这行魔法指令:
bash
kubectl get nodes
如果看到类似下面的输出,恭喜你,一个崭新的 K8S 集群已经完美运行在你的机器上了!
text
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 10m v1.28.0
k8s-node1 Ready <none> 2m v1.28.0
💡 常见报错
kubeadm init一直卡住或报错 :90% 是因为网络不通或者/etc/containerd/config.toml里的SystemdCgroup没有设为true。改完后记得sudo systemctl restart containerd。- Node 节点状态为
NotReady:通常是网络插件(Flannel/Calico)没装好,或者它的 Pod 还在拉取镜像中,耐心等待几分钟,或者用kubectl describe node查看具体报错。 - 想重置集群重来? :在任何节点执行
sudo kubeadm reset即可清空状态,然后重新初始化。
。