ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kubernetes 调度

2022-07-14 09:05:00  阅读:129  来源: 互联网

标签:kubernetes 调度 节点 io Pod pod


pod 分配给特定的node节点

目的:在一般业务场景,有些pod需要运行在特定的物理节点上,可以通过kubernetes的nodeSelector、nodeName安排pod到指定的节点上运行。

# 采用nodeselect节点选择器的方法:
# 为 test-nodelete-2节点打上标签。
$ kubectl label nodes test-nodelete-2 disk=ssd
node/test-nodelete-2 labeled
$ kubectl get node --show-labels 
NAME              STATUS   ROLES    AGE   VERSION   LABELS
test-nodelete-1   Ready    <none>   14d   v1.20.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-1,kubernetes.io/os=linux
test-nodelete-2   Ready    <none>   14d   v1.20.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-2,kubernetes.io/os=linux
test-nodelete-3   Ready    <none>   14d   v1.20.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=ingress,kubernetes.io/arch=amd64,kubernetes.io/hostname=test-nodelete-3,kubernetes.io/os=linux

$ cat > nodeschedule.yaml  << EOF
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-select
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disk: ssd
EOF

# 采用nodeName的方法:
# 如果不用节点选择器,直接用指定节点名,可以无视Taints,可以被调度。但会被NoExcute Taint影响, 如果节点存在NoExcute, 那将不能运行在该节点上。
$ cat  > nodeName.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-app
spec:
  nodeName: test-nodelete-2 # schedule pod to specific node
  containers:
  - name: nginx-web
    image: nginx
    imagePullPolicy: IfNotPresent
EOF

Taints(污点) and Tolerations(容忍)

目的:Taints 是允许node节点排斥一组pod。Tolerations 允许程序调度pod到具有污点的 node节点上。Tolerations 允许调度但不保证调度。taints和Tolerations一起工作,以确保 Pod 不会被调度到不合适的节点上。一个或多个taints应用于一个节点;这标志着该节点不接受任何不容忍污点的 pod。
NoSchedule: 设置为不调度到该节点
PreferNoSchedule: 设置为尽量不调度到该节点
NoExecute: 设置为不调度到该节点和驱逐原来该节点已有存量的pod

# 向节点添加污点 
$ kubectl taint nodes node1 key1=value1:NoSchedule
# 解释:在 node1上设置一个污点。污点具有键key1、值value1和污点效果NoSchedule。node1这意味着除非具有匹配的容限,否则任何 pod 都无法调度到node1节点。

# 去除节点污点
$ kubectl taint nodes node1 key1=value1:NoSchedule-

# 节点加上taints为NoSchedule,pod资源是不会调度到node1节点。
$ kubectl taint nodes node1 key1=value1:NoSchedule
$ cat > taints.yaml  << EOF
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-taints
  labels:
    env: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
EOF

# 为 pod 指定一个tolerations(容忍度)。以下两个容忍“匹配”由kubectl taint上面的行创建的污点(key1=value1:NoSchedule),因此具有容忍的 pod 都可以调度到node1节点。
$ cat > taints-and-tolerations.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-taints-tolerations
  labels:
    env: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "key1"
    value: "value1"
    operator: "Equal"
    effect: "NoSchedule"
EOF

# 当operator为Equal时,key和value都要匹配到上述taints指定的key1=value1,key和value都满足条件即可以容忍该污点,pod运行在node1节点上。
# 当operator为Exists时,key或value其中一个匹配到上述taints指定的key1=value1,满足条件即可以容忍该污点,pod运行在node1节点上。
  tolerations:
  - key: "key1"
    value: "value1"
    operator: "Equal"
    effect: "NoSchedule"

# 如果NoExecute被添加到一个节点,那么任何不容忍该 taint 的 pod 将立即被驱逐,而容忍该 taint 的 pod 将永远不会被驱逐。NoExecute效果的容忍可以指定一个可选`tolerationSeconds`字段,该字段指示在添加污点后 pod 将保持绑定到节点的时间。
$ kubectl taint nodes node1 execute=yes:NoExecute
  - key: "execute"
    value: "yes"
    effect: "NoExecute"
    # tolerationSeconds: 3600

Node Affinity

nodeSelector是将 Pod 约束到具有特定标签的节点的最简单方法。Affinity 和 anti-affinity 扩展了您可以定义的约束类型。如果同时指定nodeSelector和nodeAffinity,则必须同时满足两者才能将 Pod 调度到节点上。.

  • 亲和/反亲和语言更具表现力。nodeSelector仅选择具有所有指定标签的节点。Affinity/anti-affinity 让您可以更好地控制选择逻辑。
  • 您可以指示一条规则是soft或preferred,这样即使找不到匹配的节点,调度程序仍然会调度 Pod。
  • 您可以使用在该节点上运行的其他 Pod 上的标签来约束 Pod,而不仅仅是节点标签,这允许您定义哪些 Pod 可以在一个节点上共存的规则。

节点亲和性(Node Affinity)在概念上类似于nodeSelector,允许您根据节点标签限制您的 Pod 可以调度的节点。有两种类型的节点亲和性:

  • requiredDuringSchedulingIgnoredDuringExecution:除非满足规则,否则调度程序无法调度 Pod。此函数类似于nodeSelector,但具有更具表现力的语法。
  • preferredDuringSchedulingIgnoredDuringExecution: 调度器尝试寻找符合规则的节点。如果匹配的节点不可用,调度程序仍会继续调度 Pod运行。
    # 注意:上述类型中,IgnoredDuringExecution表示如果 Kubernetes 调度 Pod 后节点标签发生变化,则 Pod 继续运行.
$  cat > nodeAffinity.yaml << EOF
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-nodeaffinity
  labels:
    env: nodeaffinity
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "test-nodelete-3"
            operator: In
            values: 
            - "yes"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: "disk"
            operator: In
            values:
            - "ssd"
  tolerations:
  - key: "active"
    operator: "Exists"
    effect: "NoSchedule"
EOF

# requiredDuringSchedulingIgnoredDuringExecution规则解释:
# 该node节点必须具有带有键的标签为test-nodelete-3,并且该标签的值必须是:yes

# preferredDuringSchedulingIgnoredDuringExecution规则解释:
# 调度器尝试寻找带有键为disk,值为ssd的node节点。如果匹配的节点不可用,调度程序仍会继续调度 Pod运行。

# tolerations(容忍)规则解释:
# 容忍程序调度pod到具有污点(taints)node节点上, 污点键为active的node。

# operator字段指定 Kubernetes 在解释规则时使用的逻辑运算符。您可以使用In、NotIn、Exists、DoesNotExist和 Gt、Lt。NotIn和DoesNotExist允许您定义节点反亲和行为。

pod 亲和性(affinity)和pod反亲和性(antiaffinity)

pod 亲和性和反亲和性根据节点上已经运行的 Pod 的标签, 而不是根据node节点标签来限制 pod调度到节点上。
注意:Pod 亲和性和反亲和性需要大量资源处理调度,这会在大型集群中的减慢调度速度。不建议在超过数百个节点的集群中使用它。

$ cat > pod-affinity.yaml << EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-pod-affinity
spec:
  replicas: 3
  selector:
    matchLabels:
      podaffinity: app 
  template:
    metadata:
      labels:
        podaffinity: app
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: "env"
                operator: In
                values: 
                - "nginx"
            topologyKey: "kubernetes.io/hostname"
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: "app"
                  operator: In           
                  values: 
                  - "web"
              topologyKey: "kubernetes.io/hostname"
      tolerations:
      - key: "active"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 8088
EOF

# requiredDuringSchedulingIgnoredDuringExecution 亲和性规则解释:
# 当一个或多个node节点上的Pod 具有env=nginx标签, 且pod都位于同一区域或同一类服务器时,调度程序才能将 Pod 调度到节点上 。更准确地说,调度程序必须将 Pod 放置在具有 topologyKey="kubernetes.io/hostname"标签的node节点上,且该区域node节点有一个或多个node节点 的Pod 具有env=nginx标签。

# preferredDuringSchedulingIgnoredDuringExecution 反亲和性解释:
# 表示调度程序应尽量避免将 Pod 调度到一个或多个node节点上的Pod具有app=web标签的node节点上,更准确地说,具有topologyKey="kubernetes.io/hostname"标签的node节点上,调度程序必免将pod运行在该区域node节点的pod具有app=web标签的节点上。

# tolerations(容忍)规则解释:
# 容忍程序调度pod到具有污点(taints)node节点上, 污点键为active的node。


# Pod亲和性(podAffinity)规则告诉调度程序将每个副本放置在具有app=web标签的 Pod 的节点上。Pod 反亲和性(podAntiAffinity)规则告诉调度器避免调度到具有env=nginx标签的 Pod 的节点上。
$ cat > nginx-pod-affinity.yaml  << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-web
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: env
                operator: In
                values:
                - nginx
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: nginx-server
        image: nginx
EOF

参考文献

kubernetes官方文档

标签:kubernetes,调度,节点,io,Pod,pod
来源: https://www.cnblogs.com/acommoners/p/16472935.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有