Pod基础使用

POD基本操作

1.Pod生命周期

在Kubernetes中,Pod的生命周期经历了几个重要的阶段。下面是Pod生命周期的详细介绍:

  1. Pending(待处理):

    • 调度: Pod被创建后,首先进入“Pending”状态。此时,Kubernetes的调度器(Scheduler)会选择一个合适的节点来运行Pod。
    • 资源分配: 在调度器选择了节点后,Pod仍在“Pending”状态,直到所有容器的镜像都被拉取下来,并且资源需求得到了满足。
  2. Running(运行中):

    • 初始化容器: 如果Pod定义了初始化容器(Init Containers),这些容器会在Pod的主容器之前启动。它们完成后,Pod状态会转变为“Running”。

    在Kubernetes中,Pod的生命周期包括初始化容器(Init Containers)的特殊阶段。初始化容器是用于在Pod的主容器启动之前执行一些初始化任务的容器。它们是Pod的一部分,通常用于执行一些准备工作,例如数据库迁移、配置准备、依赖检查等。以下是有关初始化容器的详细生命周期信息:

    ### 初始化容器的生命周期
    
    1. 定义阶段:
       - 在Pod的定义中,初始化容器与主容器一起列在Pod的规范(spec)中。每个初始化容器都可以有自己的镜像、命令、环境变量等配置。
    2. 创建阶段:
       - 当Pod被创建时,初始化容器会根据Pod的规范进行启动。它们按照定义的顺序逐个启动。每个初始化容器都必须成功完成后,才会启动下一个初始化容器。
    3. 启动阶段:
       - 顺序执行: 初始化容器会按照Pod规范中定义的顺序依次启动。如果一个初始化容器启动失败,Kubernetes会重试这个容器,直到成功或达到最大重试次数。
       - 完成任务: 每个初始化容器会执行其定义的任务,并且必须成功退出(以状态码0结束)。如果容器失败退出(以非零状态码结束),Kubernetes会重试,直到容器成功完成或者重试次数达到限制。
    4. 过渡到运行阶段:
       - 成功: 当所有的初始化容器成功完成其任务后,Pod会进入“Running”状态,随后主容器(Containers)才会启动。
       - 失败: 如果某个初始化容器失败并且达到重试次数限制,整个Pod会标记为失败,主容器不会启动。
    5. 终止阶段:
       - 终止: 一旦Pod的生命周期结束(无论是正常完成还是失败),初始化容器也会随之终止。Kubernetes会处理容器的清理工作,包括删除容器的日志和其他临时文件。
    
    > ### 初始化容器的特点
    >
    > - 顺序性: 初始化容器按定义顺序执行,一个初始化容器完成后,才会开始下一个初始化容器。
    > - 隔离性: 初始化容器在Pod中的主容器之前运行,它们可以有不同的镜像和配置,与主容器的环境相互隔离。
    > - 重试机制: 如果初始化容器失败,Kubernetes会根据配置的重试策略重试该容器,直到成功或者达到重试限制。
    >
    > ### 使用场景
    >
    > 初始化容器非常适用于以下场景:
    >
    > - 数据库初始化: 在应用启动之前执行数据库迁移或初始化操作。
    > - 配置检查: 检查或生成配置文件,确保主容器启动所需的环境准备好。
    > - 依赖服务检查: 确保所需的外部服务或资源在主容器启动之前可用。
    >
    > 初始化容器提供了一种在Pod启动之前执行预处理任务的灵活方式,使得Pod的主容器能够在正确的环境中运行。
    
    • 主容器启动: 所有的初始化容器成功运行后,Pod中的主容器开始启动。此时Pod处于“Running”状态。
    • 健康检查: 在“Running”状态下,Kubernetes会持续进行健康检查(Liveness Probe)和就绪检查(Readiness Probe),以确保容器正常运行并能够接受流量。
  3. Succeeded(成功):

    • 完成任务: 如果Pod中的所有容器成功完成任务并退出(对于短生命周期的Pod,如Batch Job中的Pod),Pod会转变为“Succeeded”状态。
  4. Failed(失败):

    • 任务失败: 如果Pod中的容器因故障或错误而退出,Pod将转变为“Failed”状态。这通常表示容器没有成功完成其任务。
  5. Unknown(未知):

    • 状态不确定: 如果Kubernetes无法从节点获取Pod的状态,Pod会处于“Unknown”状态。这可能是由于节点不可达或其他通信问题引起的。
  6. Terminating(终止中):

    • 终止: 当Pod被删除或终止时,Pod进入“Terminating”状态。在此状态下,Kubernetes会逐步停止Pod中的所有容器,并进行必要的清理工作。
    • Grace Period: Kubernetes会尊重Pod的终止宽限期(Grace Period),允许容器在关闭前完成它们的清理工作。终止宽限期可以通过Pod的terminationGracePeriodSeconds字段配置。

了解这些状态对于管理和调试Kubernetes中的应用非常重要。每个阶段和状态都有其特定的含义和影响,掌握它们可以帮助你更好地理解和控制Pod的行为。

2.Pod的探针

Kubernetes中的Pod探针用于检测容器的健康状态和就绪状态。主要有三种探针:

  1. Liveness Probe(存活探针): 检查容器是否正常运行。如果探针失败,Kubernetes会重启容器。适用于检测容器是否陷入了死循环或挂起状态。
  2. Readiness Probe(就绪探针): 确定容器是否准备好接受流量。探针失败会导致Pod从服务的负载均衡池中移除,直到容器恢复就绪状态。
  3. Startup Probe(启动探针): 检测容器是否已启动。用于处理启动时需要较长时间的应用,避免在启动阶段被误判为不健康。

探针通常通过HTTP请求、TCP连接或执行命令来进行检查。

3.Pod的两个钩子

在Kubernetes中,Pod的两个钩子是:

  1. 生命周期钩子(Lifecycle Hooks):

    • postStart: 在容器启动后立即执行的钩子。适用于需要在容器启动后执行某些任务的场景,例如初始化配置或启动一些后台进程。
    • preStop: 在容器停止之前执行的钩子。适用于在容器停止之前进行清理操作或保存状态等操作。

    生命周期钩子允许在容器的生命周期中特定的时间点执行自定义的脚本或命令。它们帮助开发者在容器的启动或停止时执行必要的操作。

  2. 终止钩子(Termination Hooks):

    • 终止钩子是一个与生命周期钩子相似的概念,但在Kubernetes中并没有明确标记为“终止钩子”。而是在preStop钩子中定义了在容器停止之前要执行的操作,这也可以视为终止钩子的一部分。
3.1 配置示例

以下是如何在Pod的定义中配置postStartpreStop钩子的示例:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: example-image
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo 'Container started' > /var/log/startup.log"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Container is stopping' > /var/log/shutdown.log"]
3.2 钩子的作用
  • postStart 钩子: 用于在容器启动后执行操作,比如配置、启动服务、或者进行一些初始化工作。需要注意的是,postStart 钩子是异步执行的,并不会等待操作完成后才继续执行容器中的主应用程序。
  • preStop 钩子: 用于在容器停止之前执行清理任务,比如关闭连接、清理缓存或保存数据。preStop 钩子是同步的,Kubernetes会等待钩子完成后才会真正停止容器。

这些钩子提供了一种在容器生命周期特定阶段执行自定义操作的方式,有助于确保容器的状态管理和资源清理。

4.Pod删除过程

Pod的删除过程在Kubernetes中涉及几个关键步骤。了解这些步骤有助于更好地管理Pod的生命周期和确保应用的平稳运行。以下是Pod删除的基本流程:

Pod running–Terminating–prestop hook–SIGTRM–terminationGracePeriodSeconds–SIGKILL–Deleted

1. 发起删除请求

当你通过kubectl delete pod <pod-name>命令或通过API请求删除Pod时,Kubernetes会开始删除过程。

2. 标记Pod为终止状态

Kubernetes将Pod的状态标记为Terminating。此时,Pod仍然存在,但已经不再接受新的流量或请求。

3. 执行preStop钩子(如果有)

如果Pod配置了preStop生命周期钩子,Kubernetes会在停止容器之前执行这个钩子。preStop钩子是同步的,Kubernetes会等待钩子完成后才会继续删除容器。

4. 停止容器

一旦preStop钩子(如果有)完成,Kubernetes会向容器发送终止信号(通常是SIGTERM)。容器接收到信号后应该开始优雅地关闭。

5. 等待容器关闭

Kubernetes会等待容器在设定的terminationGracePeriodSeconds(默认30秒)内完成关闭过程。这个时间可以通过Pod的spec配置项进行调整。如果容器在规定时间内没有优雅地关闭,Kubernetes会发送强制终止信号(SIGKILL)来强制关闭容器。

6. 删除Pod

容器关闭后,Kubernetes会从集群中删除Pod对象,包括相关的所有资源(例如日志、事件记录等)。Pod的终止状态也会被更新到Terminated

7. 更新ReplicaSet或Deployment

如果Pod是由ReplicaSet或Deployment管理的,ReplicaSet或Deployment控制器会检测到Pod的删除,并根据策略创建新的Pod以维持期望的副本数。

8. 清理

如果Pod在删除之前进行了任何网络连接、挂载卷或存储的操作,Kubernetes会在Pod删除过程中清理这些资源,确保系统资源得到释放和回收。

示例

以下是一个Pod的配置示例,展示了preStop钩子的使用:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: example-image
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Cleaning up before shutdown' > /var/log/shutdown.log"]

总结

Pod删除的过程确保了应用的优雅关闭和资源的正确管理。通过了解这些步骤,你可以更好地设计和管理你的Kubernetes集群,确保高效和可靠的服务运行。

5.ReplicaSet

ReplicaSet 是 Kubernetes 中的一个控制器,用于确保指定数量的 Pod 实例始终在运行。以下是 ReplicaSet 资源的字段介绍,包括 metadataspecstatus 部分的详细说明:

5.1 metadata

  • name: (string) ReplicaSet 的名字。
  • namespace: (string) ReplicaSet 所在的命名空间。
  • labels: (map[string]string) 一组标签,用于标识和选择对象。
  • annotations: (map[string]string) 由用户定义的附加信息,用于存储任意的元数据。
  • creationTimestamp: (string) ReplicaSet 的创建时间。

5.2 spec

spec 部分定义了 ReplicaSet 的行为和期望状态。

  • replicas: (int32) 要维持的 Pod 副本数量。这个字段是可选的,如果未指定,默认值为 1。

  • selector
    (LabelSelector) 选择器,用于指定要管理的 Pod。这个字段定义了一个标签选择器,用于选择 ReplicaSet 要管理的 Pod。
    • matchLabels: (map[string]string) 一组标签键值对,用于匹配 Pod。
    • matchExpressions: ([]LabelSelectorRequirement) 用于选择 Pod 的表达式。
  • template
    (PodTemplateSpec) Pod 模板,用于创建管理的 Pod。包含以下字段:
    • metadata: (ObjectMeta) Pod 的元数据,通常包含标签和注释。

    • spec
      (PodSpec) Pod 的规范,定义了容器、卷、网络等。
      • containers: ([]Container) Pod 中的容器列表,每个容器定义了镜像、端口等。
      • volumes: ([]Volume) Pod 中的卷定义,用于存储数据。

5.3 status

status 部分描述了 ReplicaSet 的当前状态。

  • replicas: (int32) 当前 Pod 副本的数量。
  • fullyLabeledReplicas: (int32) 完全符合选择器的 Pod 数量。
  • readyReplicas: (int32) 准备就绪的 Pod 数量。
  • availableReplicas: (int32) 可用的 Pod 数量。
  • observedGeneration: (int64) 观察到的 ReplicaSet 的版本号。用于检测状态的更新。

示例输出

假设你运行 kubectl explain replicasets 命令,输出可能如下:

KIND
     ReplicaSet

VERSION
     v1

DESCRIPTION
     ReplicaSets are a set of Pods that are meant to be maintained at a
     specified number of replicas. They ensure that a given number of pods
     are running at any one time. They are the primary mechanism for scaling
     applications in Kubernetes.

FIELDS
     apiVersion      string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty"`
     kind            string `json:"kind,omitempty" yaml:"kind,omitempty"`
     metadata        ObjectMeta `json:"metadata,omitempty" yaml:"metadata,omitempty"`
     spec            ReplicaSetSpec `json:"spec,omitempty" yaml:"spec,omitempty"`
     status          ReplicaSetStatus `json:"status,omitempty" yaml:"status,omitempty"`

要查看 ReplicaSet 资源的具体字段和详细说明,你可以运行以下命令:

  • 查看 spec 部分:

    kubectl explain replicasets.spec
    
  • 查看 spec.template 部分:

    kubectl explain replicasets.spec.template
    
  • 查看 status 部分:

    kubectl explain replicasets.status
    

通过这些命令,你可以获取 ReplicaSet 资源各个字段的详细说明和用法,帮助你更好地理解和使用 Kubernetes 的 ReplicaSet 资源。

6.Pod节点选择

在 Kubernetes 中,Pod 节点选择器(Node Selector)是一种用于指定 Pod 应该调度到哪个节点的机制。通过节点选择器,您可以控制 Pod 在集群中运行的节点,确保它们在符合特定条件的节点上运行。

如何使用节点选择器

  1. 标记节点: 首先,您需要为节点添加标签。标签是由键值对组成的,例如 role=frontend

    kubectl label nodes <node-name> role=frontend
    
  2. 使用节点选择器: 在 Pod 的定义文件中,您可以使用 nodeSelector 来指定 Pod 应该调度到哪些节点。例如,如果您想让 Pod 只调度到标签为 role=frontend 的节点上,可以在 Pod 的 YAML 文件中指定节点选择器。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
        - name: my-container
          image: my-image
      nodeSelector:
        role: frontend
    

示例

以下是一个完整的 Pod 定义文件示例,其中包含节点选择器:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: example-container
      image: nginx
  nodeSelector:
    disktype: ssd

在这个例子中,Pod 将只会调度到具有 disktype=ssd 标签的节点上。

注意事项

  • 节点选择器的限制:节点选择器只能基于节点的标签来做选择,比较简单。如果需要更复杂的调度策略,可以使用 affinitytaints and tolerations
  • 节点标签:确保节点已经正确地标记了标签,否则 Pod 可能会因为找不到符合条件的节点而无法调度。
  • 多重标签匹配:如果节点有多个标签,节点选择器会匹配所有指定的标签条件。

通过合理配置节点选择器,您可以优化资源分配,提高 Pod 的性能和稳定性。

7.Pod制作查看删除标签

在 Kubernetes 中,给 Pod 打标签和删除标签的命令分别是:

7.1 制作标签

使用 kubectl label 命令为 Pod 打标签。以下是语法和示例:

kubectl label pod <pod-name> <key>=<value>
  • <pod-name>:Pod 的名称。
  • <key>:标签的键。
  • <value>:标签的值。

例如,为名为 my-pod 的 Pod 打上标签 env=production

kubectl label pod my-pod env=production

要查看 Kubernetes 中 Pod 和 Node 的标签,可以使用 kubectl 命令。以下是分别查看 Pod 和 Node 标签的命令示例:

7.2 查看 Pod 标签

查看所有 Pods 的标签

kubectl get pods --show-labels

这会列出所有 Pods 及其标签。

查看特定 Pod 的标签

kubectl describe pod <pod-name>

在输出的详细信息中,找到 “Labels” 部分以查看 Pod 的标签。

只显示特定 Pod 的标签

kubectl get pod <pod-name> --template '{{range $k, $v := .metadata.labels}}{{$k}}: {{$v}}{{"\n"}}{{end}}'

这条命令只显示指定 Pod 的标签,以键值对的形式。

查看指定标签名的pod信息

-L 选项允许你在输出表格中添加额外的标签列,以便于更直观地查看 Pods 的标签。
可以指定多个标签键,通过逗号分隔,例如:-L project,app。

kubectl get pods -L project,app

请添加图片描述

-l 选项:用于 过滤资源,根据标签选择器选择要显示的资源。

kubectl get pods -l app=myapp

请添加图片描述

7.3 查看 Node 标签

  1. 查看所有 Nodes 的标签

    kubectl get nodes --show-labels
    

    这会列出所有 Nodes 及其标签。

  2. 查看特定 Node 的标签

    kubectl describe node <node-name>
    

    在输出的详细信息中,找到 “Labels” 部分以查看 Node 的标签。

  3. 只显示特定 Node 的标签

    kubectl get node <node-name> --template '{{range $k, $v := .metadata.labels}}{{$k}}: {{$v}}{{"\n"}}{{end}}'
    

    这条命令只显示指定 Node 的标签,以键值对的形式。

示例

假设你有一个名为 my-pod 的 Pod 和一个名为 my-node 的 Node:

查看所有 Pods 的标签

kubectl get pods --show-labels

请添加图片描述

查看名为 my-pod 的 Pod 的标签

kubectl describe pod my-pod

查看所有 Nodes 的标签

kubectl get nodes --show-labels

请添加图片描述

查看名为 my-node 的 Node 的标签

kubectl describe node my-node

这些命令可以帮助你快速查看 Kubernetes 中的 Pods 和 Nodes 的标签。

查看指定标签名的node信息

kubectl get node -l nodemaster=yes

请添加图片描述

kubectl get nodes -L project

请添加图片描述

7.4 删除标签

要删除 Pod 的标签,可以使用 kubectl label 命令并将标签值设置为空。以下是语法和示例:

kubectl label pod <pod-name> <key>-
  • <pod-name>:Pod 的名称。
  • <key>:要删除的标签的键。

例如,删除名为 my-pod 的 Pod 上的 env 标签:

kubectl label pod my-pod env-

示例

假设你有一个名为 web-server 的 Pod:

  1. 打标签

    kubectl label pod web-server app=frontend
    
  2. 删除标签

    kubectl label pod web-server app-
    

执行这些命令后,Pod 的标签会根据你所指定的操作被更新或删除。

示例

指定节点

方法一:通过nodeName方式

指定调度节点
kubectl explain rs.spec.template.spec.nodeName

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      nodeName: node1
      containers:
      - name: mycontainer
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        imagePullPolicy: Never
        ports:
        - containerPort: 80

kubectl delete -f replicaset.yaml

kubectl  get pod  -o wide

请添加图片描述

请添加图片描述

方法二:通过nodeSelector方式

kubectl explain rs.spec.template.spec.nodeSelector

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 4
  selector:
    matchLabels:
      app: myapp![请添加图片描述](https://i-blog.csdnimg.cn/direct/eca856c1e3024de288da5ed1fabc8b04.png)

  template:
    metadata:
      labels:
        app: myapp
    spec:
      nodeSelector:
        nodemaster: "yes"
      containers:
      - name: mycontainer
        image: harbor.hiuiu.com/nginx/nginx:1.21.5
        imagePullPolicy: Never
        ports:
        - containerPort: 80
kubectl apply -f replicaset.yaml
kubectl get pod -o wide

请添加图片描述

追加标签

kubectl label node node1  nodemaster=yes
#给node节点node1追加node标签

请添加图片描述

删除追加标签

kubectl label node node1  nodemaster-
node/node1 unlabeled
kubectl get node --show-labels

请添加图片描述

8.node亲和性

8.1 node亲和性

Kubernetes 的节点亲和性(Node Affinity)是一种调度机制,用于控制 Pod 被调度到哪些节点上。它允许你指定 Pod 应该运行在哪些特定的节点上,基于节点的标签。

节点亲和性是节点选择的扩展,它的配置方式类似于 Pod 的调度策略,通过在 Pod 的 spec.affinity.nodeAffinity 部分进行定义。下面是一些常见的节点亲和性用法和示例:

节点亲和性的基本概念

节点亲和性定义了 Pod 对节点的选择规则。它可以是:

  • 必需亲和性(RequiredDuringSchedulingIgnoredDuringExecution):这些规则必须满足,否则 Pod 将不会被调度到节点上。它是强制性的。
  • 优先亲和性(PreferredDuringSchedulingIgnoredDuringExecution):这些规则是优先考虑的,但不是强制性的。Kubernetes 将尽量满足这些规则,但如果无法满足,也不会阻止 Pod 调度。
affinity的缩进问题: `affinity` 应该在 `spec` 下的正确位置,与 `containers` 同级。

podAffinity 的缩进问题: `podAffinity` 需要缩进正确,与 `requiredDuringSchedulingIgnoredDuringExecution` 同级。

matchExpressions 的缩进问题: `matchExpressions` 应该是 `labelSelector` 的一部分。

topologyKey 的位置: `topologyKey` 应该在 `requiredDuringSchedulingIgnoredDuringExecution` 的同级。

image配置: `image` 使用的是 Nginx 镜像,但容器名为 `mysql`,这可能是一个错误,如果这是故意的,那没有问题,但一般来说容器名应与镜像一致。

配置实列

必需亲和性

kubectl explain pods.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
	#调度器将倾向于将pods调度到满足该字段指定的亲和性表达式的节点上,但它也可能选择违背一个或多个表达式的节点。最受青睐的节点是具有最大权重和的节点,即对于每个满足所有调度要求(资源请求、调度期间的亲和性表达式等)的节点,通过迭代该字段的元素计算和,如果节点匹配相应的匹配表达式,则为和添加“权重”,具有最高权重的节点是最受青睐的。---- 是软性偏好,表示调度器会尽量但不强求将Pod调度到满足特定条件的节点上

请添加图片描述

kubectl explain pods.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo
  namespace: default
  labels:
    app: myapp
spec:
    containers:
    - name: myapp
      image: harbor.hiuiu.com/nginx/nginx:1.21.5
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: zone
              operator: In
              values:
              - ky36
              - ccc
kubectl apply -f replicaset.yaml
kubectl  get pod -o wide

请添加图片描述

请添加图片描述

优先亲和性

kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
	#如果调度时不满足该字段指定的亲和性要求,pod将不会被调度到该节点上。如果该字段指定的亲和性需求在pod执行期间的某个点停止满足(例如由于更新),系统可能会也可能不会尝试最终将pod从其节点中移除。---- 是硬性要求,表示Pod必须被调度到满足特定条件的节点上
kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution

请添加图片描述

apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo
  namespace: default
  labels:
    app: myapp
spec:
    containers:
    - name: myapp
      image: harbor.hiuiu.com/nginx/nginx:1.21.5
    affinity:
      nodeAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: zone
              operator: In
              values:
              - ky36
              - ccc
root@master:/opt/zxy# kubectl apply -f replicaset.yaml 
replicaset.apps/my-replicaset created
root@master:/opt/zxy# kubectl  get pod -o wide

请添加图片描述

亲和性类型解释

  • matchExpressions:指定节点标签的匹配规则。key 是标签的键,operator 是匹配操作(如 In, NotIn, Exists, DoesNotExist),values 是匹配的值列表。
  • matchFields:指定节点字段的匹配规则。类似于 matchExpressions,但用于匹配节点字段。

常见用法

  • 限制 Pod 只能运行在某些特定类型的节点上:例如,确保高性能的计算任务仅在具有 SSD 的节点上运行。
  • 将应用程序 Pod 调度到特定区域或数据中心:例如,确保某些服务在特定的地理区域运行以满足法规或延迟要求。

通过正确配置节点亲和性,可以有效地控制 Pod 的调度策略,从而优化资源的使用和提高集群的稳定性。

8.2 Pod亲和性

Pod亲和性用于确保Pod被调度到与其它Pod在同一个节点或相邻节点上,从而支持同一应用的Pod之间的协作

示例:

将Pod调度到与具有特定标签的Pod相同的节点上:

topologyKey:( 获取topologyKey : kubectl get nodes --show-labels )
#topologyKey是节点标签(Node Label)的键,用于标识节点在集群中的拓扑位置。通过在Pod的亲和性(Affinity)、反亲和性(Anti-Affinity)或拓扑分布约束(Topology Spread Constraints)中指定topologyKey,可以精确地控制Pod的调度位置,以满足特定的硬件或软件要求。

Pod亲和性

kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution.topologyKey
yaml1
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app2: myapp2
    tier: frontend
spec:
  containers:
  - name: myapp
    image: harbor.hiuiu.com/nginx/nginx:1.21.5

yaml2
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
  containers:
  - name: mysql
    image: harbor.hiuiu.com/nginx/nginx:1.21.5
    imagePullPolicy: IfNotPresent
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app2
            operator: In
            values:
            - myapp2
        topologyKey: kubernetes.io/hostname
        
root@master:/opt/zxy# kubectl apply -f pod1.yaml 
pod/pod-first created
root@master:/opt/zxy# kubectl apply -f pod2.yaml 
pod/pod-second created
root@master:/opt/zxy# kubectl  get pod -o wide
        

请添加图片描述

请添加图片描述

Pod 反亲和性

kubectl explain pods.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution.topologyKey
	# 他的pod应该与指定的命名空间中与labelSelector匹配的pod同处(affinity)或非同处(anti-affinity),其中co-located定义为运行在一个节点上,其标签的键topologyKey的值与所选pod运行的任何节点的值相匹配。不允许为空的拓扑键。

9.Pod 拉取镜像策略

	kubectl explain pod.spec.containers.imagePullPolicy
	##imagePullPolicy (镜像拉取策略)::
	    IfNotPresent:node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像。
	    Always:每次重建pod都会重新拉取镜像
	    Never:从不到镜像中心拉取镜像,只使用本地镜

10.Pod重启策略

kubectl explain pod.spec.restartPolicy
	restartPolicy
	 - `"Always"`      
     - `"Never"`      
     - `"OnFailure"`  

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

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

相关文章

机器视觉运动控制一体机VPLC532E在汽车胶带缠绕的开放式CNC应用

市场应用背景 在汽车线束和零配件中&#xff0c;胶带缠绕是一种常见且重要的加工工艺&#xff0c;主要用于线束/零配件的捆扎、固定、绝缘保护等应用。在缠绕头控制下&#xff0c;胶带均匀缠绕在汽车线束/零配件表面&#xff0c;完成缠绕后&#xff0c;系统自动执行切割。汽车…

【CSS】使用 CSS 自定义属性(变量)-- var()

自定义属性&#xff08;有时候也被称作CSS 变量或者级联变量&#xff09;是由 CSS 作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值&#xff08;比如&#xff1a; --main-color: black;&#xff09;&#xff0c;由 var() 函数来获取值&…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件&#xff0c;可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

安装打印机提示“打印后台程序服务没有启动”的解决方法

1、在桌面选中“我的电脑”&#xff0c;鼠标右键选择“管理”&#xff1b; 2、在“管理”窗口中&#xff0c;选取“服务和应用程序”扩展项目下的“服务”选项&#xff08;如图&#xff09;&#xff0c;在右侧出现系统服务列表中找到“Print Spooler”服务&#xff0c;双击进入…

JavaWeb基础 -- Servlet

JavaWeb基础 – Servlet 1.Servlet简介 1.1 Servlet是什么 Servlet本身是用Java编写的&#xff0c;运行在Web服务器上的应用程序&#xff0c;并作为Web浏览器和其他HTTP客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。Servlet可以收集来自网页表单输入的数据…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

【机器学习】经典CNN架构

第一章:引言 1.1 研究背景 机器学习的发展历程 机器学习作为人工智能的重要分支,其发展历程可以追溯到20世纪50年代。初期的机器学习研究主要集中在规则系统和基本的统计学习方法上。随着计算能力的提升和数据的积累,机器学习逐渐发展出更为复杂的算法和模型。20世纪80年…

7.添加购物车以及完善导航条跳转

添加购物车 一、引言二、前端2.1引入轻组件2.2为图片添加点击事件2.3创建addShoppingCart函数 三、后端四、运行效果五、导航条跳转 一、引言 在前几篇文章中&#xff0c;我们一步一步慢慢的实现了项目的建立&#xff0c;从数据库获取数据显示在页面&#xff0c;商品大图查看&…

C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签 把所有消息按顺序合并成一条信息&#xff0c;对这个信息用密钥进行签名。 签名信息通过 HTTP 头 Sign 传递&#xff0c;没有携带签名或者签名验证不通过的请求&#xff0c;将会被认为异常请求&#xff0c;并返回相应 code 码。 校验方法&#xff1a;根据 http请求…

国产3A游戏《黑神话悟空》中AI绘画技术的运用与探索

导语&#xff1a;近年来&#xff0c;我国游戏产业不断发展&#xff0c;越来越多的国产游戏开始尝试运用AI技术&#xff0c;以提升游戏品质。其中&#xff0c;国产3A游戏《黑神话悟空》便在原画设计过程中&#xff0c;巧妙地运用了AI绘画技术。本文将带你了解《黑神话悟空》如何…

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统&#xff0c;需要管理如下信息&#xff1a; 教师&#xff1a;教师编号、教师姓名&#xff1b; 项目&#xff1a;项目编号、项目名称、资助额&#xff1a; 学生&#xff1a;学生编号、学生姓名、学位&#xff0c…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出&#xff0c;在其过程中遇到了可预见的起起伏伏&#xff0c;并且蜂窝技术也开始进入另一个无线技术 Wi-Fi &#xff0c;并且已经占据的市场。私有5G网络&#xff08;即个人或公司建立自己的全设施蜂窝网络&#xff09;如今正在寻找曾经属于Wi-Fi的唯一…

AR 眼镜之-系统应用音效-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统应用音效 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;初始化 2&#xff09;播放音效 3&#xff09;释放资源 2. &#x1f4a0; 播放音效 2.1 静音不播放 2.2 获取音效默认音量 3. ⚛️ …

QTCreator学习

1.新建程序 2. 设置项目名称 3. Build System选择qmake,若选择cmake则只会产生CmakeLists文件&#xff0c;不会产生pro文件。 4.Base class选择QDialog,表示该类继承于QDialog类 5.套件选择MinGW 32bit,取消掉其他的。 6. 双击ui文件&#xff0c;拖动可添加工具。 7.点击左…

C++模拟实现priority_queue(优先级队列)

一、priority_queue的函数接口 从上图我们可以看出&#xff0c; priority_queue也是一个容器适配器&#xff0c;我们使用vector容器来模拟实现priority_queue。 namespace bit{#include<vector>#include<functional>template <class T, class Container vector…

iOS App上架审核被拒——2.3.3 - Performance - Accurate Metadata

iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata 噢&#xff0c;又被拒了… 文章目录 iOS上架审核被拒——Guideline 2.3.3 - Performance - Accurate Metadata被拒原因解决 被拒原因 大概翻译了下&#xff1a;预览图问题&#xff0c;只因某张预览图加了…

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

CSS知识点详解:display+float

display&#xff1a;浮动 1.block&#xff1a;使元素呈现为块级元素&#xff0c;可设置宽高 display: block; 特点&#xff1a;使元素呈现为块级元素&#xff0c;即该元素会以新行开始&#xff0c;占据整行的宽度&#xff0c;即使其宽度未满。 例子&#xff1a; 2.inline&a…

答题小程序的轮播图管理与接入获取展示实现

实现了答题小程序的轮播图管理&#xff0c;包括上传图片、设置轮播图、操作上下线等功能&#xff0c;可用于管理各类答题小程序的轮播图。 轮播图前端接入代码 答题小程序内使用以下代码接入轮播图&#xff1a; WXML&#xff1a; <view style"width: 100%"> …

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…