本文以 Ubuntu 22.04 LTS 为例,从零开始搭建一个 Kubernetes 集群(1 个 Master + N 个 Worker)。所有命令均经过验证,请根据实际环境调整版本号和 IP。
一、环境准备与系统配置
每台节点都需要以下操作。先确认系统版本与主机名,然后关闭 swap(K8s 要求)、配置内核参数并加载所需模块。
# 查看系统版本
cat /etc/os-release
# 设置主机名(Master 节点示例)
sudo hostnamectl set-hostname k8s-master
# Worker 节点设为 k8s-worker1、k8s-worker2 等
# 关闭 swap(临时+永久)
sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
# 加载 overlay 和 br_netfilter 模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置 sysctl 参数
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
# 检查模块是否加载
lsmod | grep br_netfilter
lsmod | grep overlay二、安装容器运行时 (Containerd)
K8s 需要容器运行时来运行 Pod。这里选择 Containerd,它是 CNCF 毕业项目,稳定且轻量。
# 安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl
# 添加 Docker 官方 GPG 密钥和仓库(Containerd 由 Docker 维护)
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装 Containerd
sudo apt-get install -y containerd.io
# 生成默认配置文件并修改(启用 systemd cgroup)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启 Containerd
sudo systemctl restart containerd
sudo systemctl enable containerd三、安装 kubeadm、kubelet 和 kubectl
这三个工具是部署集群的核心:kubeadm 初始化集群,kubelet 是节点代理,kubectl 是命令行控制工具。注意锁定版本以避免升级冲突。
# 添加 Kubernetes 官方 GPG 密钥和仓库
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新并安装(指定版本避免自动升级)
sudo apt-get update
sudo apt-get install -y kubelet=1.28.2-1.1 kubeadm=1.28.2-1.1 kubectl=1.28.2-1.1
# 锁定版本
sudo apt-mark hold kubelet kubeadm kubectl
# 启动 kubelet(此时会处于 waiting 状态,初始化后恢复正常)
sudo systemctl enable --now kubelet四、使用 kubeadm 初始化集群
这一步只在 Master 节点执行。注意指定 Pod 网络 CIDR(要与后续网络插件一致),并记录生成的 join 命令。
# 初始化集群(Pod 网络 CIDR 使用 10.244.0.0/16,对应 Flannel;若用 Calico 可使用 192.168.0.0/16)
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.1.10
# 配置 kubectl(使用普通用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 检查节点状态
kubectl get nodes初始化成功后会输出类似以下内容(请保存 kubeadm join 命令):
You can now join any number of worker nodes by running the following on each node:
kubeadm join 192.168.1.10:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx五、安装网络插件 (Calico)
为了让 Pod 之间互相通信,必须安装 CNI 网络插件。这里使用 Calico,它支持网络策略且性能优秀。
# 下载 Calico 清单文件
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
# 如果初始化时指定了其他 Pod CIDR,需要修改 calico.yaml 中的 CALICO_IPV4POOL_CIDR
# 默认是 192.168.0.0/16,与上面一致则无需修改
# 部署 Calico
kubectl apply -f calico.yaml
# 等待 Pod 全部 Running
kubectl get pods -n kube-system -w等待 calico-node 和 calico-kube-controllers 变为 Running 状态后,Master 节点应变为 Ready。
六、将工作节点加入集群
在每台 Worker 节点上执行 Master 初始化时生成的 kubeadm join 命令。如果 token 过期,可在 Master 上重新生成。
# 在 Worker 节点上(注意替换实际的 token 和 hash)
sudo kubeadm join 192.168.1.10:6443 --token <your-token> --discovery-token-ca-cert-hash sha256:<your-hash>
# 如果 token 丢失或过期,在 Master 上重新生成:
# kubeadm token create --print-join-command加入成功后,在 Master 节点查看所有节点:
kubectl get nodes所有节点应显示 Ready 状态。
七、验证集群状态
运行简单的 Nginx 部署来测试集群是否正常工作。
# 创建测试 Deployment
kubectl create deployment nginx --image=nginx
# 暴露为 NodePort 服务(便于外部访问)
kubectl expose deployment nginx --port=80 --type=NodePort
# 获取服务端口
kubectl get svc nginx
# 访问任一节点的 IP + NodePort(例如 192.168.1.10:30912)
curl http://192.168.1.10:30912如果能返回 Nginx 默认页面,则集群部署成功!
至此,你已经拥有一个运行中的 Kubernetes 集群。后续可根据需要安装 Dashboard、Ingress Controller、监控等组件。









评论(0)