1、第一版2025年12月31日

我是用的K8S-1.28的版本部署的,K8S-1.24+推荐用containerd容器。
部署K8S的系统优化,请参照我写的Linux系统优化-K8S方向这个文旦进行操作
部署K8S安装containerd容器,请参照我写的containerd容器安装来进行操作
我从部署K8S安装containerd容器这个文档的最后开始操作,已经安装了K8S组件:dnf install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2
可以查看安装的三个K8S组件:kubeadm version && kubelet --version && kubectl version --client

再检查一下containerd是否正常运行:systemctl status containerd

设置 kubelet 开机自启(此时不启动,因为配置未完成):systemctl enable kubelet
配置 kubelet 使用 systemd cgroup driver
# 指定 kubelet 使用 systemd 作为 cgroup 驱动(和系统的 cgroup 管理方式对齐),目的是
# 让 kubelet 和 containerd / 操作系统的 cgroup 管理机制一致,避免兼容问题
tee /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF

加载并设置开机启动kubelet:systemctl daemon-reload && systemctl enable kubelet
生成 kubeadm 初始化配置:kubeadm config print init-defaults > kubeadm-init.yaml
修改kubeadm-init.yaml配置文件
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef  # 生成新的令牌
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.119.128  # 是 Master 节点的实际物理 IP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: master1  # 实际主机名
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
  extraArgs:
    etcd-servers: https://192.168.119.130:2379  # 指向etcd实际监听的IP和端口,这里是本机
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd  # etcd数据存储目录,默认即可
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16  # 必须和 CNI 网络插件(Flannel/Calico)匹配,不冲突
  serviceSubnet: 10.96.0.0/12 # 是 Service 虚拟 IP 网段,核心要求是不与物理网络冲突
scheduler: {}
kubeletConfiguration:
  cgroupDriver: systemd
验证kubeadm-init.yaml配置文件是否正确:kubeadm config validate --config=kubeadm-init.yaml

kubeadm-init.yaml配置文件没问题开始执行初始化:kubeadm init --config kubeadm-init.yaml
执行初始化成功的标志和讲解(里面有四条命令,必须执行,另外一个是节点加入集群的命令,在子节点运行)

查看节点【查看节点状态时,集群中仅存在 master1 节点,其状态为 NotReady,原因是尚未部署 CNI 网络插件(如 Flannel/Calico)】

我们需要部署 Calico 网络插件,完成 Pod 网络配置后,节点状态即可变为 Ready。
先下载calico配置文件:wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml
查看calico.yaml使用的镜像并下载:grep -aiE "image" calico.yaml

下载calico.yaml包含的镜像:crictl pull docker.io/calico/cni:v3.28.0 && crictl pull docker.io/calico/node:v3.28.0 && crictl pull docker.io/calico/kube-controllers:v3.28.0

部署 Calico 网络插件:kubectl apply -f calico.yaml

检查 Calico 组件运行状态:kubectl get pods -n kube-system | grep calico
等待所有 calico 相关 Pod 变为 Running 状态,master1 节点即可转为 Ready

至此,master1控制节点部署完成
现阶段集群只有 master1 一个节点,且 master1 默认带有node-role.kubernetes.io/control-plane:NoSchedule污点(该污点会禁止 Pod 调度到控制平面节点);因此有两种方案让集群 “正常可用”:
1)部署新的 Node 节点并执行kubeadm join命令加入 master1 集群(推荐生产环境);
2)移除 master1 的污点,允许 Pod 调度到 master 节点(仅测试 / 单节点场景):

更多推荐