您现在的位置是:首页 >技术杂谈 >Containerd+Kubernetes搭建k8s集群网站首页技术杂谈
Containerd+Kubernetes搭建k8s集群
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-master | 192.168.79.50 | 2c2g50g | kubernetes的主节点 |
k8s-node01 | 192.168.79.52 | 2c2g50g | kubernetes的工作节点1 |
k8s-node02 | 192.168.79.54 | 2c2g50g | kubernetes的工作节点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响应成功:
好了下课(点个关注呗)