您现在的位置是:首页 >技术杂谈 >Containerd+Kubernetes搭建k8s集群网站首页技术杂谈

Containerd+Kubernetes搭建k8s集群

XiaoHH Superme 2024-06-22 00:01:02
简介Containerd+Kubernetes搭建k8s集群

文档说明

之前写了一篇基于docker安装kubernetes的文章,这篇文档我们来使用containerd来安装kubernetes,相较于docker,containerd运行容器的时候效率更高,并且可以兼容docker镜像。基于docker安装kubernetes的文章地址:https://blog.csdn.net/m0_51510236/article/details/123477488

安装kubernetes之前,你需要准备如下配置的虚拟机或实体机进行安装(最少三台):

  • CPU:2核
  • 内存:2GB
  • 硬盘:50GB

上面的是最低配置,你可以根据自己的硬件条件提高配置。

安装软件的版本和下载地址

对应软件版本和下载地址如下表:

软件名称(软件说明)版本下载地址
CentOS(操作系统)7-2207-02阿里源/清华源
kubernetes(容器编排工具)1.26.5文档内提供
containerd(容器服务)1.6.21点击下载
libseccomp(计算插件)2.5.4点击下载
runc(容器运行时)1.1.7点击下载
Calico(网络插件)3.25文档内提供
Metallb(负载均衡插件)v0.13.9文档内提供

部分软件是在国外服务器下载,如果下载过慢可以私信我获取

环境说明

服务器准备

服务器列表:

服务器名称IP地址配置服务器用途
k8s-master192.168.79.502c2g50gkubernetes的主节点
k8s-node01192.168.79.522c2g50gkubernetes的工作节点1
k8s-node02192.168.79.542c2g50gkubernetes的工作节点2

三台服务器均已准备好:
在这里插入图片描述

你还需要保证这些服务器之间能够互相ping同

负载均衡IP地址准备

metallb的loadbalancer需要一些预留的IP地址以用于负载均衡的IP地址分配,本篇文章预留的IP地址为192.168.79.60~192.168.79.69

安装步骤

环境设置

接下来我们需要在三台服务器上同时进行一些操作,所以你可以在Xshell上依次点击工具栏上的 工具(T) -> 发送键输入到(K) -> 已链接的会话(C) 来保证输入一条命令可以在三个终端执行,不同ssh工具设置方式不同,请自行查询。

步骤有点多,记得别漏了哦

关闭防火墙

使用以下命令关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

同时发送给三个终端,查看执行结果可以看到防火墙已经全部关闭了:
在这里插入图片描述

关闭SELinux

使用以下命令关闭SELinux:

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭swap分区

使用以下命令关闭swap分区:

# 永久关闭
swapLine=$(cat /etc/fstab | grep swap | awk '{print $1}')
sed -i "s/$swapLine/#$swapLine/" /etc/fstab
# 临时关闭
swapoff -a

成功之后使用 free -h 命令可以查看到swap分区的大小变为0了
在这里插入图片描述

设置主机名称解析

使用以下命令设置主机名称解析,但是需要注意要改为对应你们自己的IP地址哦:

cat >> /etc/hosts << EOF
192.168.79.50 k8s-master
192.168.79.52 k8s-node01
192.168.79.54 k8s-node02
EOF

设置主机名称

这个设置需要每个主机单个设置,所以可以点击终端右上角的 OFF 按钮临时关闭输出命令到所有的会话:
在这里插入图片描述

每台服务器执行的命令

  • 192.168.79.50: hostnamectl set-hostname k8s-master
  • 192.168.79.52: hostnamectl set-hostname k8s-node01
  • 192.168.79.54: hostnamectl set-hostname k8s-node02

设置完后记得点击每个终端右上角的 ON 按钮开启同时输出命令到所有终端哦:
在这里插入图片描述

加载 br_netfilter 模块

由于开启内核 ipv4 转发需要加载 br_netfilter 模块,所以加载下该模块,但是这个模块不会默认加载,所以我们开启后还要设置开机自动加载这个模块

# 设置开机自动加载这个模块
cat >> /etc/rc.d/rc.local << EOF
/usr/sbin/modprobe br_netfilter
EOF
chmod +x /etc/rc.d/rc.local
# 立刻加载
modprobe br_netfilter

桥接的IPv4流量传递到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
EOF
sysctl --system

升级操作系统内核

因为本次安装的版本为 1.26.5 ,为第二新的版本,可能由于内核版本较低导致安装失败,所以我们执行这个步骤将内核升级到最新的稳定版本

导入elrepo gpg key

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装elrepo YUM源仓库

yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

安装kernel-lt版本

m1为长期稳定版本,lt为长期维护版本

yum --enablerepo="elrepo-kernel" -y install kernel-lt.x86_64

设置grub2默认引导为0

grub2-set-default 0

重新生成grub2引导文件

grub2-mkconfig -o /boot/grub2/grub.cfg

重启

当上面命令全部执行完成后使用 reboot 命令重启电脑,以使升级的内核生效
在这里插入图片描述

重启之后使用 uname -r 查看系统内核版本,升级时间不同可能导致稳定的内核版本不一样:
在这里插入图片描述

安装ipset及ipvsadm

请求多的时候可能会导致响应过慢,安装这两个软件能够在一定程度上提升ipvs转发速度

yum install -y ipset ipvsadm

配置ipvsadm模块加载方式

添加需要加载的模块

cat > /etc/sysconfig/modules/ipvs.modules << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

查看结果:
在这里插入图片描述

环境设置部分已经全部完成,现在可以开始正式按钻过软件了

安装containerd

下载containerd

可以使用以下命令下载containerd:

wget https://github.com/containerd/containerd/releases/download/v1.6.21/cri-containerd-cni-1.6.21-linux-amd64.tar.gz -O /usr/local/src/cri-containerd-cni-1.6.21-linux-amd64.tar.gz

因为是在github上下载较慢,为了节省时间我就提前下载好并上传到服务器上了:
在这里插入图片描述

解压containerd

需要将containerd解压到根目录,使用命令:

tar -zxvf cri-containerd-cni-1.6.21-linux-amd64.tar.gz -C /

可以查看containerd版本号:

containerd -version

执行结果:
在这里插入图片描述

生成containerd的配置文件

使用以下命令生成containerd的默认配置文件:

mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

配置文件(/etc/containerd/config.toml)需要将 sandbox_image 的版本号改一下版本号和镜像地址,因为默认的镜像地址是在谷歌上的,谷歌国内访问不到

默认值:sandbox_image = “registry.k8s.io/pause:3.6”

目标值:sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.9”

修改结果:
在这里插入图片描述

启动containerd并设置开机自启动

systemctl enable --now containerd

安装runc

containerd自带有runc,但是自带的有些问题,所以我们还需要特意安装一遍稳定版的runc:
在这里插入图片描述

下载libseccomp

因为runc依赖于libseccomp计算库,所以我们使用以下命令下载libseccomp的源码压缩包:

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/libseccomp-2.5.4.tar.gz

下载完成:
在这里插入图片描述

安装libseccomp

首先我们先将libseccomp的源码包解压:

tar -zxvf libseccomp-2.5.4.tar.gz

然后我们需要安装c语言的编译工具和libseccomp的gperf依赖

yum install -y gcc gcc-c++ gperf

执行安装

cd libseccomp-2.5.4
./configure
make && make install

查看是否安装成功:

find / -name libseccomp.so

查询结果:
在这里插入图片描述

下载runc

使用以下命令下载:

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64

同理因为github下载较慢,我提前下载了然后上传到服务器上:
在这里插入图片描述

安装runc

# 删除containerd自带的runc
rm -rf /usr/local/sbin/runc
# 为我们自己的runc赋予执行权限
chmod +x runc.amd64
# 将runc复制到安装目录
mv runc.amd64 /usr/local/sbin/runc

再次执行runc发现没有报错了:
在这里插入图片描述

安装kubernetes

配置kubernetes的yum源

需要配置阿里云的yum源,因为官方文档默认的yum源是在谷歌那,国内访问不到,可以执行以下命令配置yum源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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

配置了yum源之后可以直接使用yum命令安装kubernetes

yum install -y kubeadm-1.26.5 kubectl-1.26.5 kubelet-1.26.5

配置cgroup驱动改为systemd

我们需要将kubernetes的cgroup改为systemd,需要将 /etc/sysconfig/kubelet 的内容改为 KUBELET_EXTRA_ARGS="--cgroup-driver=systemd",使用以下命令:

sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"/g' /etc/sysconfig/kubelet

修改之后:
在这里插入图片描述

搭建kubernetes集群

上面我们已经完成了kubernetes的安装,接下来我们要开始搭建集群了

初始化集群

这一步只需要在master上执行就好了,所以点击master上面的 OFF 按钮关闭发送命令至所有终端:
在这里插入图片描述

我们可以使用以下命令初始化(注意修改master的IP地址):

kubeadm init 
--apiserver-advertise-address=192.168.79.50 
--image-repository=registry.aliyuncs.com/google_containers 
--kubernetes-version=v1.26.5 
--service-cidr=10.96.0.0/12 
--pod-network-cidr=10.244.0.0/16 
--cri-socket=unix:///var/run/containerd/containerd.sock

配置的内容解析

  • --apiserver-advertise-address=192.168.79.50:k8s-master的地址,注意修改为自己的master地址
  • --image-repository=registry.aliyuncs.com/google_containers:默认的镜像拉取地址在谷歌,所以这里改为阿里云的镜像地址
  • --kubernetes-version=v1.26.5:kubernetes的版本号
  • --service-cidr=10.96.0.0/12:service的网段
  • --pod-network-cidr=10.244.0.0/16:pod的网段地址,注意之后安装Calico网络插件的时候还会用到这个地址
  • --cri-socket=unix:///var/run/containerd/containerd.sock:设置cri的socket使用containerd的sock

看到这个代表初始化成功:
在这里插入图片描述

按照提示本地执行代码:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

远程执行的代码需要改一下,需要加上 --cri-socket=unix:///var/run/containerd/containerd.sock ,所以执行:

kubeadm join 192.168.79.50:6443 --token 9i3lvb.2m4aoo1672t4edra 
	--discovery-token-ca-cert-hash sha256:a41c37db5378cd1fad77a2537a3dd64117465c4a33c9de7825abc3daa847b8d0 
	--cri-socket=unix:///var/run/containerd/containerd.sock

可以查看加入集群的结果:
在这里插入图片描述

使用 kubectl get nodes -o wide 命令查看加入到的集群:
在这里插入图片描述

设置kubelet开机自启动

需要设置kubelet开机自启动,这样开机才会自动运行kubernetes

systemctl enable --now kubelet

安装 Calico 网络插件

Calico对应版本的官网地址:https://docs.tigera.io/calico/3.25/getting-started/kubernetes/quickstart

可以使用官网的这行命令在master当中执行安装Calico:
在这里插入图片描述

命令:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml

查看执行结果:
在这里插入图片描述

需要过一段时间才能安装成功,因为要拉取插件,可使用命令查看安装结果:

kubectl get all -n tigera-operator

看到这个则代表安装成:
在这里插入图片描述

还需要自定义资源安装,不能直接执行这个文件,需要将这个文件下载下来然后改一点东西:
在这里插入图片描述

使用命令下载:

wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml
cat custom-resources.yaml

查看内容,我们需要将pod网段改为我们初始化集群时候设置的 10.244.0.0/16
在这里插入图片描述

使用命令即可修改:

sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/g' custom-resources.yaml
cat custom-resources.yaml

查看修改后的结果:
在这里插入图片描述

现在可以直接执行它:

kubectl create -f custom-resources.yaml

查看执行结果:
在这里插入图片描述

时间比较长,所以监控创建结果:

watch kubectl get all -o wide -n calico-system

当STATUS全部变为Running的时候就代表安装成功了:
在这里插入图片描述

接下来可以开始下一步了

安装MetalLB负载均衡器

metallb是用于kubernetes的Service暴露LoadBalancer的负载均衡器,官网地址:https://metallb.universe.tf/installation/

修改 kube-proxy 的配置文件

按照官网的意思修改:
在这里插入图片描述

执行命令:

kubectl edit configmap -n kube-system kube-proxy

仅需要修改我标出来的地方即可:
在这里插入图片描述

安装MetalLB

执行以下命令即可安装:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml

查看执行结果(提前下载了文件):
在这里插入图片描述

使用命令查看部署结果:

kubectl get all -n metallb-system

同样的所有的STATUS都为Running状态则为安装成功:
在这里插入图片描述

为MetalLB分配IP地址

我们可能会创建多个对外暴露的Service,所以需要分配多个没有用到的IP地址给MetalLB,新增一个 metallb-ip-pool.yaml 文件,文件内容为:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  # 注意改为你自己为MetalLB分配的IP地址
  - 192.168.79.60-192.168.79.69

---

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

查看文件内容:
在这里插入图片描述

执行这个文件:

kubectl apply -f metallb-ip-pool.yaml

查看执行结果:
在这里插入图片描述

接下来我们就可以部署应用了

部署应用

部署nginx

我会部署一个nginx程序并通过metallb的地址池暴露访问地址给外网访问,使用命令部署一个nginx:

kubectl create deployment nginx --image=nginx

这个命令会在dockerhub当中拉取一个最新版的nginx并运行,可以查看运行结果:
在这里插入图片描述

同样使用命令查看部署情况

kubectl get deploy,pod -o wide

STATUS为Running:
在这里插入图片描述

暴露给外网访问

应用部署成功,现在需要创建一个LoadBalancer给外网访问了,使用命令将nginx暴露到外网,service类型为LoadBalancer:

kubectl expose deployment nginx --port=80 --type=LoadBalancer

显示暴露成功:
在这里插入图片描述

使用命令查看Service的外网IP地址:
在这里插入图片描述

接下来可以访问 192.168.79.60 这个IP地址了,可以看到nginx响应成功:
在这里插入图片描述

好了下课(点个关注呗)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。