K8s

CRI

2021-10-24  本文已影响0人  乙腾

介绍

  归根结底,Kubernetes Node(kubelet)的主要功能就是启动和停止容器的组件,我们称之为容器运行时(Container Runtime),其中最知名的就是Docker了。为了更具扩展性,Kubernetes从1.5版本开始就加入了容器运行时插件API,即Container Runtime Interface,简称CRI。

CRI概述

 每个容器运行时都有特点,因此不少用户希望Kubernetes能够支持更多的容器运行时。Kubernetes从1.5版本开始引入了CRI接口规范,通过插件接口模式,Kubernetes无须重新编译就可以使用更多的容器运行时。

CRI的组成

CRI的出现的意义

CRI的主要组件

  kubelet使用gRPC框架通过UNIX Socket与容器运行时(或CRI代理)进行通信。在这个过程中kubelet是客户端,CRI代理(shim)是服务端,如图

image.png

rkt和Docker这样的容器运行时可以使用一个Socket同时提供两个服务,在kubelet中可以用--container-runtime-endpoint和--image-service-endpoint参数设置这个Socket。

Pod和容器的生命周期管理

Pod由一组应用容器组成,其中包含

在启动Pod之前,kubelet调用RuntimeService.RunPodSandbox来创建环境

这一过程包括为Pod设置网络资源(分配IP等操作)。

PodSandbox被激活之后,就可以独立地创建、启动、停止和删除不同的容器了。

kubelet会在停止和删除PodSandbox之前首先停止和删除其中的容器。

kubelet的职责

在于通过RPC管理容器的生命周期

RuntimeService服务

包括对Sandbox和Container操作的方法,下面的伪代码展示了主要的RPC方法:

[图片上传失败...(image-4b5574-1635076459785)]

面向容器级别的设计思路

Kubernetes为用户提供了与Pod及其中的容器进行交互的功能(kubectl exec/attach/port- forward)

kubelet目前提供了两种方式来支持这些功能:

image.png

kubelet处理所有的请求连接的潜在问题

  kubelet处理所有的请求连接,使其有成为Node通信瓶颈的可能。

如何解决

尝试使用新的Docker-CRI来创建容器

  要尝试新的Kubelet-CRI-Docker集成,只需为kubelet启动参数加上--enable-cri=true开关来启动CRI。这个选项从Kubernetes 1.6开始已经作为kubelet的默认选项了。如果不希望使用CRI,则可以设置--enable-cri=false来关闭这个功能。

  查看kubelet的日志,可以看到启用CRI和创建gRPC Server的日志:

image.png

创建一个Deployment:

image.png

查看Pod的详细信息,可以看到将会创建沙箱(Sandbox)的Event:

image.png

这表明kubelet使用了CRI接口来创建容器。

CRI的进展

  目前已经有多款开源CRI项目可用于Kubernetes:Docker、CRI-O、Containerd、frakti(基于Hypervisor的容器运行时),各CRI运行时的安装手册可参考官网https://kubernetes.io/docs/setup/cri/的说明。

上一篇 下一篇

猜你喜欢

热点阅读