Kubernetes Pod的常见调度方式

在Kubernetes(K8s)中,Pod是容器的载体,主要有以下几种常见的调度方式:

1. Deployment或RC(ReplicationController)

  • 作用:自动部署一个容器应用的多个副本,并持续监控和管理副本数量,确保在集群内始终维持用户指定的副本数量。
  • 示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80

    解释

    • apiVersion: apps/v1:表示Deployment的API版本。
    • kind: Deployment:资源类型是Deployment。
    • metadata:定义Deployment的元数据。

      • name: nginx-deployment:指定Deployment的名称。
    • spec:定义Deployment的规格。

      • replicas: 3:指定Pod的副本数量为3。
      • selector:选择器,用于匹配Pod的标签。

        • matchLabels:匹配标签。

          • app: nginx:标签键值对。
      • template:Pod的模板。

        • metadata:定义Pod的元数据。

          • labels:Pod的标签。

            • app: nginx:标签键值对。
        • spec:定义Pod的规格。

          • containers:容器列表。

            • name: nginx:容器名称。
            • image: nginx:1.14.2:容器镜像。
            • ports:容器端口。

              • containerPort: 80:容器端口号。

2. NodeSelector

  • 作用:通过Node的标签和Pod的nodeSelector属性相匹配,将Pod调度到特定的Node上。
  • 示例

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

    解释

    • apiVersion: v1:表示Pod的API版本。
    • kind: Pod:资源类型是Pod。
    • metadata:定义Pod的元数据。

      • name: nginx-pod:指定Pod的名称。
    • spec:定义Pod的规格。

      • containers:容器列表。

        • name: nginx:容器名称。
        • image: nginx:容器镜像。
      • nodeSelector:节点选择器。

        • disktype: ssd:匹配节点标签disktype=ssd

3. NodeAffinity

  • 作用:亲和性调度机制,通过亲和性规则将Pod调度到符合条件的Node上。
  • 示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx

    解释

    • apiVersion: v1:表示Pod的API版本。
    • kind: Pod:资源类型是Pod。
    • metadata:定义Pod的元数据。

      • name: nginx-pod:指定Pod的名称。
    • spec:定义Pod的规格。

      • affinity:亲和性。

        • nodeAffinity:节点亲和性。

          • requiredDuringSchedulingIgnoredDuringExecution:必须规则,在调度时必须满足。

            • nodeSelectorTerms:节点选择条件。

              • matchExpressions:匹配表达式。

                • key: disktype:标签键。
                • operator: In:操作符。
                • values:标签值列表。

                  • ssd:标签值。
      • containers:容器列表。

        • name: nginx:容器名称。
        • image: nginx:容器镜像。

4. Taints和Tolerations

  • 作用:通过Taint使Node拒绝特定Pod的运行,通过Toleration使Pod可以容忍特定的Taint。
  • 示例

    Node设置Taint

    kubectl taint nodes node1 key=value:NoSchedule

    Pod设置Toleration

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
    spec:
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"
      containers:
      - name: nginx
        image: nginx

    解释

    • kubectl taint nodes node1 key=value:NoSchedule:给节点node1添加Taint,键为key,值为value,效果为NoSchedule,表示不调度Pod到该节点。
    • apiVersion: v1:表示Pod的API版本。
    • kind: Pod:资源类型是Pod。
    • metadata:定义Pod的元数据。

      • name: nginx-pod:指定Pod的名称。
    • spec:定义Pod的规格。

      • tolerations:容忍规则列表。

        • key: "key":Taint的键。
        • operator: "Equal":操作符,表示等于。
        • value: "value":Taint的值。
        • effect: "NoSchedule":效果,表示允许调度到带有该Taint的节点。
      • containers:容器列表。

        • name: nginx:容器名称。
        • image: nginx:容器镜像。

以上四种调度方式在Kubernetes中广泛使用,可以满足不同场景下Pod的调度需求。Deployment和RC主要用于管理Pod的副本数量;NodeSelector和NodeAffinity用于将Pod调度到特定的Node上;Taints和Tolerations则用于控制Pod能否在特定的Node上运行。通过合理配置这些调度策略,可以实现高效的资源利用和负载均衡。

本文由mdnice多平台发布


逼格高的汤圆
10 声望2 粉丝