Containerd+Kubernetes搭建k8s集群

news/2024/11/9 1:54:14/

Containerd+Kubernetes搭建k8s集群

  • 文档说明
  • 安装软件的版本和下载地址
  • 环境说明
    • 服务器准备
    • 负载均衡IP地址准备
  • 安装步骤
    • 环境设置
      • 关闭防火墙
      • 关闭SELinux
      • 关闭swap分区
      • 设置主机名称解析
      • 设置主机名称
      • 加载 br_netfilter 模块
      • 桥接的IPv4流量传递到iptables
      • 升级操作系统内核
        • 导入elrepo gpg key
        • 安装elrepo YUM源仓库
        • 安装kernel-lt版本
        • 设置grub2默认引导为0
        • 重新生成grub2引导文件
        • 重启
      • 安装ipset及ipvsadm
      • 配置ipvsadm模块加载方式
    • 安装containerd
      • 下载containerd
      • 解压containerd
      • 生成containerd的配置文件
      • 启动containerd并设置开机自启动
    • 安装runc
      • 下载libseccomp
      • 安装libseccomp
      • 下载runc
      • 安装runc
    • 安装kubernetes
      • 配置kubernetes的yum源
      • 安装kubernetes
      • 配置cgroup驱动改为systemd
  • 搭建kubernetes集群
    • 初始化集群
    • 设置kubelet开机自启动
  • 安装 Calico 网络插件
  • 安装MetalLB负载均衡器
    • 修改 kube-proxy 的配置文件
    • 安装MetalLB
    • 为MetalLB分配IP地址
  • 部署应用
    • 部署nginx
    • 暴露给外网访问

文档说明

之前写了一篇基于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-poolnamespace: metallb-system
spec:addresses:# 注意改为你自己为MetalLB分配的IP地址- 192.168.79.60-192.168.79.69---apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: examplenamespace: 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响应成功:
在这里插入图片描述

好了下课(点个关注呗)


http://www.ppmy.cn/news/77902.html

相关文章

【华为OD机试】导师请吃火锅【2023 B卷|200分】

题目描述 入职后&#xff0c;导师会请你吃饭&#xff0c;你选择了火锅。 火锅里会在不同时间下很多菜。 不同食材要煮不同的时间&#xff0c;才能变得刚好合适。 你希望吃到最多的刚好合适的菜&#xff0c;但你的手速不够快&#xff0c;用m代表手速&#xff0c; 每次下手捞菜后…

【Linux高级 I/O(3)】如何使用阻塞 I/O 与非阻塞 I/O?——poll()函数

poll()函数介绍 系统调用 poll()与 select()函数很相似&#xff0c;但函数接口有所不同。在 select()函数中&#xff0c;我们提供三个 fd_set 集合&#xff0c;在每个集合中添加我们关心的文件描述符&#xff1b;而在 poll()函数中&#xff0c;则需要构造一个 struct pollfd 类…

2023全球最佳医院榜单及简要介绍

作为医学类的访问学者、博士后及联合培养博士们&#xff0c;都希望到世界知名医院进行临床研修交流及科研学习。2023 年世界最佳医院排行榜的发布为申请者提供了目标平台&#xff0c;现知识人网小编整理刊出。 近期&#xff0c;《新闻周刊》和全球数据公司 Statista 推出了2023…

ES6中class继承

1.简介 说明&#xff1a;class可以通过extends关键字实现继承&#xff0c;让子类继承父亲的属性和方法 class Fun {constructor(x, y) {this.x xthis.y y}talk() {console.log("talk方法");}tell() {console.log("tell方法");}}class Fun1 extends Fun …

数据分析真的很火吗?真的有很多企业需要这样的岗位吗?求大佬指点。

“我是去年毕业的&#xff0c;因为疫情影响&#xff0c;整个就业环境都很不好&#xff0c;很多企业都裁员了。加上疫情三年基本都是玩过去&#xff0c;也没啥一技之长&#xff0c;就业就更难了。听说现在做数据分析的人很多&#xff0c;我身边的朋友都在转行做数据分析。 其实…

为什么要放弃 $ 语法糖提案

《最新&#xff0c;Vue 中的响应性语法糖已废弃》 本文标题中的 $ 语法糖指的就是上文中的响应式语法糖 (Reactivity Transform)&#xff0c;那为什么不写 Reactivity Transform 呢&#xff1f;因为这个名实在是太长了… 大家觉得被废弃是因为分不清是正常变量还是响应式变量…

C++ STL篇

C STL篇 1 STL1.1 STL的诞生1.2 STL基本概念1.3 STL六大部件1.4 容器概念1.5 算法概念1.6 迭代器概念 2 初识容器算法迭代器2.1 vector存放内置数据类型2.2 vector存放自定义数据类型2.3 Vector容器嵌套 3 string容器3.1 string构造函数3.2 string赋值操作3.3 string字符串拼接…

Linux网络基础-4

在之前的网络基础博客中&#xff0c;我们对网络进行了概要解释&#xff0c;了解了应用层和传输层的知名协议。接下来我们来对网络层的典型协议进行解析。 目录 1.网络层协议 2.IP协议 2.1协议格式 2.2地址管理 2.3特殊网络 2.3.1私网的组建 2.3.2特殊IP地址 2.4路由选…