Abner的博客

AlmaLinux-k8s安装

· 650 words · 4 minutes to read
Categories: 工具

Table of Contents


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