环境初始化
更换防火墙规则
# 关闭firewalld
systemctl stop firewalld
systemctl disable firewalld
# 开启iptables
yum -y install iptables-services
systemctl enable --now iptables
# 删除所有规则持久化保存
iptables -F
service iptables save
禁用SELinux
添加集群节点映射
cat >> /etc/hosts <<EOF
# Kubernetes Cluster Nodes
10.10.156.239 k8s01
10.10.156.240 k8s02
10.10.156.241 k8s03
EOF
安装ipvs
yum install -y ipvsadm
开启路由转发
# 配置路由转发
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# 应用/etc/sysctl.conf中配置
sysctl -p
安装网桥管理工具
# 安装epel仓库
yum install -y epel-release
# 提供官方源中没有的软件包,/etc/yum.repo.d目录下有新的repo文件
# 麒麟系统默认源有网桥就不需要安装这个仓库
# 从epel源中安装网桥管理工具
yum install -y bridge-utils
# 为虚拟化做准备
# 提供brctl命令,用于管理 Linux 网桥。kubeadm/kubelet 初始化时创建网络插件(比如 Calico)可能需要用到网桥,但通常不是必须的。
加载模块
# 加载模块
# 让所有经过网桥(bridge)的流量经过iptables的规则处理
modprobe br_netfilter
# 提供 OverlayFS 联合文件系统支持
modprobe overlay
# 查看模块是否已加载
lsmod | grep br_netfilter overlay
# 将模块添加到开机自启
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
添加内核参数
# 开启路由转发
# ipv4下所有流量需要被防火墙回调
# ipv6下所有流量需要被防火墙回调
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 应用/etc/sysctl.d/k8s.conf中配置
sysctl -system
# 此命令会先加载/etc/sysctl.conf/*.conf文件,最后加载/etc/sysctl.conf优先级最高主配置文件用来覆盖重名内核参数
# sysctl -p只会加载/etc/sysctl.conf主配置文件
安装Containerd
添加docker-ce源
# 安装三个依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 从阿里镜像网站下载docker-ce.repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 将里面地址换为阿里镜像
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
安装containerd
# 麒麟V10默认可能预装Podman,需要先卸载
yum remove -y podman
# 安装containerd.io
yum -y install containerd.io-1.6.33
# 或者containerd
# 验证runc是否作为依赖被安装
runc --version
配置containerd
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 注意文件中是否有下面内容
version = 3
imports = ['/etc/containerd/conf.d/*.toml']
# 如果有,就可以在该目录下独立编辑配置文件,**合并加载**,不必在主配置文件中修改
# 遇到相同键,import引入的值会覆盖主配置文件的值
# 独立编辑配置文件,将要修改项放入
vi /etc/containerd/conf.d/k8s.toml
# 记得加入主配置文件中提到的version
version = 3
# SystemdCgroup 的路径
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runc.options]
SystemdCgroup = true
# sandbox_image 的路径
[plugins."io.containerd.cri.v1.images".pinned_images]
sandbox = "registry.aliyuncs.com/google_containers/pause:3.9"
# mirrors 的路径
[plugins."io.containerd.cri.v1.images".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io"]
[plugins."io.containerd.cri.v1.images".registry.mirrors."registry.k8s.io"]
endpoint = ["https://registry.aliyuncs.com/google_containers"]
—————————此内容为在主配置文件中修改(且对应containerd版本为1.x版本)—————————————————————
# 1. 修改SystemdCgroup(重要!)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 将false改为true
# 2. 修改pause镜像为国内源
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
# 如果本地有,填错了也无所谓,优先本地
# 3. 配置镜像加速器
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
# 这里配置不同registry的镜像加速器
# 1. docker.io 的加速器(最重要!)
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io"]
# docker.io的国内镜像加速器
# 2. registry.k8s.io 的加速器(K8s镜像)
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://registry.aliyuncs.com/google_containers"]
# registry.k8s.io的国内镜像仓库
# 后续kubeadm初始化的时候 image-registry的值也得填这个,优先级比这个高
# 可在启动后验证合并配置是否生效
containerd config dump | grep -A 5 "SystemdCgroup|sandbox_image|mirrors"
启动containerd
systemctl enable --now containerd
systemctl status containerd
添加k8s的yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
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
安装crictl-tools
# 安装cri-tools也就是ctictl,官方提供的CRI调试工具
yum install -y cri-tools
# 验证
crictl --version
crictl info
# 看到
"RuntimeReady": true // ✅ CRI插件已正常工作
"NetworkReady": false // ⚠️ CNI未配置(但kubeadm会自动处理)
开始部署
安装k8s组件
————————————————————————----——在三个节点都执行————————————————————————————————————
# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes
# 基础仓库(如 BaseOS)可能会设置exclude或includepkg规则,把 `kubeadm`, `kubelet` 等划为“非系统原生包”,在安装时直接被排除。所以需要--disableexcludes防范干扰
# 通常不会这么做
# 启用并设置开机自启kubelet服务
systemctl enable --now kubelet
# 验证安装
kubeadm version
kubelet --version
kubectl version --client
初始化集群
---------------------------只在k8s01上执行------------------------------------
# 初始化集群(使用阿里云镜像源)
kubeadm init \
--apiserver-advertise-address=10.10.156.239 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
# 如果节点上装有多个容器运行时(如 containerd 和 Docker),可此参数指定一个特定的CRI套接字
# 得到join命令,用于另外两个节点加入集群
kubeadm join 10.10.156.239:6443 --token 8ot8a5.p60omx6ptm7gejak \
--discovery-token-ca-cert-hash sha256:964c898f6f40f0020a2db47372508a928a4a1ffa4ad56a3694b85bcfdc19495d
# 验证kubelet状态
systemctl status kubelet
# 在kubeadm init前,会出现“故障”,并非报错,而是先挂起等待配置文件
# kubeadm init会自动生成配置文件
# 配置文件生成后,会主动重启kubelet
# 如果不提前开启kubelet,初始化时会不识别该服务导致失败
# 配置kubectl(在哪个节点配置,哪个节点能使用)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 查看集群状态
kubectl get nodes
Q
为什么2,3工作节点无法get nodes?
A
因为没有.kube/config文件,所以这是正常的,不推荐工作节点使用kubectl
在Node节点执行 kubeadm join
--------------------------在 k8s02 和 k8s03 上执行-------------------------------
# 执行 join 命令(使用上面复制的命令)
kubeadm join 10.10.156.239:6443 --token 8ot8a5.p60omx6ptm7gejak \
--discovery-token-ca-cert-hash sha256:964c898f6f40f0020a2db47372508a928a4a1ffa4ad56a3694b85bcfdc19495d
# 验证kubelet状态
systemctl status kubelet
# 应该在加入集群后kubelet状态才正常,因为加入过程中才会创建配置文件
Q
为什么三个节点状态都是notready?
A
因为必须处于扁平化网络,所以部署CNI插件之前,这是正常的
部署CNI插件
Q
coredns为pending状态,etcd,scheduler只有一个,是不是因为没有部署CNI插件?那为什么kubeproxy有三个?
A
导入镜像包
-----------------------------三个节点都导入----------------------------------------
# 导入镜像
for img in calico-images/*.tar; do
echo ">>> 正在导入: $img"
ctr -n k8s.io images import "$img"
done
# 查看 k8s.io 命名空间下的 calico 相关镜像
ctr -n k8s.io images ls | grep calico
应用calico yaml文件
# 修改
CALICO_IPV4POOL_CIDR 指定为 pod 地址
# 修改为 BGP 模式
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always" #改成Off
k apply -f calico-typha.yaml