Containerd+Kubernetes搭建k8s集群


视频教程地址:https://space.bilibili.com/3461573834180825/channel/seriesdetail?sid=3316691

文档说明

之前写了一篇基于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 按钮关闭发送命令至所有终端:
在这里插入图片描述

如果你镜像拉取不下来,那么你可以看一下我接下来的这篇文章,直接下载离线镜像进行安装:https://blog.csdn.net/m0_51510236/article/details/131312289

我们可以使用以下命令初始化(注意修改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响应成功:
在这里插入图片描述

好了下课(点个关注呗)

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: Docker是一种流行的容器化技术,可以将应用程序及其依赖项打包为容器,并在不同的环境中运行。而Kubernetes(简称K8s)则是一种开源的容器编排平台,可以帮助我们管理和调度大规模的容器化应用程序。 在微服务架构中,通常会将应用程序拆分为多个较小的服务,每个服务都可以独立构建、测试和部署。而使用DockerKubernetes可以更加方便地管理这些微服务。 首先,我们可以使用Docker将每个微服务打包为一个独立的容器镜像,包括应用程序以及其依赖项和配置文件。这样,我们就可以在不同的环境中的快速部署和复制这些容器化的服务。 然后,通过使用Kubernetes,我们可以将这些容器化的微服务部署到集群中。Kubernetes提供了强大的容器编排功能,可以根据应用程序的需要自动调度和管理这些容器。它可以根据服务的负载情况自动进行扩缩容,并确保服务的高可用性和稳定性。 此外,Kubernetes还提供了服务发现、负载均衡、自动伸缩等高级功能,可以帮助我们更好地管理和监控微服务的运行状态。它还支持容器的滚动更新,可以实现无需停机的应用程序版本更新。 总之,使用DockerKubernetes进行微服务的容器化实践,可以极大地简化应用程序的部署和管理工作,提高开发和运维效率,同时也能够提供更好的可扩展性和可靠性。这也是为什么DockerKubernetes在现代云原生应用开发中如此受欢迎的原因。 ### 回答2: DockerKubernetes是当前非常热门的技术,它们能够有效地解决微服务容器化的问题,让开发者能够更加高效地管理和部署应用程序。 首先,Docker是一种轻量级的容器化技术,它将应用程序和其所有的依赖打包进一个称为Docker镜像的可执行文件中。这样,开发者可以将这个镜像部署到任何支持Docker的环境中,而不用担心与其他应用程序的依赖冲突。由于Docker的镜像是轻量级的,所以可以迅速地启动和停止应用程序,方便对应用程序进行测试和部署。 接着,Kubernetes是一个开源的容器编排平台,它能够自动化地在集群中部署、扩展和管理容器化的应用程序。Kubernetes通过对容器进行分组和调度,可以确保应用程序的高可用性和横向扩展性。在Kubernetes中,开发者可以定义和管理应用程序的部署、服务发现、负载均衡、自动伸缩等方面的设置,而不用手动进行繁琐的配置。此外,Kubernetes还具备监控和日志收集等功能,方便开发者进行故障排查和性能优化。 在微服务架构中,采用DockerKubernetes进行容器化实践能够带来很多好处。首先,容器化的应用程序能够更加灵活地部署和管理,不受底层技术栈的限制。其次,通过Kubernetes的调度和扩缩容机制,可以实现应用程序的高可用性和弹性伸缩。此外,由于Docker镜像和Kubernetes配置的可移植性,开发者可以方便地在不同的环境中进行应用程序的部署和迁移。 综上所述,DockerKubernetes的微服务容器化实践能够极大地提高应用程序的部署效率和可维护性,是现代化软件开发中不可或缺的重要技术。 ### 回答3: DockerKubernetes是当前非常热门的技术,用于实现微服务的容器化和集群管理。以下是对于DockerKubernetes在微服务容器化实践方面的一些解释和应用。 Docker是一种开源的容器技术,可用于将应用程序及其依赖项打包成一个独立的、可执行的容器。容器化可以提供一种更加轻量级和可移植的方式来部署和运行应用程序。Docker的特点是快速、可移植、隔离和可拆分。 而Kubernetes是一个用于容器编排和集群管理的开源平台。它可以自动化部署、扩展和操作容器化的应用程序。Kubernetes通过对容器进行分组和管理,使得微服务的部署和运维更加简单和高效。 在微服务容器化实践中,首先需要将应用程序及其依赖项打包成一个Docker镜像。然后,可以使用Kubernetes来创建一个包含多个容器的集群,每个容器都运行一个微服务。Kubernetes可以自动管理容器的启动和停止、容器之间的网络通信、负载均衡和容器的扩缩容等。 在CSND上可以找到许多与DockerKubernetes相关的教程和实践案例。这些内容可以帮助开发者了解如何使用DockerKubernetes来容器化和部署自己的微服务应用。同时,还可以学习如何使用Kubernetes的一些高级特性,如自动伸缩、滚动升级和故障恢复等。 总结来说,DockerKubernetes是用于实现微服务容器化和集群管理的重要工具。它们可以帮助开发者简化应用程序的部署和运维工作,提升开发效率和系统的弹性。在CSND上有大量的资源可供参考,帮助开发者更好地理解和应用这些技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值