Containerd是从Docker中分离的一个项目,旨在为Kubernetes提供容器运行时,负责管理镜像和容器的生命周期。不过Containerd是可以抛开Docker独立工作的。

 kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd) kubeadm K8S containerd 第1张

前言

去年12月份,当Kubernetes社区宣布1.20版本之后会逐步弃用dockershim,当时也有很多自媒体在宣传Kubernetes弃用Docker。其实,我觉得这是一种误导,也许仅仅是为了蹭热度。

dockershim是Kubernetes的一个组件,其作用是为了操作Docker。Docker是在2013年面世的,而Kubernetes是在2016年,所以Docker刚开始并没有想到编排,也不会知道会出现Kubernetes这个庞然大物(它要是知道,也不会败的那么快...)。但是Kubernetes在创建的时候就是以Docker作为容器运行时,很多操作逻辑都是针对的Docker,随着社区越来越健壮,为了兼容更多的容器运行时,才将Docker的相关逻辑独立出来组成了dockershim。

正因为这样,只要Kubernetes的任何变动或者Docker的任何变动,都必须维护dockershim,这样才能保证足够的支持,但是通过dockershim操作Docker,其本质还是操作Docker的底层运行时Containerd,而且Containerd自身也是支持CRI(Container Runtime Interface),那为什么还要绕一层Docker呢?是不是可以直接通过CRI和Containerd进行交互?这也是社区希望启动dockershim的原因之一吧。

那什么是Containerd呢?

Containerd是从Docker中分离的一个项目,旨在为Kubernetes提供容器运行时,负责管理镜像和容器的生命周期。不过Containerd是可以抛开Docker独立工作的。它的特性如下:

  • 支持OCI镜像规范,也就是runc
  • 支持OCI运行时规范
  • 支持镜像的pull
  • 支持容器网络管理
  • 存储支持多租户
  • 支持容器运行时和容器的生命周期管理
  • 支持管理网络名称空间

Containerd和Docker在命令使用上的一些区别主要如下:

 kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd) kubeadm K8S containerd 第2张

可以看到使用方式大同小异。

下面介绍一下使用kubeadm安装K8S集群,并使用containerd作为容器运行时的具体安装步骤。

环境说明

主机节点

 kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd) kubeadm K8S containerd 第3张

软件说明

软件版本

 kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd) kubeadm K8S containerd 第4张

环境准备

(1)在每个节点上添加 hosts 信息:

$ cat /etc/hosts

  1. 192.168.0.5k8s-master
  2. 192.168.0.125k8s-node01

(2)禁用防火墙:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld

(3)禁用SELINUX:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled

(4)创建/etc/sysctl.d/K8S.conf文件,添加如下内容:

  1. net.bridge.bridge-nf-call-ip6tables=1
  2. net.bridge.bridge-nf-call-iptables=1
  3. net.ipv4.ip_forward=1

(5)执行如下命令使修改生效:

  1. $modprobebr_netfilter
  2. $sysctl-p/etc/sysctl.d/k8s.conf

(6)安装 ipvs

  1. $cat>/etc/sysconfig/modules/ipvs.modules<<EOF
  2. #!/bin/bash
  3. modprobe--ip_vs
  4. modprobe--ip_vs_rr
  5. modprobe--ip_vs_wrr
  6. modprobe--ip_vs_sh
  7. modprobe--nf_conntrack_ipv4
  8. EOF
  9. $chmod755/etc/sysconfig/modules/ipvs.modules&&bash/etc/sysconfig/modules/ipvs.modules&&lsmod|grep-eip_vs-enf_conntrack_ipv4

上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

(7)安装了 ipset 软件包:

  1. $yuminstallipset-y

为了便于查看 ipvs 的代理规则,最好安装一下管理工具 ipvsadm:

  1. $yuminstallipvsadm-y

(8)同步服务器时间

  1. $yuminstallchrony-y
  2. $systemctlenablechronyd
  3. $systemctlstartchronyd
  4. $chronycsources

(9)关闭 swap 分区:

  1. $swapoff-a

(10)修改/etc/fstab文件,注释掉 SWAP 的自动挂载,使用free -m确认 swap 已经关闭。swappiness 参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
0

执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

(11)接下来可以安装 Containerd

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
1

可以选择安装一个版本,比如我们这里安装最新版本:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
2

(12)创建containerd配置文件:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
3

(13)启动Containerd:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
4

在确保 Containerd安装完成后,上面的相关环境配置也完成了,现在我们就可以来安装 Kubeadm 了,我们这里是通过指定yum 源的方式来进行安装,使用阿里云的源进行安装:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
5

然后安装 kubeadm、kubelet、kubectl(我安装的是最新版,有版本要求自己设定版本):

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
6

设置运行时:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
7

可以看到我们这里安装的是 v1.20.5版本,然后将 kubelet 设置成开机启动:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
8

到这里为止上面所有的操作都需要在所有节点执行配置。

初始化集群

初始化Master

然后接下来在 master 节点配置 kubeadm 初始化文件,可以通过如下命令导出默认的初始化配置:

  1. $systemctlstopfirewalld
  2. $systemctldisablefirewalld
9

然后根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd【1】

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
0

然后使用上面的配置文件进行初始化:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
1

拷贝 kubeconfig 文件

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
2

添加节点

记住初始化集群上面的配置和操作要提前做好,将 master 节点上面的 $HOME/.kube/config 文件拷贝到 node 节点对应的文件中,安装 kubeadm、kubelet、kubectl,然后执行上面初始化完成后提示的 join 命令即可:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
3

如果忘记了上面的 join 命令可以使用命令kubeadm token create --print-join-command重新获取。

执行成功后运行 get nodes 命令:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
4

可以看到是 NotReady 状态,这是因为还没有安装网络插件,接下来安装网络插件,可以在文档 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 中选择我们自己的网络插件,这里我们安装 calio:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
5

# 因为有节点是多网卡,所以需要在资源清单文件中指定内网网卡

$ vi calico.yaml

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
6

安装calico网络插件

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
7

隔一会儿查看 Pod 运行状态:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
8

网络插件运行成功了,node 状态也正常了:

  1. $setenforce0
  2. $cat/etc/selinux/config
  3. SELINUX=disabled
9

用同样的方法添加另外一个节点即可。

配置命令自动补全

  1. net.bridge.bridge-nf-call-ip6tables=1
  2. net.bridge.bridge-nf-call-iptables=1
  3. net.ipv4.ip_forward=1
0

参考文档

【1】:https://github.com/containerd/containerd/issues/4857

【2】:https://github.com/containerd/containerd

 kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd) kubeadm K8S containerd 第5张

转载请说明出处
知优网 » kubeadm部署K8S集群并使用containerd做容器运行时(kubernetes containerd)

发表评论

您需要后才能发表评论