CentOS 上搭建 Kubernetes 集群全流程
一 环境规划与前置条件
二 系统初始化与内核参数
# 更新与基础
sudo yum update -y
sudo hostnamectl set-hostname k8s-master # Worker 改为 k8s-node1 等
echo "10.0.0.10 k8s-master" | sudo tee -a /etc/hosts # 按实际 IP 填写
sudo timedatectl set-ntp true
# 关闭 Swap(临时与永久)
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
# SELinux(两种做法其一:宽容模式;其二:禁用并重启)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 或:sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && sudo reboot
# 内核网络参数
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 关闭防火墙
sudo systemctl stop firewalld && sudo systemctl disable firewalld
# 或仅放通必要端口
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --reload
cat <<EOF | sudo tee /etc/sysctl.d/99-k8s-extra.conf
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
EOF
sudo sysctl --system
说明:关闭 Swap、设置内核桥接与转发、加载 overlay/br_netfilter 是 kube-proxy 与 CNI 正常工作的前提。
三 安装容器运行时 Containerd
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y containerd.io
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 使用 systemd cgroup 驱动(与 kubelet 保持一致)
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 可选:使用国内镜像仓库加速 pause 等基础镜像
sudo sed -i 's@registry.k8s.io/pause@registry.aliyuncs.com/google_containers/pause@' /etc/containerd/config.toml
sudo systemctl enable --now containerd
sudo systemctl status containerd
sudo ctr version
sudo crictl --runtime-endpoint=unix:///var/run/containerd/containerd.sock version
说明:自 v1.24 起官方推荐 containerd;确保 containerd 与 kubelet 使用相同的 cgroup 驱动(systemd)。
四 安装 kubeadm kubelet kubectl
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
sudo yum install -y kubelet-1.27.0 kubeadm-1.27.0 kubectl-1.27.0
sudo systemctl enable --now kubelet
五 初始化 Master 与安装 CNI 网络
sudo kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.27.0
sudo kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.27.0 \
--service-cidr=20.1.0.0/16 \
--pod-network-cidr=20.2.0.0/16 \
--cri-socket unix:///run/containerd/containerd.sock
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# Calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 或 Flannel(若使用 Flannel,Pod CIDR 常用 10.244.0.0/16)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get nodes
kubectl get pods -A
说明:初始化成功后按提示保存 kubeadm join 命令;CNI 未就绪时节点会处于 NotReady。
六 加入 Worker 节点与公网访问
# 示例(请使用实际输出)
sudo kubeadm join 10.0.0.10:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>
kubeadm token create --print-join-command
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
# 访问地址:http://<任一节点公网IP>:<NodePort>
说明:暴露到公网前务必配置 TLS/Ingress/防火墙 与访问控制。
七 常见问题与排障
sudo kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 或 ctr 手动拉取
sudo ctr -n k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
sudo journalctl -u kubelet -f
kubectl get pods -n kube-system
kubeadm token create --print-join-command
八 生产环境加固与优化建议