1.1 Pod介绍
-
Pod是Kubernetes中的一个基本构建块,它是一个逻辑主机,用于托管一个或多个容器。
-
Pod中的容器共享网络和存储资源,并且通常作为一个单元一起调度和管理。
-
Pod为容器提供了一个共享的环境,使得容器之间可以方便地通信和共享数据。
-
Pod还可以配置资源限制、健康检查、重启策略等,以满足不同的应用需求。
-
Pod是Kubernetes中创建和管理容器的最小和最简单的单位,是实现容器编排和自动化部署的基础。
1.2 Pod结构
-
usercontainerN:这可能表示Pod中的一个用户定义的容器,其中
N
是一个占位符,代表容器的编号或者是一个特定的标识符。 -
user ImageN:这表示与
usercontainerN
相关联的容器镜像。镜像是容器运行时所需的软件、库、环境等的打包形式。 -
container1:这是Pod中定义的另一个容器,根据上下文,这可能是用户定义的第一个容器。
-
Image1:这是与
container1
相关联的容器镜像。 -
Pause:在Kubernetes中,Pause容器通常用作Pod中的一个特殊容器,它不执行任何操作,但可以保证Pod的网络和存储资源被正确设置。Pause容器的两个主要作用:
-
健康状态评估:Pause容器可以作为Pod健康状态的代理。因为所有的容器共享Pod的网络栈,所以Kubernetes可以通过检查Pause容器的状态来评估整个Pod的健康状态。如果Pause容器运行正常,那么可以认为Pod的网络和存储是可用的,即使用户定义的容器可能已经崩溃或正在重启。
-
网络和IP地址:Pause容器通常用于为Pod设置一个稳定的IP地址。由于Pod中的所有容器共享网络命名空间,它们都会使用由Pause容器设置的Pod IP地址进行通信。这意味着Pod内的所有容器都可以通过这个IP地址相互通信,同时也可以通过这个IP地址与Pod外部的实体进行通信。
-
-
gcr.io/google_containers/pause-amd14:这是Pause容器的镜像地址,
amd14
表示这个镜像是为14位架构的处理器设计的。
1.3 Pod工作方式
1.3.1 Pod的创建
-
在Kubernetes (K8s) 中,确实可以通过YAML配置文件或使用
kubectl
命令行工具来创建资源,包括Pod。-
编写YAML配置文件:首先,你需要创建一个YAML文件,其中定义了Pod的配置,包括容器镜像、环境变量、存储卷等。
-
应用YAML配置:使用
kubectl apply
命令将YAML配置应用到Kubernetes集群中,从而创建Pod。
-
-
使用命令行参数:通过
kubectl run
命令及其参数直接在命令行中创建Pod。
-
尽管
kubectl run
可以快速创建Pod,但它不如使用YAML文件灵活,且不适合复杂的部署需求。
1.3.2 Pod的管理方式
在Kubernetes中,Pod可以以两种方式进行管理:
-
自主式Pod:这是直接创建的Pod,没有控制器管理。如果这种Pod被删除,它将不复存在,除非你有适当的备份或重建机制。
-
控制器管理的Pod:这是推荐的做法,因为控制器可以确保Pod的高可用性和可扩展性。以下是一些常见的控制器:
-
ReplicaSet:确保指定数量的Pod副本始终运行。
-
Deployment:是ReplicaSet的扩展,提供了更高级的功能,如滚动更新、回滚和扩缩容。
-
Job:用于运行批处理任务,一旦任务完成,Job控制器会负责清理Pod。
-
CronJob:基于时间表创建Job,类似于cron任务。
-
DaemonSet:确保在集群的所有节点或选定节点上都有一个Pod副本运行。
-
StatefulSet:用于管理有状态的应用,它为Pod提供了稳定的网络标识、顺序部署、缩放和滚动更新。
-
-
使用控制器来管理Pod的好处包括:
-
自动恢复:如果Pod失败,控制器可以自动重启或重新创建Pod。
-
水平扩展:可以根据负载自动扩展Pod的数量。
-
版本控制和回滚:可以管理Pod的不同版本,并在必要时回滚到以前的版本。
-
自我修复:控制器会监控Pod的状态,并在必要时进行修复。
-
注意:通常,为了确保应用的稳定性和可维护性,推荐使用控制器来管理Pod,而不是直接管理自主式Pod。
1.4 Pod的资源清单
1.4.1 YMAL文件介绍
--- apiVersion: v1 # 版本号,必选 kind: Pod # 资源类型,必选 metadata: # 元数据,必选 name: string # Pod名称,必选 namespace: string # Pod所属的命名空间,默认为"default" labels: # 自定义标签列表 - name: string spec: # Pod中容器的详细定义,必选 containers: # Pod中容器列表,必选 - name: string # 容器名称,必选 image: string # 容器的镜像名称,必选 imagePullPolicy: [ Always|Never|IfNotPresent ] # 镜像拉取策略 command: [string] # 容器启动命令列表 args: [string] # 容器启动命令参数列表 workingDir: string # 容器的工作目录 volumeMounts: # 存储卷配置 - name: string # 存储卷名称 mountPath: string # 存储卷在容器内的挂载路径 readOnly: boolean # 是否为只读模式 ports: # 需要暴露的端口列表 - name: string # 端口名称 containerPort: int # 容器监听的端口号 hostPort: int # 主机监听的端口号 protocol: string # 端口协议,默认TCP env: # 环境变量列表 - name: string # 环境变量名称 value: string # 环境变量的值 resources: # 资源限制和请求 limits: # 资源限制 cpu: string # CPU限制 memory: string # 内存限制 requests: # 资源请求 cpu: string # CPU请求 memory: string # 内存请求 lifecycle: # 生命周期钩子 postStart: # 容器启动后执行的钩子 exec: command: [string] # 执行的命令或脚本 preStop: # 容器终止前执行的钩子 exec: command: [string] livenessProbe: # 存活探针设置 exec: # exec方式检查 command: [string] httpGet: # httpGet方式检查 path: string port: number host: string scheme: string HttpHeaders: - name: string value: string tcpSocket: # tcpSocket方式检查 port: number initialDelaySeconds: int # 首次探测延迟时间 timeoutSeconds: int # 超时时间 periodSeconds: int # 探测时间间隔 successThreshold: int # 成功阈值 failureThreshold: int # 失败阈值 securityContext: # 安全上下文 privileged: false # 是否特权模式 restartPolicy: [Always | Never | OnFailure] # 重启策略 nodeName: string # 指定节点名称 nodeSelector: # 节点选择器 key: value # 标签选择 imagePullSecrets: # 镜像拉取密钥 - name: string # 密钥名称 hostNetwork: boolean # 是否使用宿主机网络 volumes: # 共享存储卷列表 - name: string # 存储卷名称 emptyDir: {} # emptyDir类型的存储卷 hostPath: # hostPath类型的存储卷 path: string # 宿主机上的路径 secret: # secret类型的存储卷 secretName: string # 引用的Secret名称 items: - key: string # Secret中的键 path: string # 存储卷中的文件路径 configMap: # configMap类型的存储卷 name: string # 引用的ConfigMap名称 items: - key: string # ConfigMap中的键 path: string # 存储卷中的文件路径
1.4.2 查看资源类型
1.4.2.1 查看资源的一级属性
-
要查看某种资源可以配置的一级属性,可以使用以下命令格式:
[root@K8s-master ~]# kubectl explain 资源类型
-
例如,要查看Pod资源的一级属性,可以使用:
[root@K8s-master ~]# kubectl explain pod
在kubernetes中基本所有资源的一级属性都是一样的,主要包含5部分:
-
apiVersion (<string>): 指定了Kubernetes API的版本。这个版本号必须是Kubernetes集群支持的,可以通过
kubectl api-versions
命令查询到。 -
kind (<string>): 指定了资源类型,比如"Pod"、"Service"、"Deployment"等。这些资源类型也必须是Kubernetes集群支持的,可以通过
kubectl api-resources
命令查询到。 -
metadata (<Object>): 包含了资源的元数据,如资源的名称(
name
)、命名空间(namespace
)、标签(labels
)和注解(annotations
)等。这些信息用于标识和组织资源。 -
spec (<Object>): 描述了资源的期望状态,即用户希望资源如何被配置和运行。这是资源配置中最重要的部分,包含了资源的详细配置。
-
status (<Object>): 包含了资源的当前状态信息,如条件、主机IP、PodIP等。这部分内容由Kubernetes系统自动生成和维护,用户通常不需要(也不可能)直接修改。
1.4.2.2 查看属性的子属性
要查看某个属性的子属性,可以使用点(.
)符号来指定属性。命令格式如下:
[root@K8s-master ~]# kubectl explain 资源类型.属性
例如,要查看Pod资源中spec
属性的子属性,可以使用:
[root@K8s-master ~]# kubectl explain pod.spec
在上面的属性中,spec是接下来研究的重点,继续看下它的常见子属性:
-
containers (<[]Object>): 一个容器对象的列表,每个对象定义了一个容器的详细信息,如镜像、端口、环境变量等。
-
nodeName (<String>): 如果指定,Pod将被调度到具有指定名称的节点上。
-
nodeSelector (<map[]>): 一个键值对的映射,用于选择具有相应标签的节点来运行Pod。
-
hostNetwork (<boolean>): 一个布尔值,指示Pod是否应该使用宿主机的网络栈。
-
volumes (<[]Object>): 定义了Pod中使用的存储卷,包括它们的类型和挂载信息。
-
restartPolicy (<string>): 定义了Pod在容器退出时的重启策略,可以是
Always
、OnFailure
或Never
。
1.4.2.3 查看更具体的子属性
如果某个属性还有更深层次的子属性,可以继续使用点符号来指定更具体的属性。例如,要查看spec
下的containers
属性的详细信息:
[root@K8s-master ~]# kubectl explain pod.spec.containers
这个命令会列出containers
字段可以设置的所有选项。
1.4.2.4 使用--recursive选项
如果你想要递归地查看一个资源的所有属性和子属性,可以使用--recursive
选项。这个选项会显示所有级别的属性。例如:
[root@K8s-master ~]# kubectl explain pod --recursive
kubectl explain
命令的输出可能会非常多,特别是对于复杂的资源对象。你可能需要使用管道(如less
或grep
)来更好地浏览输出。
1.5 Pod配置
1.5.1 Pod中容器的配置
[root@K8s-master ~]# kubectl explain pod.spec.containers
-
name (<string>): 容器的名称。在Pod内必须唯一。
-
image (<string>): 容器使用的镜像地址。这是容器运行时使用的Docker镜像。
-
imagePullPolicy (<string>): 镜像拉取策略,可以是
Always
、Never
或IfNotPresent
。这决定了Kubernetes在启动容器时如何处理镜像:-
Always
:不管本地是否存在镜像,总是从仓库拉取。 -
Never
:假设镜像已经存在于本地,从不拉取。 -
IfNotPresent
:如果本地不存在镜像,则从仓库拉取。
-
-
command (<[]string>): 容器的启动命令列表。如果这个字段没有被指定,那么容器将使用在镜像中定义的默认命令。
-
args (<[]string>): 容器的启动命令所需的参数列表。
-
env (<[]Object>): 容器环境变量的配置。每个环境变量是一个对象,通常包含
name
和value
字段。 -
ports (<[]Object>): 容器需要暴露的端口号列表。每个端口是一个对象,可能包含
name
、containerPort
、hostPort
和protocol
等字段。 -
resources (<Object>): 资源限制和资源请求的设置。这包括CPU和内存的限制和请求,允许Pod调度器和节点做出适当的资源分配。
1.5.2 基本配置
[root@K8s-master ~]# vim pod-base.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-base namespace: test labels: user: yoozoo spec: containers: - name: nginx image: nginx - name : busybox image: busybox
-
apiVersion、kind、metadata 和 spec 是Kubernetes资源对象的标准字段。
-
metadata 部分包含了Pod的名称、命名空间和标签。
-
spec 部分的 containers 字段定义了Pod中包含的容器列表。在本例中,有两个容器被定义:
-
第一个容器名为 nginx,使用的是官方的 nginx 镜像,这通常用于运行Nginx Web服务器。
-
第二个容器名为 busybox,使用的是 busybox 镜像,这是一个多功能的镜像,包含了许多常用的命令行工具,常用于测试和作为辅助容器。
-
[root@K8s-master ~]# kubectl apply -f pod-base.yaml #创建 pod/pod-base created [root@K8s-master ~]# kubectl get pod pod-base -n test #有一个没启动 NAME READY STATUS RESTARTS AGE pod-base 1/2 CrashLoopBackOff 1 (2m11s ago) 8m25s # READY 1/2 : 表示当前Pod中有2个容器,其中1个准备就绪,1个未就绪 # RESTARTS : 重启次数,因为有1个容器故障了,Pod一直在重启试图恢复它 [root@K8s-master ~]# kubectl describe pod pod-base -n test #查看详细信息
1.5.3 镜像拉取
imagePullPolicy
决定了Kubernetes如何从容器镜像仓库中拉取容器镜像。以下是三种支持的拉取策略的详细说明:
-
Always: 无论本地是否存在所需镜像,Kubernetes都会尝试从配置的镜像仓库中拉取最新的镜像。这可以确保使用的是镜像仓库中最新版本的镜像,但可能会增加部署时的网络负载。
-
IfNotPresent: 这是默认的拉取策略。如果本地仓库中不存在指定的镜像,Kubernetes会从远程仓库拉取它。如果本地已经有了镜像,则直接使用本地的镜像,不会进行远程拉取。
-
Never: Kubernetes不会尝试从远程仓库拉取镜像,只会使用本地仓库中的镜像。如果本地仓库中不存在所需的镜像,Kubernetes将无法启动容器并返回错误。
关于默认值的说明:
-
当镜像标签是具体的版本号(如
1.14.2
)时,Kubernetes默认使用IfNotPresent
策略。这意味着,如果本地存在该版本号的镜像,则使用本地镜像;如果本地不存在,则从远程拉取。 -
当镜像标签是
latest
时,Kubernetes默认使用Always
策略。这是因为latest
通常表示最新的开发版本,而这个版本可能会频繁更新。
[root@K8s-master ~]# vim pod-base.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-base namespace: test labels: user: yoozoo spec: containers: - name: nginx image: nginx - name : busybox image: busybox imagePullPolicy: IfNotPresent [root@K8s-master ~]# kubectl apply -f pod-base.yaml #创建 pod/pod-base created
1.5.4 启动命令
-
在前面的案例中,一直有一个问题没有解决,就是的busybox容器一直没有成功运行,那么到底是什么原因导致这个容器的故障呢?
-
原来busybox并不是一个程序,而是类似于一个工具类的集合,kubernetes集群启动管理后,它会自动关闭。解决方法就是让其一直在运行,这就用到command配置。
[root@K8s-master ~]# vim pod-command.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-command namespace: test spec: containers: - name: nginx image: nginx:1.17.1 - name: busybox image: busybox command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo$(date +%T) >> /tmp/hello.txt; sleep 3; done;"] [root@K8s-master ~]# kubectl apply -f pod-command.yaml pod/pod-command created
command
字段做了以下几件事情:
-
"/bin/sh"
: 指定使用的shell是/bin/sh
。 -
"-c"
: 这个参数告诉/bin/sh
,接下来的字符串是一个shell命令列表。 -
"touch /tmp/hello.txt; while true; do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"
: 这是一个复合命令,执行以下操作:-
touch /tmp/hello.txt
: 创建一个名为hello.txt
的文件在/tmp
目录下。 -
while true; do ... done
: 开始一个无限循环。 -
/bin/echo $(date +%T) >> /tmp/hello.txt
: 将当前时间(格式化为24小时制,包括小时、分钟和秒)追加到/tmp/hello.txt
文件中。 -
sleep 3
: 暂停执行3秒,然后循环再次开始。
-
这个命令在容器启动时执行,并且由于while true
循环,它将无限期地运行,每隔3秒更新一次hello.txt
文件。这可以用于创建一个定时写入文件的简单服务或用于调试目的。
[root@K8s-master ~]# kubectl get pod pod-command -n test -o wide #成功运行 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-command 2/2 Running 0 2m13s 10.244.2.3 k8s-node-02 <none> <none>
1.5.4.1 进入容器
命令:
-
kubectl exec pod名称 -n 命名空间 -it -c 容器名称 /bin/sh
[root@K8s-master ~]# kubectl exec pod-command -n test -it -c busybox /bin/sh / #
Kubernetes中容器的command
和args
字段与Docker容器的ENTRYPOINT
和CMD
指令之间的关系和行为。以下是这两者在Kubernetes和Docker中的作用和区别:
1.5.4.2 command和args关系
-
在Docker中:
-
ENTRYPOINT: 是容器启动时执行的命令,它定义了容器的入口点。如果Dockerfile中定义了
ENTRYPOINT
,那么它通常不会被覆盖,除非在使用docker run
命令时使用--entrypoint
参数显式覆盖。
-
CMD: 是Docker容器的默认命令,它在容器没有接收到其他命令时执行。CMD指令可以被
docker run
命令后面的参数覆盖。
-
-
在Kubernetes中:
-
command: 这是Kubernetes Pod定义中用来覆盖容器镜像中定义的
ENTRYPOINT
的字段。
-
args: 这是Kubernetes Pod定义中用来覆盖容器镜像中定义的
CMD
的字段。
-
-
以下是Kubernetes中
command
和args
的行为规则:-
如果
command
和args
都没有指定:Kubernetes将使用容器镜像中定义的ENTRYPOINT
和CMD
。
-
如果指定了
command
,但没有指定args
:Kubernetes将忽略容器镜像中的ENTRYPOINT
和CMD
,直接执行指定的command
。
-
如果没指定
command
,但指定了args
:这是一个不常见的情况,因为args
是用来修改或覆盖CMD
的参数的,如果没有command
,那么args
将没有效果。在实际应用中,应该总是至少指定一个command
。
-
如果同时指定了
command
和args
:Kubernetes将忽略容器镜像中的ENTRYPOINT
和CMD
,执行指定的command
,并将args
作为参数传递给这个命令。
-
1.5.5 环境变量
[root@K8s-master ~]# vim pod-env.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-env namespace: test spec: containers: - name: nginx image: nginx:1.17.1 - name: busybox image: busybox command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo$(date +%T) >> /tmp/hello.txt; sleep 3; done;"] env: - name: "username" value: "kxy" - name: "passwd" value: "123" [root@K8s-master ~]# kubectl apply -f pod-env.yaml pod/pod-env created [root@K8s-master ~]# kubectl get pod pod-env -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-env 2/2 Running 0 4m45s 10.244.1.4 k8s-node-01 <none> <none> [root@K8s-master ~]# kubectl exec pod-env -n test -it -c busybox /bin/sh / # echo $username kxy / # echo $password 123
1.5.6 端口设置
Pod的端口设置是通过Pod定义中的spec.containers.ports
字段来配置的。这个字段允许你指定容器需要监听的端口,以及如何将这些端口暴露给外部或集群内部的其他服务。
以下是一些基本的端口设置选项:
-
容器端口(Container Port):这是容器内部监听的端口,必须被指定。
-
主机端口(Host Port):这是Pod所在节点上的端口,如果不设置,将随机分配一个端口。
-
协议(Protocol):可以是
TCP
或UDP
,如果不指定,默认为TCP
。 -
名称(Name):端口的名称,用于服务发现和识别。
[root@K8s-master ~]# kubectl explain pod.spec.containers.ports KIND: Pod VERSION: v1 RESOURCE: ports <[]Object> # 数组,代表Pod可以有多个端口配置 FIELDS: name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的 containerPort <integer> # 容器要监听的端口,取值范围从1到15535(0<x<15531) hostPort <integer> # 容器要在主机上公开的端口,如果设置,将限制该宿主机上只能运行一个Pod副本(一般省略) hostIP <string> # 要将外部端口绑定到的主机IP地址(一般省略) protocol <string> # 端口协议,必须是UDP、TCP或SCTP,默认为“TCP”。
-
测试案例
[root@K8s-master ~]# vim pod-port.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-port namespace: test spec: containers: - name: nginx image: nginx:1.17.1 ports: - name: nginx-port containerPort: 80 protocol: TCP - name: busybox image: busybox command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo$(date +%T) >> /tmp/hello.txt; sleep 3; done;"] env: - name: "username" value: "kxy" - name: "passwd" value: "123" [root@K8s-master ~]# kubectl apply -f pod-port.yaml pod/pod-port created [root@K8s-master ~]# kubectl get pod pod-port -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-port 2/2 Running 0 12s 10.244.2.4 k8s-node-02 <none> [root@K8s-master ~]# kubectl exec pod-port -n test -it -c nginx /bin/sh # cd /usr/share/nginx/html # echo "This is K8s-test" > index.html [root@K8s-master ~]# curl 10.244.2.4 #访问测试 This is K8s-test
1.5.7 资源配额
容器中的程序要运行,肯定是要占用一定资源的,比如cpu和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes提供了对内存和cpu的资源进行配额的机制,这种机制主要通过resources选项实现,他有两个子选项:
-
requests (资源请求)
-
CPU请求:指定了容器启动时所需的最小CPU资源量。Kubernetes保证每个容器至少获得其请求的CPU资源量。
-
内存请求:指定了容器启动时所需的最小内存资源量。Kubernetes保证每个容器至少获得其请求的内存资源量。
-
如果一个容器的资源请求超过了节点上可用的资源量,那么该容器将不会启动,直到有足够的资源为止。
-
limits (资源限制)
-
CPU限制:指定了容器能够使用的最大CPU资源量。如果容器尝试超过这个限制,Kubernetes将通过终止该容器来强制执行这个限制。
-
内存限制:指定了容器能够使用的最大内存资源量。如果容器尝试超过这个限制,Kubernetes将通过终止该容器来强制执行这个限制。
-
如果容器的资源使用量超过了其limits
设置的值,Kubernetes将根据默认的终止策略(通常是Always
)来终止该容器。如果设置了适当的终止策略,如OnFailure
,容器可能会被重启。
-
配置
[root@K8s-master ~]# kubectl apply -f pod-resources.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-resources namespace: test spec: containers: - name: nginx image: nginx:1.17.1 ports: - name: nginx-port containerPort: 80 protocol: TCP resources: limits: cpu: "2" memory: "2Gi" requests: cpu: "1" memory: "1Gi" pod/pod-resources created [root@K8s-master ~]# kubectl get pod pod-resources -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-resources 1/1 Running 0 31s 10.244.1.5 k8s-node-01 <none> <none>
-
如果下限过高
[root@K8s-master ~]# kubectl delete pod pod-resources -n test pod "pod-resources" deleted [root@K8s-master ~]# vim pod-resources.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-resources namespace: test spec: containers: - name: nginx image: nginx:1.17.1 ports: - name: nginx-port containerPort: 80 protocol: TCP resources: limits: cpu: "2" memory: "20Gi" requests: cpu: "1" memory: "15Gi" [root@K8s-master ~]# kubectl apply -f pod-resources.yaml pod/pod-resources created [root@K8s-master ~]# kubectl get pod pod-resources -n test -o wide #无法启动 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-resources 0/1 Pending 0 1s <none> <none> <none> <none> [root@K8s-master ~]# kubectl describe pod pod-resources -n test Warning FailedScheduling 15s default-scheduler 0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }, 3 Insufficient memory. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod.
-
0/3 nodes are available: 这表示调度器在集群中找不到合适的节点来放置Pod。调度器查看了3个节点,但都没有满足条件。
-
1 node(s) had untolerated taint: 有一个节点由于存在Pod所不能容忍的污点(taint)而无法被使用。
-
3 Insufficient memory: 另外两个节点虽然没有污点,但由于内存不足,无法满足Pod的内存请求(
requests
)。 -
preemption: 0/3 nodes are available: 调度器还考虑了抢占(preemption),即尝试通过终止一个或多个低优先级的Pod来为当前高优先级的Pod腾出空间。但在这个案例中,抢占是不可行的,因为没有节点可以进行抢占。
-
2 No preemption victims found for incoming pod: 调度器在所有节点上都没有找到合适的抢占受害者(即可以被驱逐的低优先级Pod)。