一、前置规划(集群设计)
1.网络规划
根据自己资源合理规划
2. 网络规划
集群 Pod 网段:10.244.0.0/16(Flannel/Calico 默认网段)
集群 Service 网段:10.96.0.0/12(K8s 默认 Service 网段)
节点间通信端口:需开放 6443(API Server)、2379-2380(etcd)、10250(kubelet)等端口(后续环境准备会详细列出)
3. 工具准备
容器运行时:containerd(K8s 1.24+ 推荐,替代 Docker)
集群部署工具:kubeadm(官方推荐,轻量高效)
网络插件:Calico(生产级,支持网络策略、跨节点通信)
命令行工具:kubectl(K8s 集群管理 CLI)
二、环境准备(所有节点执行)
1. 系统初始化(关闭干扰服务)
(1)关闭防火墙(CentOS)
# 关闭 firewalld
systemctl stop firewalld && systemctl disable firewalld
# 关闭 selinux(临时+永久)
setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
(2)关闭 swap 分区(K8s 要求)
# 临时关闭 swap
swapoff -a
# 永久关闭(注释 swap 分区行)
sed -i '/swap/s/^/#/' /etc/fstab
# 验证(Swap 行均为 0 则成功)
free -h
(3)配置内核参数(开启 IP 转发、模块加载)
创建内核配置文件:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
EOF
加载内核模块并生效:
# 加载 br_netfilter 模块
modprobe br_netfilter
# 生效内核参数
sysctl -p /etc/sysctl.d/k8s.conf
# 验证(确保返回 1)
sysctl net.bridge.bridge-nf-call-iptables
(4)配置时间同步(避免节点时间不一致)
# CentOS 安装 chrony
yum install -y chrony && systemctl start chronyd && systemctl enable chronyd
# 验证时间同步状态
chronyc sources
2. 安装容器运行时(containerd)
K8s 1.24+ 不再依赖 Docker,直接使用 containerd 作为容器运行时,步骤如下:
(1)安装 containerd(CentOS)
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 源(containerd 包含在 Docker 源中)
cat > /etc/yum.repos.d/docker-ce.repo << 'EOF'
[docker-ce-stable]
name=Docker CE Stable
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
enabled=1
gpgcheck=0
EOF
yum install -y containerd.io-1.6.9-3.1.el8
(2)配置 containerd(关键:适配 K8s 要求)
生成默认配置文件:
containerd config default > /etc/containerd/config.toml
编辑配置文件:
vi /etc/containerd/config.toml
配置 CRI 端点(确保 enabled 为 true)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 启用 systemd cgroup 驱动(K8s 推荐)
重启 containerd 并设置开机自启:
systemctl restart containerd && systemctl enable containerd
# 验证 containerd 状态(active (running) 则成功)
systemctl status containerd
3. 安装 K8s 组件(kubeadm、kubelet、kubectl)
所有节点均需安装,步骤如下:
(1)添加 K8s 官方源
cat > /etc/yum.repos.d/kubernetes.repo << 'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
或者
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
清理缓存:
yum clean all
yum makecache
查询可用版本:
yum list kubelet --showduplicates | sort -r
三、集群创建(控制平面节点执行)
1. 初始化控制平面(master 节点)
核心命令:kubeadm init,需指定 Pod 网段、Service 网段、镜像仓库(国内适配)。
(1)执行初始化命令
kubeadm init --kubernetes-version=1.30.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --image-repository=registry.aliyuncs.com/google_containers --control-plane-endpoint=192.168.131.132
(2)等待初始化完成(约 5-10 分钟,取决于网络速度)
初始化成功后,会输出以下关键信息(务必保存,用于工作节点加入集群):
kubeadm join 192.168.131.132:6443 --token q1j7ye.f1p2w7ekguq16u8s --discovery-token-ca-cert-hash sha256:62ef190f32f93cb774a8ea37f31caeaaddb33f996c1614290fbe563a0a0873eb --control-plane --certificate-key b494960c6b5a853a2f1051d0b88c8ce3c69dd5c8b468958633998a7028b5462b
(3)配置 kubectl 权限(master 节点执行,让普通用户可操作集群)
# 普通用户(如 root)配置
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 验证 kubectl 可用性(输出控制平面节点信息,STATUS 为 Ready 则成功)
kubectl get nodes
2.安装网络插件(Calico,master 节点执行)
2. 安装网络插件(Calico,master 节点执行)
K8s集群初始化后,节点状态为NotReady,需安装CNI网络插件实现跨节点通信。推荐 Calico(生产级,支持网络策略)。
(1)下载 Calico 配置文件(国内加速)
wget https://projectcalico.docs.tigera.io/v3.25/manifests/calico.yaml
(2)修改配置文件(适配 Pod 网段)
编辑calico.yaml,确保CALICO_IPV4POOL_CIDR与kubeadm init时指定的 --pod-network-cidr 一致:
查找并修改以下内容:
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16" # 与初始化时的 Pod 网段一致
在calico-node下面的env里面添加修改下面配置
- name: IP_AUTODETECTION_METHOD
value: "interface=enp*"
(3)部署 Calico
kubectl apply -f calico.yaml
(4)验证 Calico 部署(等待 3-5 分钟)
# 查看 Calico Pod 状态(所有 Pod 均为 Running 则成功)
kubectl get pods -n kube-system -l k8s-app=calico-node
# 查看节点状态(所有节点 STATUS 为 Ready 则网络正常)
kubectl get nodes