https://juejin.cn/post/7369865018764984354 https://developer.aliyun.com/article/1463360
环境准备(所有节点执行) 🔗
网络配置 🔗
master=192.168.122.10,node=192.168.122.11,192.168.122.12
#进入网络配置文件目录
vi /etc/NetworkManager/system-connections/enp1s0.nmconnection
将[ipv4]的method=auto改为method=manual,即改为配置静态ip
[ipv4]
method=manual
address1=192.168.122.10
#address2=192.168.122.10
gateway=192.168.122.1
route1=192.168.100.1
dns=114.114.114.114;8.8.8.8
#重启网络
systemctl restart NetworkManager
替换源 🔗
# 1. 配置
# 注意:“# baseurl” 中间有个空格(AlmaLinux 专有)
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^# baseurl=https://repo.almalinux.org|baseurl=https://mirrors.aliyun.com|g' \
-i.bak \
/etc/yum.repos.d/almalinux*.repo
# 恢复 (sysin)
sed -e 's|^#mirrorlist=|mirrorlist=|g' \
-e 's|^baseurl=https://mirrors.aliyun.com|# baseurl=https://repo.almalinux.org|g' \
-i.bak \
/etc/yum.repos.d/almalinux*.repo
# 2. 清理缓存并重建
dnf clean all
dnf makecache
关闭防火墙和 SELinux 🔗
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
配置时间同步 🔗
# 安装 chrony
dnf install -y chrony
# 启动并设置开机自启
systemctl enable --now chronyd
# 查看时间同步状态
chronyc sources
设置主机名 🔗
k8s-master,k8s-node1,k8s-node2
hostnamectl set-hostname k8s-master
配置主机名和 /etc/hosts 🔗
在所有三个节点上,执行以下命令,添加 hosts 解析
cat >> /etc/hosts <<EOF
192.168.122.10 k8s-master
192.168.122.11 k8s-node1
192.168.122.12 k8s-node2
EOF
k8s关闭swap 🔗
Kubernetes 要求禁用 Swap,以保证 kubelet 的性能和稳定性。
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
配置内核参数 🔗
加载必要的内核模块并配置网络参数,让 iptables 能够正确地处理桥接流量。
# 安装额外的内核模块包
dnf install -y kernel-modules-extra
# 添加 br_netfilter modules
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
# 添加 iptables 配置
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 应用配置
sysctl --system
#重启机器
reboot
# 查看网桥过滤模块是否加载成功
lsmod | grep -e br_netfilter -e overlay
安装 containerd 🔗
# 安装 dnf-plugins-core
dnf install -y dnf-plugins-core
# 添加 Docker CE 仓库 (阿里云源)
dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd
dnf install -y containerd.io
# 创建默认配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
# 修改配置文件
# 1. 使用 systemd cgroup 驱动
# 2. 配置阿里云镜像仓库加速器
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
#在配置文件的最后添加以下内容
vi /etc/containerd/config.toml
查找pause镜像 ,将[registry.k8s.io]替换为[registry.aliyuncs.com/google_containers],并修改版本3.9,因为kubeadm config images list 获取的版本是3.19
查找io.containerd.grpc.v1.cri,在里面添加以下内容,注意缩进2个空格
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.aliyuncs.com"]
# 启动并设置 containerd 开机自启
systemctl enable --now containerd
# 检查 containerd 状态
systemctl status containerd
Kubernetes镜像 🔗
#添加 Kubernetes 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=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
# 官网版本(如果要求新版本可以选这个)
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
# 清理旧的缓存
dnf clean all
# 重建缓存
dnf makecache
# 再次验证可用版本
dnf list --showduplicates kubeadm --disableexcludes=kubernetes
安装 Kubernetes 🔗
#排除kubernetes的升级安装
dnf install -y kubelet-1.28.2-0 kubeadm-1.28.2-0 kubectl-1.28.2-0 --disableexcludes=kubernetes
systemctl enable --now kubelet
#重启机器
reboot
—————–克隆节点——————————–
初始化 Master 节点 (仅在 k8s-master 执行) 🔗
使用 kubeadm 初始化 🔗
kubeadm reset -f
systemctl restart kubelet
# 查看版本
kubeadm config images list
# 可以先拉取集群所需要的images
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
如果提示缺少镜像,请执行类似如下命令
crictl pull registry.aliyuncs.com/google_containers/pause:3.9
# 初始化Kubeadm
kubeadm init \
--apiserver-advertise-address=192.168.122.10 \
--control-plane-endpoint=192.168.122.10 \
--kubernetes-version=v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers
# 初始化报错查看
journalctl -xeu kubelet -f
配置 kubectl 🔗
为了在Master节点上能方便地使用kubectl命令,执行以下操作:
# 针对 root 用户
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/bashrc
# 或者针对普通用户 (推荐)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
添加 Worker 节点 (在 k8s-node1 和 k8s-node2 执行) 🔗
分别在k8s-node1和k8s-node2上执行
添加master节点(多个master执行,单个不需要执行)
kubeadm join 192.168.122.10:6443 --token lk9wh5.cu3batvd0axv4622 \
--discovery-token-ca-cert-hash sha256:50d0019950338860872fd3ea1acd0bb92f1174c8520fdfda5d539de3036a2c4d \
--control-plane
添加node1节点
kubeadm join 192.168.122.10:6443 --token lk9wh5.cu3batvd0axv4622 \
--discovery-token-ca-cert-hash sha256:50d0019950338860872fd3ea1acd0bb92f1174c8520fdfda5d539de3036a2c4d
安装 Calico 网络插件 (仅在 k8s-master 执行) 🔗
# 下载文件(偶尔会下载不了,多试几次)
curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O
# 修改docker.io地址
sed -i 's#docker.io/#m.daocloud.io/docker.io/#g' calico.yaml
或者
sed -i 's#docker.io/#docker.1ms.run/#g' calico.yaml
# 修改IP_AUTODETECTION_METHOD,注意enp1s0 需要是你自己网卡的名称
sed -i '/value: "autodetect"/a\\ - name: IP_AUTODETECTION_METHOD\n value: "interface=enp1s0"' calico.yaml
# 应用配置
kubectl apply -f calico.yaml
# 验证
kubectl get pods -n kube-system | grep calico
# 报错处理完成后删除配置重新操作:
kubectl delete -f calico.yaml
token和hash丢失过期处理 🔗
kubeadm token list
#当前的token值,如果为空表示前集群中没有有效的token值
#重新申请token值
kubeadm token create
kubeadm token list
#根据实际情况来删除当前有效的token值
kubeadm token delete xpcpuh.mxbspj5lyyskofu1
-discovery-token-ca-cert-hash 值被保存到 Kubemetes 集群的根证书文件中,默认情况下,根证书位于 /etc/kubemetes/pki/ca.cr
下,可通过如下命令获取,但需要在得到的hash值前面拼接上 sha256:才算完整。
#使用0penSSL工具计算证书文件的SHA256哈希值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
集群验证 🔗
在 Master 节点验证 🔗
回到k8s-master节点,执行以下命令查看新加入的节点。
kubectl get nodes
稍等片刻(等待kubelet在node上拉取flannel镜像并启动CNI),你会看到所有节点的状态都变为 Ready。
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 2m40s v1.28.2
k8s-node1 NotReady <none> 15s v1.28.2
k8s-node2 NotReady <none> 7s v1.28.2
集群功能验证 🔗
#部署 Nginx
kubectl create deployment nginx --image=registry.cn-guangzhou.aliyuncs.com/xuchen/proxy:nginx-1.27.1
#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
#检查状态
# 查看 Pod
kubectl get pods -o wide
# 查看 Service
kubectl get svc nginx
kubectl get svc nginx 的输出会显示一个 NodePort 类型的服务,例如 80:31234/TCP。这意味着你可以通过任意一个节点的IP + 31234端口来访问Nginx。
访问测试 🔗
在Master节点或任何能访问集群网络的地方,使用curl测试。
# 访问 Master 节点
curl http://192.168.122.10:30963
# 访问 Node1 节点
curl http://192.168.122.11:30963
# 访问 Node2 节点
curl http://192.168.122.12:31234