1. 系统前置准备(所有节点)

这部分是所有节点都需要执行的准备工作,确保系统满足K8s的运行要求。

  • 设置主机名与hosts解析:为每个节点设置一个唯一的主机名,并配置/etc/hosts文件,让节点之间能通过主机名互相访问-1

# 在Master节点执行
sudo hostnamectl set-hostname k8s-master
# 在Worker节点执行
sudo hostnamectl set-hostname k8s-worker-1

# 在所有节点执行,将下面的IP和主机名换成你的实际信息
cat <<EOF | sudo tee -a /etc/hosts
192.168.1.10 k8s-master
192.168.1.11 k8s-worker-1
EOF

关闭Swap:Kubernetes要求必须禁用Swap分区-1-9

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

配置内核模块与参数:加载overlaybr_netfilter模块,并设置网络转发参数-1-9

# 加载内核模块
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

配置防火墙:Rocky Linux默认启用firewalld,需要开放K8s集群所需的端口-1。以下命令在Master节点执行:

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

Worker节点执行:

sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp # NodePort端口范围
sudo firewall-cmd --reload

2. 安装容器运行时(所有节点)

Kubernetes需要一个容器运行时来运行Pod。这里我们使用官方推荐的containerd-1-9

# 安装 yum-utils 并添加 Docker CE 仓库(containerd.io 在此仓库中)
sudo dnf install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

# 安装 containerd.io
sudo dnf install -y containerd.io

# 生成默认配置并修改为使用 systemd cgroup 驱动(避免启动失败)
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 启动 containerd 并设置开机自启
sudo systemctl enable --now containerd

注意:请勿安装docker-ce,否则K8s可能会自动检测到Docker而非Containerd作为运行时,从而引发配置冲突。只需要安装containerd.io即可。

3. 添加 Kubernetes YUM 源并安装组件

为简化安装过程,建议配置国内镜像源以提高下载速度3:

cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/

安装

sudo dnf install -y kubelet-1.35.3 kubeadm-1.35.3 kubectl-1.35.3 --disableexcludes=kubernetes
设置 kubelet 开机自启(此时会反复重启,待集群初始化后会稳定)
sudo systemctl enable kubelet

初始化 Master 节点(仅在 Master 执行)

sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \
  --apiserver-advertise-address=192.168.174.129 \
  --kubernetes-version=v1.35.0 \
  --cri-socket=unix:///var/run/containerd/containerd.sock \
  --image-repository=registry.aliyuncs.com/google_containers



初始化成功后,配置 kubectl 访问权限

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

💡 保存好 init 命令输出的 kubeadm join 命令,稍后你需要用它来添加Worker节点。如果忘记了,可以在Master上使用 kubeadm token create --print-join-command 重新生成。

如:

kubeadm join 192.168.174.129:6443 --token e7yk5i.k7yjm8os4mdpagrz \
        --discovery-token-ca-cert-hash sha256:9a06c44eee40e549f7763668ef489b02f932d6d1779dc316444387331eb5910e 

终极解决方案:直接跳过网络插件,使用 host-local 和 bridge 插件(无需外部镜像)所有节点

Kubernetes 自带的 bridge 插件不需要拉取任何外部镜像,直接使用 kubelet 内置的 CNI 插件。

步骤 1:创建 CNI 配置文件

# 创建 CNI 配置目录
sudo mkdir -p /etc/cni/net.d

# 创建 bridge 网络配置(无需拉取任何镜像)
cat > /etc/cni/net.d/10-bridge.conf << 'EOF'
{
    "cniVersion": "0.3.1",
    "name": "bridge",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "ranges": [
            [{"subnet": "192.168.0.0/16"}]
        ],
        "routes": [{"dst": "0.0.0.0/0"}]
    }
}
EOF

# 创建 loopback 配置
cat > /etc/cni/net.d/99-loopback.conf << 'EOF'
{
    "cniVersion": "0.3.1",
    "type": "loopback"
}
EOF

# 重启 kubelet
systemctl restart kubelet

步骤 2:重启 kubelet 并检查节点状态

# 重启 kubelet
systemctl restart kubelet

# 等待 10 秒
sleep 10

# 查看节点状态
kubectl get nodes

# 查看 Pod 状态
kubectl get pods -n kube-system

可见成功了

[root@k8s-master ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-bbdc5fdf6-44w48              1/1     Running   0          89m
coredns-bbdc5fdf6-f8zjj              1/1     Running   0          89m
etcd-k8s-master                      1/1     Running   1          89m
kube-apiserver-k8s-master            1/1     Running   2          89m
kube-controller-manager-k8s-master   1/1     Running   1          89m
kube-proxy-jrxnv                     1/1     Running   0          89m
kube-scheduler-k8s-master            1/1     Running   1          89m
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-bbdc5fdf6-44w48              1/1     Running   0          90m
coredns-bbdc5fdf6-f8zjj              1/1     Running   0          90m
etcd-k8s-master                      1/1     Running   1          90m
kube-apiserver-k8s-master            1/1     Running   2          90m
kube-controller-manager-k8s-master   1/1     Running   1          90m
kube-proxy-jrxnv                     1/1     Running   0          90m
kube-scheduler-k8s-master            1/1     Running   1          90m
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   97m   v1.35.3
[root@k8s-master ~]# 

6. 加入 Worker 节点(仅在 Worker 执行)

在Worker节点上,使用第4步保存的kubeadm join命令加入集群。

kubeadm join 192.168.174.129:6443 --token e7yk5i.k7yjm8os4mdpagrz \
        --discovery-token-ca-cert-hash sha256:9a06c44eee40e549f7763668ef489b02f932d6d1779dc316444387331eb5910e 

✅ 验证集群

在Master节点执行 kubectl get nodes,如果所有节点状态都是Ready,就说明集群安装成功了。

更多推荐