Kubernetes

Kubernetes06-CRI和kubectl

本文主要是介绍Kubernetes06-CRI和kubectl,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、CRI(容器运行时接口)

  • 容器运行时说明文档:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/
  • 开源的CRI有:Docker、CRI-O、Containerd、frakti(基于Hypervisor的容器运行时)。
  • Kubernetes Node(kubelet)的主要功能就是启动和停止容器的组件(例如Docker),我们称之为容器运行时(Container Runtime)。(将容器运行时理解为容器引擎)
  • 为了更具扩展性,Kubernetes从1.5版本开始就加入了容器运行时插件API,即Container Runtime Interface,简称CRI。

1、CRI概述

  • Kubernetes从1.5版本开始引入了CRI接口规范,通过插件接口模式,Kubernetes无须重新编译就可以使用多种容器运行时。
    • CRI包含Protocol Buffers、gRPC API、运行库支持及开发中的标准规范和工具。
  • Docker的CRI实现在Kubernetes 1.6中被更新为Beta版本,并在kubelet启动时默认启动。

2、CRI的主要组件

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

  • Protocol Buffers API包含两个gRPC服务:ImageService和RuntimeService。
    • ImageService提供了从仓库拉取镜像、查看和移除镜像的功能。
    • RuntimeService负责Pod和容器的生命周期管理,以及与容器的交互(exec/attach/port-forward)。rkt和Docker这两个容器运行时可以使用一个Socket同时提供两个服务,在kubelet中可以用--container-runtimeendpoint和--image-service-endpoint参数设置这个Socket。

3、Pod和容器的生命周期管理

  • Pod由一组应用容器组成,其中包含共有的环境和资源约束。
  • 在CRI里,环境被称为PodSandbox。Kubernetes有意为容器运行时留下一些发挥空间,它们可以根据自己的内部实现来解释PodSandbox。
    • 对于Hypervisor类的运行时,PodSandbox会具体化为一个虚拟机。
    • 其他,例如Docker,它是一个Linux命名空间。
    • 在v1alpha1 API中,kubelet会创建Pod级别的cgroup传递给容器运行时,并以此运行所有进程来满足PodSandbox对Pod的资源保障。
  • RuntimeService服务包括对Sandbox和Container操作的方法。
    • 在启动Pod之前,kubelet调用RuntimeService.RunPodSandbox来创建环境。这一过程包括为Pod设置网络资源(分配IP等操作)。
    • PodSandbox被激活之后,就可以独立地创建、启动、停止和删除不同的容器了。kubelet会在停止和删除PodSandbox之前首先停止和删除其中的容器。
  • kubelet的职责在于通过RPC管理容器的生命周期,实现容器生命周期的钩子,存活和健康监测,以及执行Pod的重启策略等。

2、kubectl命令行工具

2.1、kubectl用法概述

kubectl [command] [TYPE] [NAME] [flags]

(1)command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。

(2)TYPE:资源对象的类型。资源类型不区分大小写,能以单数、复数或者缩写形式表示。例如以下3种TYPE是等价的。

  • kubectl get pod pod1
  • kubectl get pods pod1
  • kubectl get po pod1

(3)NAME:资源对象的名称。名称区分大小写。如果不指定名称,则将返回属于TYPE的全部对象的列表,例如kubectl get pods

  • 在对多个资源执行操作时,可以按类型和名称指定每个资源,或指定一个或多个文件:
    • 要按类型和名称指定资源:
      • 指定同一资源类型的多个资源对象,请执行以下操作:TYPE1 name1 name2 name<#>。
        • 例子:kubectl get pod example-pod1 example-pod2
      • 分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>。
        • 例子:kubectl get pod/example-pod1 replicationcontroller/example-rc1
    • 用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
      • 使用YAML而不是JSON因为YAML更容易使用,特别是用于配置文件时。
      • 例子:kubectl get -f ./pod.yaml

(4)flags:kubectl子命令的可选参数。例如,可以使用 -s 或 -server 参数指定Kubernetes API 服务器的地址和端口。而不用默认值。

2.2、资源对象

  • kubectl可操作的资源对象类型。
  • 获取资源对象:
kubectl api-resources

1

#                                                                                                                        #
这篇关于Kubernetes06-CRI和kubectl的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!