Kubernetes 安装部署
Kubernetes 集群安装部署,包含 kubeadm、containerd、CNI、节点加入和基础验证。
Kubernetes 安装部署
本文档使用 kubeadm 部署 Kubernetes 集群,容器运行时使用 containerd。示例适合实验环境和生产标准化脚本的基础模板,生产环境还需要补充高可用控制面、负载均衡、证书轮换、备份和监控。
节点规划
| 节点 | 角色 | 示例 IP |
|---|---|---|
k8s-master-01 | control-plane | 10.0.0.11 |
k8s-worker-01 | worker | 10.0.0.21 |
k8s-worker-02 | worker | 10.0.0.22 |
示例网段:
| 类型 | 网段 |
|---|---|
| Pod CIDR | 10.244.0.0/16 |
| Service CIDR | 10.96.0.0/12 |
前置要求
- 所有节点主机名唯一。
- 所有节点时间同步正常。
- 所有节点能互相访问。
- 禁用 swap。
- containerd 使用 systemd cgroup。
- 防火墙或安全组放行 Kubernetes 组件端口。
基础初始化
所有节点执行:
hostnamectl set-hostname k8s-master-01
swapoff -a
sed -i.bak '/ swap / s/^/#/' /etc/fstab
modprobe overlay
modprobe br_netfilter
写入内核参数:
cat > /etc/modules-load.d/k8s.conf <<'EOF'
overlay
br_netfilter
EOF
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<'EOF'
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
安装 containerd
Ubuntu / Debian:
apt-get update
apt-get install -y containerd
CentOS / RHEL / Rocky Linux:
yum install -y containerd
生成默认配置并启用 systemd cgroup:
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl enable --now containerd
systemctl restart containerd
systemctl status containerd
安装 kubeadm / kubelet / kubectl
建议固定 Kubernetes 次版本。新版 Kubernetes 软件源按安装版本区分不同仓库,下面以 v1.34 为例;如果需要安装 v1.36,将命令中的 v1.34 替换成 v1.36 即可。
Ubuntu / Debian:
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gpg
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/Release.key \
| gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/ /" \
| tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
CentOS / RHEL / Rocky Linux:
export K8S_MINOR=v1.34
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/rpm/repodata/repomd.xml.key
EOF
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
初始化控制面
在第一个控制面节点执行:
kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12
配置 kubeconfig:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown "$(id -u):$(id -g)" $HOME/.kube/config
安装 CNI
集群初始化后必须安装 CNI 插件,Pod 网络才会正常。下面以 Flannel 为例:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
如果使用 Calico、Cilium 等 CNI,需要确保 Pod CIDR 与 kubeadm 初始化参数一致。
加入 Worker 节点
在控制面生成加入命令:
kubeadm token create --print-join-command
在 Worker 节点执行输出的命令,格式类似:
kubeadm join 10.0.0.11:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
基础验证
kubectl get nodes -o wide
kubectl get pods -A
kubectl cluster-info
kubectl get componentstatuses
验证创建应用:
kubectl create deployment nginx --image=nginx:1.27
kubectl expose deployment nginx --port=80 --type=ClusterIP
kubectl get pod,svc
kubectl delete deployment nginx
kubectl delete service nginx
常见问题
| 现象 | 排查方向 |
|---|---|
节点一直 NotReady | 检查 CNI、kubelet、containerd、Pod CIDR |
kubeadm init 失败 | 查看错误输出,执行 kubeadm reset 后重新初始化 |
| 镜像拉取失败 | 检查网络、镜像仓库、代理和 containerd 配置 |
| Pod 无法跨节点通信 | 检查 CNI 状态、内核参数和防火墙 |
| kubelet 启动失败 | 查看 journalctl -u kubelet -xe |
重置节点
危险操作,仅在重装或移除节点时使用:
kubeadm reset -f
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube
systemctl restart kubelet
systemctl restart containerd