Kubernetes最小单元Pod介绍及配置

1.1 Pod介绍

  • Pod是Kubernetes中的一个基本构建块,它是一个逻辑主机,用于托管一个或多个容器。

  • Pod中的容器共享网络和存储资源,并且通常作为一个单元一起调度和管理。

  • Pod为容器提供了一个共享的环境,使得容器之间可以方便地通信和共享数据。

  • Pod还可以配置资源限制、健康检查、重启策略等,以满足不同的应用需求。

  • Pod是Kubernetes中创建和管理容器的最小和最简单的单位,是实现容器编排和自动化部署的基础。

1.2 Pod结构

image-20240508094145871

  • 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在容器退出时的重启策略,可以是AlwaysOnFailureNever

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命令的输出可能会非常多,特别是对于复杂的资源对象。你可能需要使用管道(如lessgrep)来更好地浏览输出。

1.5 Pod配置

1.5.1 Pod中容器的配置

[root@K8s-master ~]# kubectl explain pod.spec.containers
  • name (<string>): 容器的名称。在Pod内必须唯一。

  • image (<string>): 容器使用的镜像地址。这是容器运行时使用的Docker镜像。

  • imagePullPolicy (<string>): 镜像拉取策略,可以是AlwaysNeverIfNotPresent。这决定了Kubernetes在启动容器时如何处理镜像:

    • Always:不管本地是否存在镜像,总是从仓库拉取。

    • Never:假设镜像已经存在于本地,从不拉取。

    • IfNotPresent:如果本地不存在镜像,则从仓库拉取。

  • command (<[]string>): 容器的启动命令列表。如果这个字段没有被指定,那么容器将使用在镜像中定义的默认命令。

  • args (<[]string>): 容器的启动命令所需的参数列表。

  • env (<[]Object>): 容器环境变量的配置。每个环境变量是一个对象,通常包含namevalue字段。

  • ports (<[]Object>): 容器需要暴露的端口号列表。每个端口是一个对象,可能包含namecontainerPorthostPortprotocol等字段。

  • 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中容器的commandargs字段与Docker容器的ENTRYPOINTCMD指令之间的关系和行为。以下是这两者在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中commandargs的行为规则:

    • 如果commandargs都没有指定:Kubernetes将使用容器镜像中定义的ENTRYPOINTCMD

    • 如果指定了command,但没有指定args:Kubernetes将忽略容器镜像中的ENTRYPOINTCMD,直接执行指定的command

    • 如果没指定command,但指定了args:这是一个不常见的情况,因为args是用来修改或覆盖CMD的参数的,如果没有command,那么args将没有效果。在实际应用中,应该总是至少指定一个command

    • 如果同时指定了commandargs:Kubernetes将忽略容器镜像中的ENTRYPOINTCMD,执行指定的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):可以是TCPUDP,如果不指定,默认为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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android进阶之路 - 静态会员进度条

年后这个新版本加入了VIP模块&#xff0c;有幸正好由我来负责&#xff0c;可以再积累一下这方面的知识。 那段时间看了一本书&#xff0c;书中说到初级码农的特性之一就是完全集中于某些功能&#xff0c;忽略了了很多成长机会&#xff0c;所以重复性劳作带来的成长值有限&#…

基于51单片机的智能台灯proteus仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机的红外光敏检测智能台灯控制系统仿真( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a; 基于51单片机的红外检测光照检测智能台灯仿真设计 1、检测光照强度并显示在数码管上。 2、具备红外检测人体功能。 3、灯光控制模式分为自动模式…

抓取Google时被屏蔽怎么办?如何避免?

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

vue 语法2

【5】条件渲染和列表渲染 &#xff08;1&#xff09;条件渲染v-if v-else-if v-else 条件渲染根据表达式的真假值来渲染不同的元素或组件。 v-if&#xff1a;当表达式的值为真时&#xff0c;渲染该元素或组件。 v-else-if&#xff1a;当前面的 v-if 或 v-else-if 的表达式为假…

【C++】STL — vector的接口讲解 +详细模拟实现

前言: 本章我们将学习STL中另一个重要的类模板vector… vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。但是又不像数组&#xff0c;它的大小是可以动态改变的本质讲&#xff0c;vector使用动态分配数组来存储它的元素v…

智慧公厕的核心技术详解:物联网、云计算、大数据、自动化控制

公共厕所是城市的重要组成部分&#xff0c;而智慧公厕的建设和管理正成为城市发展的重要方向。智慧公厕的核心技术即是物联网、云计算、大数据和自动化控制。下面将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例项目现场实景实图实例&#xff0c;详细介…

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…

【计算机科学速成课】笔记一

文章目录 写在前面1.计算机的早期历史2.电子计算机3.布尔运算和逻辑门4.二进制5.算术逻辑单元-ALU6.寄存器和内存 写在前面 所有的一切源于这样一个网站——CS自学指南。 这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Comp…

地平线的花样年华

北京车展在这个喧闹的“五一”假期落幕了&#xff0c;它留给我们许多思考。 虽然社会面的传播焦点落在了“网红”两个字上&#xff0c;但技术的更新依然如暗流涌动&#xff0c;给这届北京车展写下注脚。整个过程前后&#xff0c;最重要和吸引了最多目光的&#xff0c;是智驾&a…

2024蓝桥杯CTF writeUP--cc

给了个网页&#xff0c;里面有加密算法&#xff0c;密钥&#xff0c;密文 使用在线解码工具 CTF最全在线工具整理_在线ctf工具-CSDN博客 将输出的密文&#xff0c;密钥&#xff0c;vi&#xff0c;加密方式一一对应

Linux变量的认识及环境变量配置详解

文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1&#xff09;配置方法一&#xff1a;~/.bashrc文件2&#xff09;配置方法二&#xff1a;~/.profile文件3&#xff09;配置方法三&#xff…

生产制造中刀具管理系统,帮助工厂不再频繁换刀

一、刀具管理的定义与重要性 刀具管理是指对生产过程中使用的各种刀具进行计划、采购、存储、分配、使用、监控、维修和报废等全过程的管理。刀具作为制造过程中的直接工具&#xff0c;其性能、质量和使用效率直接影响产品的加工精度、表面质量和生产效率。因此&#xff0c;建…

ansible—playbook的template、tags、roles模块

目录 一、template 1、简介 2、template模块实例 1.先准备一个以.j2结尾的template模板文件&#xff0c;设置引用的变量&#xff0c;ansible上要先安装httpd 2、修改主机清单文件&#xff0c;使用主机变量定义一个变量名相同而值不同的变量 3、主机添加hosts 4、编写pla…

【漏洞复现】金和OA FileDownLoad接口处存在任意文件读取漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

词袋法TFIDF

Tf-idf⽂本特征提取 TF-IDF的主要思想是&#xff1a;如果某个词或短语在⼀篇⽂章中出现的概率⾼&#xff0c;并且在其他⽂章中很少出现&#xff0c;则认为此词或者短语具有很好的类别区分能⼒&#xff0c;适合⽤来分类。TF-IDF作⽤&#xff1a;⽤以评估⼀字词对于⼀个⽂件集或…

数据结构-线性表-链表-2.3-1

设计一个递归算法&#xff0c;删除不带头结点的单链表L中所有值为x的结点。 void del(Linkllist &L&#xff0c;int x){LNode *p;if(LNULL){return;}if(L->datax){pL;LL->next;;free(p);del(L,x);}else{del(L->next,x);} } 时间复杂度为O(n)

Linux系统编程--网络编程

一、OSI网络七层模型 OSI模型将整个网络通信过程分解为七个层次&#xff0c;每个层次都为网络通信提供了特定的功能。以下是OSI模型的七个层次&#xff0c;从上到下依次是&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用软件提供网络服务&am…

盘点四种计算数组中元素值为1的个数的方法

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;使用内置函数sum和生成器表达式 五、方法四&#xff1a;使用NumPy库 六、性能比较 七、性能结果分析与讨论 八、最佳实践 九、总结 一、引言 在编程和数…

Linux:进程通信(二)信号的保存

目录 一、信号的处理是否是立即处理的&#xff1f; 二、信号如何保存 1、阻塞、未决、递达 2、信号集 3、信号集操作函数 4、sigprocmask函数 5、sigpending 函数 上篇文章我们讲解了信号的产生&#xff1a;Linux&#xff1a;进程信号&#xff08;一&#xff09;信号的产…

7天精通Web APIs——-Bom操作(理论+实战)(第五天)

一、window对象 1.1 window对象和bom的关系 首先理解dom和bom之间的关系 显然bom的范围比较大 bom的全称为浏览器对象模型 window是bom的核心对象&#xff0c;window里面有很多属性和方法&#xff0c;用于实现浏览器与 JavaScript 代码之间的交互。作为 JavaScript 的全局对…
最新文章