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用法概述
1 | kubectl [ command ] [TYPE] [NAME] [flags] |
1、command:子命令
- 用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。
2、TYPE:资源对象的类型
- 资源对象类型不区分大小写,能以单数、复数或者缩写形式表示。例如以下3种TYPE是等价的。
1 2 3 | 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
- 指定同一资源类型的多个资源对象,请执行以下操作:TYPE1 name1 name2 name<#>。
- 用一个或多个文件指定资源:-f file1 -f file2 -f file<#>
- 使用YAML而不是JSON因为YAML更容易使用,特别是用于配置文件时。
- 例子:kubectl get -f ./pod.yaml
4、flags:kubectl子命令的可选参数
- 例如,可以使用 -s 或 -server 参数指定Kubernetes API 服务器的地址和端口。而不用默认值。
2.2、资源对象
- kubectl可操作的资源对象类型。
- 获取资源对象:
1 | 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参数指定:
1 | kubectl [ command ] [TYPE] [NAME] -o=<output_format> |
- 根据不同子命令的输出结果,可选的输出格式:
2.5、kubectl操作示例
1、创建资源对象
- 根据YAML配置文件一次性创建Service和RC:
1 | kubectl create -f my-service.yaml -f my-rc.yaml |
- 根据<directory>目录下所有.yaml、.yml、.json文件的定义进行创建:
1 | kubectl create -f <directory> |
2、查看资源对象
- 查看所有Pod列表:
1 | kubectl get pods |
- 查看RC和Service列表:
1 | kubectl get rc,service |
3、描述资源对象
- 显示Node的详细信息:
1 | kubectl describe nodes <node-name> |
- 显示Pod的详细信息:
1 | kubectl describe pods/<pod-name> |
- 显示由RC管理的Pod的信息:
1 | kubectl describe pods <rc-name> |
4、删除资源对象
- 基于pod.yaml定义的名称删除Pod:
1 | kubectl delete -f pod.yaml |
- 删除所有包含某个Label的Pod和Service:
1 | kubectl delete pods,services -l name=<label-name> |
- 删除所有Pod:
1 | kubectl delete pods --all |
5、执行容器的命令
- 执行Pod的date命令,默认使用Pod中的第1个容器执行:
1 | kubectl exec <pod-name> -- date |
- 指定Pod中的某个容器执行date命令:
1 | kubectl exec <pod-name> -c <container-name> -- date |
- 通过bash获得Pod中某个容器的TTY,相当于登录容器:
1 | kubectl exec -ti <pod-name> -c <container-name> -- /bin/bash |
6、查看容器的日志
- 查看容器输出到stdout的日志:
1 | kubectl logs <pod-name> |
- 跟踪查看容器的日志,相当于tail -f命令的结果:
1 | kubectl logs -f <pod-name> -c <container-name> |
7、创建或更新资源对象
- 用法和kubectl create类似,逻辑稍有差异:如果目标资源对象不存在,则进行创建;否则进行更新。
1 | kubectl apply -f app.yaml |
8、在线编辑运行中的资源对象
- 可以使用kubectl edit命令编辑运行中的资源对象,例如使用下面的命令编辑运行中的一个Deployment:
1 | kubectl edit deploy nginx |
- 在命令执行之后,会通过YAML格式展示该对象的定义和状态,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。
9、将Pod的开放端口映射到本地
- 将集群上Pod的80端口映射到本地的8888端口,在浏览器http://127.0.0.1:8888中就能够访问到容器提供的服务了:
1 | kubectl port-forward --address 0.0.0.0 pod /nginx-6ddbbc47fb-sfdcv 8888:80 |
10、在Pod和本地之间复制文件
- 把Pod上的/etc/fstab复制到本地的/tmp目录:
1 | kubectl cp nginx-6ddbbc47fb-sfdcv: /etc/fstab /tmp |
11、资源对象的标签设置
- 为default namespace设置testing=true标签:
1 | kubectl label namespaces default testing= true |
12、检查可用的API资源类型列表
- 该命令经常用于检查特定类型的资源是否已经定义,列出所有资源对象类型:
1 | kubectl api-resources |
13、使用命令行插件
- 为了扩展kubectl的功能,Kubernetes从1.8版本开始引入插件机制,在1.14版本时达到稳定版。
- 用户自定义插件的可执行文件名需要以“kubectl-”开头,复制到$PATH中的某个目录(如/usr/local/bin),然后就可以通过kubectl <plugin-name>运行自定义插件了。
- 例如,实现一个名为hello的插件,其功能为在屏幕上输出字符串“hello world”:
- 新建名为kubectl-hello的可执行脚本文件,其内容为
1 2 3 4 | cat > /usr/local/bin/kubectl-hello << EOF #!/bin/sh echo "hello world" EOF |
-
- 然后在kubectl命令后带上插件名称就能使用这个插件了:
1 2 3 | ] # chmod o+x /usr/local/bin/kubectl-hello ] # kubectl hello hello world |
- 查看当前系统中已安装的插件列表:
1 2 3 4 | ] # kubectl plugin list The following compatible plugins are available: /usr/local/bin/kubectl-hello |
1
1 | # # |
分类:
Kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!