基于Kubeadm和Containerd部署Kubernetes高可用集群

Magedu@M67!

由于环境不够只能部署单节点的K8S

IP 主机名 角色
10.0.0.145 master1.wang.org K8s 集群主节点 1,Master和etcd
10.0.0.146 node1.wang.org K8s 集群工作节点 1
10.0.0.145 kubeapi.wang.org K8s 主节点访问入口 1,提供高可用及负载均衡

环境准备

1.1 初始化环境准备

操作系统及 Kubernetes 组件版本

以下案例中部署集群使用的操作系统、容器引擎、Kubernetes 版本信息:

  • OS: Ubuntu Ubuntu 24.04 LTS

  • CRI: Docker 28.2.2 Cgroup Driver: systemd

  • Kubernetes: 1.35.0

主机名并实现主机名解析

在每个主机设置不同的主机名,IP 和主机名解析:

cat >> /etc/hosts <<EOF
10.0.0.145 kubeapi kubeapi.wang.org 
10.0.0.145 master1 master1.wang.org
10.0.0.146 node1 node1.wang.org
EOF

在 VMware 的宿主机Windows 上添加 hosts 解析:

#c:\windows\system32\drivers\etc\hosts
10.0.0.145 kubeapi kubeapi.wang.org 
10.0.0.145 master1 master1.wang.org
10.0.0.146 node1 node1.wang.org
主机时间同步

在集群的 Master 和各 node 同步时间,如果使用提供的虚拟机,此步不用做

[root@master1 ~]#timedatectl set-timezone Asia/Shanghai
[root@master1 ~]#apt update
[root@master1 ~]#apt install chrony -y
[root@master1 ~]#vim /etc/chrony/chrony.conf
#加下面一行
pool ntp.aliyun.com       iburst maxsources 2
[root@master1 ~]#systemctl enable chrony
[root@master1 ~]#systemctl restart chrony
[root@master1 ~]#chronyc   sources
禁用 SELinux

RHEL/CentOS/Rocky 系列关闭 SELinux:

~# setenforce 0
~# sed -i 's#^\(SELINUX=\).*#\1disabled#' /etc/sysconfig/selinux
关闭防火墙

集群的 Master 和各 node 执行

RHEL/CentOS/Rocky系统

~# systemctl disable --now firewalld

Ubuntu系统:

#如果安装ufw
~# ufw disable
#确认关闭
~# ufw status 
#如果安装firewalld
~# systemctl disable --now firewalld
禁用Swap设备

在集群的 Master 和各 node 执行

~# swapoff -a
~# sed -i '/swap/s/^/#/' /etc/fstab
内核优化

集群的 Master 和各 node 执行

#开机加载内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
#立即加载内核模块
modprobe overlay
modprobe br_netfilter
#验证模块已加载
lsmod |grep -E  'overlay|br_netfilter'
br_netfilter           32768  0
bridge                421888  1 br_netfilter
overlay               212992  0
#设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
#应用 sysctl 参数生效而不重新启动
sysctl --system

2 所有主机安装Containerd

包安装 Containerd

在所有节点上安装 Containerd

#Ubuntu24.04可以利用内置仓库安装containerd
[root@master1 ~]#apt update && apt -y install containerd
#确认服务启动
[root@master1 ~]#systemctl status containerd
#ubuntu24.04
[root@master1 ~]#containerd -v
containerd github.com/containerd/containerd 1.7.28 
[root@master1 ~]#runc -v
runc version 1.3.3-0ubuntu1~24.04.3
spec: 1.2.1
go: go1.23.1
libseccomp: 2.5.5
[root@master1 ~]#ctr -v
ctr github.com/containerd/containerd 1.7.28
[root@master1 ~]#ctr version 
Client:
 Version:  1.7.28
 Revision: 
 Go version: go1.23.1
Server:
 Version:  1.7.28
 Revision: 
 UUID: ee04ae03-b1b3-40db-9f8e-09c968e2ed69
 
 
 
#修改containerd配置基于toml(Tom's Obvious Minimal Language)格式:toml.io
[root@node1 ~]#mkdir /etc/containerd/
[root@node1 ~]#containerd config default > /etc/containerd/config.toml
#1)将 sandbox_image 镜像源设置为阿里云google_containers镜像源(国内网络需要)
[root@node1 ~]#grep sandbox_image /etc/containerd/config.toml
#版本k8s-v1.34.2/1.35.0
[root@node1 ~]#sed -i 
"s#registry.k8s.io/pause:3.8#registry.aliyuncs.com/google_containers/pause:3.10.
1#g" /etc/containerd/config.toml
#2)配置containerd cgroup 驱动程序systemd,ubuntu22.04/24.04较新内核必须修
改,ubuntu20.04更旧的内核版本可不做修改
[root@node1 ~]#sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' 
/etc/containerd/config.toml
[root@node1 ~]#grep SystemdCgroup /etc/containerd/config.toml
           SystemdCgroup = true
            
#3)镜像加速
[root@node1 ~]#vim /etc/containerd/config.toml
#在此行下面加行
     [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      ############################添加下面#号之间的行,实现镜像加速
###############################     
      #新版,国内无法访问docker官方镜像,需要配置代理,#第170行
     [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] 
         endpoint =
["https://docker.m.daocloud.io","https://docker.1panel.live", 
"https://docker.1ms.run","https://docker.xuanyuan.me"]
       [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.wang.org"]
 endpoint = ["https://harbor.wang.org"]
       
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.wang.org".tls]
         insecure_skip_verify = true
       
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.wang.org".auth]
         username = "admin"
         password = "123456"
     
######################################################################################                 
[root@node1 ~]#systemctl restart containerd
#同步到所有节点(本次实验只部署了一主一从,同步节点省略)
[root@node1 ~]#for i in {102..106};do scp -r /etc/containerd/ 
10.0.0.$i:/etc/;done

image-20260506112845693

3 所有主机安装kubeadm、kubelet和kubectl

通过国内镜像站点阿里云和清华源安装的参考链接:

https://developer.aliyun.com/mirror/kubernetes
https://mirrors.tuna.tsinghua.edu.cn/help/kubernetes/

范例: Ubuntu 安装基于阿里云源安装

apt-get update && apt-get install -y apt-transport-https
#指定版本
K8S_VERSION=1.35
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v${K8S_VERSION}/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v${K8S_VERSION}/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
#查看版本
apt-cache madison kubeadm|head
#方法1:安装指定版本
K8S_RELEASE_VERSION=1.35.0
apt install -y kubeadm=${K8S_RELEASE_VERSION}-1.1 kubelet=${K8S_RELEASE_VERSION}-1.1 kubectl=${K8S_RELEASE_VERSION}-1.1
#方法2:安装最新版本
apt-get install -y kubelet kubeadm kubectl
#锁定包防止升级,可选
apt-mark hold   kubelet   kubeadm   kubectl   containerd 
#需要升级时,可以解锁
apt-mark unhold kubelet kubeadm kubectl containerd

范例:实现kubeadm 命令自动补全

#方法1
[root@master1 ~]kubeadm completion bash > /etc/profile.d/kubeadm_completion.sh
#方法2
[root@master1 ~]echo "source <(kubeadm completion bash)" >> ~/.bashrc
#生效
1、exit(只针对root)
2、source /etc/profile
#验证
kubeadm  按住Tab

在第一个master节点初始化Kubernetes集群

范例: 初始化集群

[root@master1 ~]K8S_RELEASE_VERSION=1.35.0
[root@master1 ~]kubeadm init --kubernetes-version=v${K8S_RELEASE_VERSION} --control-plane-endpoint="kubeapi.wang.org" --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --image-repository=registry.aliyuncs.com/google_containers --upload-certs
..........
kubeadm join kubeapi.wang.org:6443 --token 7ujfpd.z3ih2djv586ser7v \
	--discovery-token-ca-cert-hash sha256:e0d8c5b87b13c4f637a79e91f22574f2369d8a1a591777e378e77358a6183a46 \
	--control-plane --certificate-key dc7103b17fcb8e5c6290a5b1e8bb92618aab577fb90503fcd83446b7b991ae2c

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join kubeapi.wang.org:6443 --token 7ujfpd.z3ih2djv586ser7v \
	--discovery-token-ca-cert-hash sha256:e0d8c5b87b13c4f637a79e91f22574f2369d8a1a591777e378e77358a6183a46 

image-20260506113100540

image-20260506113109831

如果想重新初始化,可以执行下面

#如果有工作节点,先在工作节点执行,再在control节点执行下面操作
kubeadm reset -f
rm -rf /etc/cni/net.d/  $HOME/.kube/config
reboot

4 在第一个master节点生成kubectl命令的授权文件

#可复制4.8的结果执行下面命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5 实现kubectl命令补全

kubectl 命令功能丰富,默认不支持命令补会,可以用下面方式实现

kubectl completion bash > /etc/profile.d/kubectl_completion.sh
. /etc/profile.d/kubectl_completion.sh
exit

6 在第一个master节点配置网络组件

Kubernetes系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。下面的命令用于在线部署flannel至Kubernetes系统之上:

#默认没有网络插件,所以显示如下状态
[root@master1 ~]#kubectl get nodes 
NAME               STATUS     ROLES           AGE   VERSION
master1.wang.org   NotReady   control-plane   17m   v1.35.0
[root@master1 ~]#kubectl apply -f https://raw.githubusercontent.com/flannelio/flannel/master/Documentation/kube-flannel.yml
#稍等一会儿,可以看到下面状态
[root@master1 ~]#kubectl get nodes 
NAME               STATUS   ROLES           AGE   VERSION
master1.wang.org   Ready   control-plane   23m   v1.35.0

7 将所有worker加入Kubernetes集群

在所有worker节点执行下面操作,加上集群

#复制上面第4.8步的执行结果,额外添加--cri-socket选项修改为下面执行
[root@node1 ~]#kubeadm join kubeapi.wang.org:6443 --token 
ihbe5g.6jxdfwym49epsirr \
 --discovery-token-ca-cert-hash
sha256:b7a7abccfc394fe431b8733e05d0934106c0e81abeb0a2bab4d1b7cfd82104c0 
[root@master1 ~]#kubectl get nodes
NAME               STATUS   ROLES           AGE   VERSION
master1.wang.org   Ready   control-plane   58m   v1.35.0
node1.wang.org     Ready   <none>         44m    v1.35.0

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐