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命令行工具

  • kubectl说明手册:https://kubernetes.io/docs/reference/kubectl/overview/
  • kubectl作为客户端CLI工具,可以让用户通过命令行对Kubernetes集群进行操作。

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

2.3、kubectl子命令详解

  • kubectl的子命令非常丰富,涵盖了对Kubernetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等。

1、Basic Commands (Beginner)

  • create:从文件或stdin创建一个或多个资源。
    • kubectl create -f FILENAME [flags]
  • expose:将副本控制器(replication controller)、服务(service)、deployment或pod作为新的Kubernetes服务暴露。
    • kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags]
  • run:在集群中运行一个指定的镜像
    • kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server | client | none] [--overrides=inline-json] [flags]
  • set:配置应用程序资源。
    • kubectl set SUBCOMMAND [options]

2、Basic Commands (Intermediate)

  • explain:查看资源的文档。例如 pod, node, service 等。
    • kubectl explain [--recursive=false] [flags]
  • get:列出一个或多个资源。
    • kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags]
  • edit:使用默认编辑器编辑和更新服务器上一个或多个资源的定义。
    • kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]
  • delete:从文件、标准输入或指定标签选择器、名称、资源选择器或资源中删除资源。
    • kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags]

3、Deploy Commands(部署命令)

  • rollout:管理资源的部署。有效的资源类型包括:Deployments、DaemonSets和StatefulSets。
    • kubectl rollout SUBCOMMAND [options]
  • scale:更新指定副本控制器的大小。
    • kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags]
  • autoscale:自动调整一个Deployment、ReplicaSet、或ReplicationController的副本数量。
    • kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]

4、Cluster Management Commands(集群管理命令)

  • certificate:修改证书资源。
    • kubectl certificate SUBCOMMAND [options]
  • cluster-info:显示有关集群中主服务器和服务的端口信息。
    • kubectl cluster-info [flags]
  • top:显示资源(CPU/内存/存储)的使用情况。
    • kubectl top [flags] [options]
  • cordon:将节点标记为不可调度。
    • kubectl cordon NODE [options]
  • uncordon:将节点标记为可调度。
    • kubectl uncordon NODE [options]
  • drain:腾空节点以准备维护。
    • kubectl drain NODE [options]
  • taint:更新一个或多个节点上的污点。
    • kubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options]

5、Troubleshooting and Debugging Commands(故障处理和Debugging命令)

  • describe:显示一个或多个资源的详细状态
    • kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]
  • logs:输出pod中容器的日志
    • kubectl logs POD [-c CONTAINER] [--follow] [flags]
  • attach:附加到正在运行的容器,查看输出流或与容器(stdin)交互。
    • kubectl attach POD -c CONTAINER [-i] [-t] [flags]
  • exec:在pod中的一个container中执行一个命令
    • kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]
  • port-forward:将一个或多个本地端口转发到pod
    • kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]
  • proxy:运行Kubernetes API服务器的代理。
    • kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]
  • cp:复制文件和目录到容器,或从容器中复制文件和目录。
    • kubectl cp <file-spec-src> <file-spec-dest> [options]
  • auth:检查授权。
    • kubectl auth [flags] [options]

6、Advanced Commands(高级命令)

  • diff:将live配置和文件或标准输入做对比 (BETA)
    • kubectl diff -f FILENAME [flags]
  • apply:通过文件名或标准输入流(stdin)对资源进行配置。
    • kubectl apply -f FILENAME [flags]
  • patch:使用"策略合并patch程序"更新资源的一个或多个字段。
    • kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags]
  • replace:从文件或标准输入中替换资源。
    • kubectl replace -f FILENAME
  • wait:实验性:在一个或多个资源上等待特定的条件。
    • kubectl wait ([-f FILENAME] | resource.group/resource.name | resource.group [(-l label | --all)]) [--for=delete|--for condition=available] [options]
  • kustomize:列出从kustomization.yaml文件中的指令生成的一组API资源。参数必须是包含文件的目录的路径,或者是git存储库URL,其路径后缀相对于存储库根目录指定了相同的路径。
    • kubectl kustomize <dir> [flags] [options]

7、Settings Commands(设置命令)

  • label:添加或更新一个或多个资源的标签。
    • kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]
  • annotate:添加或更新一个或多个资源的注解。
    • kubectl annotate (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]
  • completion:为指定的shell(bash或zsh)输出shell补齐代码。
    • kubectl completion SHELL [options]

8、Other Commands(其他命令)

  • api-resources:列出可用的API资源。
    • kubectl api-resources [flags]
  • api-versions:列出可用的API版本,以“group/version”的形式。
    • kubectl api-versions [flags]
  • config:修改kubeconfig文件
    • kubectl config SUBCOMMAND [flags]
  • plugin:提供与插件交互的实用程序。
    • kubectl plugin [flags] [options]
  • version:显示运行在客户端和服务器上的Kubernetes版本。
    • kubectl version [--client] [flags]

2.4、kubectl输出格式

  • kubectl命令可以用多种格式对结果进行显示,输出的格式通过-o参数指定:
kubectl [command] [TYPE] [NAME] -o=<output_format>
  • 根据不同子命令的输出结果,可选的输出格式:

2.5、kubectl操作示例

1、创建资源对象

  • 根据YAML配置文件一次性创建Service和RC:
kubectl create -f my-service.yaml -f my-rc.yaml
  • 根据<directory>目录下所有.yaml、.yml、.json文件的定义进行创建:
kubectl create -f <directory>

2、查看资源对象

  • 查看所有Pod列表:
kubectl get pods
  • 查看RC和Service列表:
kubectl get rc,service

3、描述资源对象

  • 显示Node的详细信息:
kubectl describe nodes <node-name>
  • 显示Pod的详细信息:
kubectl describe pods/<pod-name>
  • 显示由RC管理的Pod的信息:
kubectl describe pods <rc-name>

4、删除资源对象

  • 基于pod.yaml定义的名称删除Pod:
kubectl delete -f pod.yaml
  • 删除所有包含某个Label的Pod和Service:
kubectl delete pods,services -l name=<label-name>
  • 删除所有Pod:
kubectl delete pods --all

5、执行容器的命令

  • 执行Pod的date命令,默认使用Pod中的第1个容器执行:
kubectl exec <pod-name> -- date
  • 指定Pod中的某个容器执行date命令:
kubectl exec <pod-name> -c <container-name> -- date
  • 通过bash获得Pod中某个容器的TTY,相当于登录容器:
kubectl exec -ti <pod-name> -c <container-name> -- /bin/bash

6、查看容器的日志

  • 查看容器输出到stdout的日志:
kubectl logs <pod-name>
  • 跟踪查看容器的日志,相当于tail -f命令的结果:
kubectl logs -f <pod-name> -c <container-name>

7、创建或更新资源对象

  • 用法和kubectl create类似,逻辑稍有差异:如果目标资源对象不存在,则进行创建否则进行更新
kubectl apply -f app.yaml

8、在线编辑运行中的资源对象

  • 可以使用kubectl edit命令编辑运行中的资源对象,例如使用下面的命令编辑运行中的一个Deployment:
kubectl edit deploy nginx
  • 在命令执行之后,会通过YAML格式展示该对象的定义和状态,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。

9、将Pod的开放端口映射到本地

  • 将集群上Pod的80端口映射到本地的8888端口,在浏览器http://127.0.0.1:8888中就能够访问到容器提供的服务了:
kubectl port-forward --address 0.0.0.0 pod/nginx-6ddbbc47fb-sfdcv 8888:80

10、在Pod和本地之间复制文件

  • 把Pod上的/etc/fstab复制到本地的/tmp目录:
kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp

11、资源对象的标签设置

  • 为default namespace设置testing=true标签:
kubectl label namespaces default testing=true

12、检查可用的API资源类型列表

  • 该命令经常用于检查特定类型的资源是否已经定义,列出所有资源对象类型:
kubectl api-resources

13、使用命令行插件

  • 为了扩展kubectl的功能,Kubernetes从1.8版本开始引入插件机制,在1.14版本时达到稳定版。
  • 用户自定义插件的可执行文件名需要以“kubectl-”开头,复制到$PATH中的某个目录(如/usr/local/bin),然后就可以通过kubectl <plugin-name>运行自定义插件了。
  • 例如,实现一个名为hello的插件,其功能为在屏幕上输出字符串“hello world”:
    • 新建名为kubectl-hello的可执行脚本文件,其内容为
cat > /usr/local/bin/kubectl-hello << EOF
#!/bin/sh
echo "hello world"
EOF
    • 然后在kubectl命令后带上插件名称就能使用这个插件了:
]# chmod o+x /usr/local/bin/kubectl-hello
]# kubectl hello
hello world
  • 查看当前系统中已安装的插件列表
]# kubectl plugin list
The following compatible plugins are available:

/usr/local/bin/kubectl-hello

1

#                                                                                                                        #
posted @ 2022-03-21 01:27  麦恒  阅读(84)  评论(0编辑  收藏  举报