Kubernetes 安装部署

Kubernetes 集群安装部署,包含 kubeadm、containerd、CNI、节点加入和基础验证。

Kubernetes 安装部署

本文档使用 kubeadm 部署 Kubernetes 集群,容器运行时使用 containerd。示例适合实验环境和生产标准化脚本的基础模板,生产环境还需要补充高可用控制面、负载均衡、证书轮换、备份和监控。

节点规划

节点角色示例 IP
k8s-master-01control-plane10.0.0.11
k8s-worker-01worker10.0.0.21
k8s-worker-02worker10.0.0.22

示例网段:

类型网段
Pod CIDR10.244.0.0/16
Service CIDR10.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