nodeName

使Pod调度到指定节点

...
spec:
  nodeName: <k8s节点的名称>
...

hostPort

使用的是宿主的ip+端口,只可以调度一个,多余的会pending,因为端口被占用

...
spec:
  containerd:
    ports:
    - containerPort: 80 #容器内的端口
       hostPort: 8080 #对外暴露的端口
...

资源限制(resource)

资源限制

...
spec:
  containerd:
    resources:
      requests:
        memory: "64Mi" #期望
        cpu: "250m" #最大占用
      limits:
        memory: "128Mi" #期望
        cpu: "500m" #最大占用
...

资源配额(resourceQouta)

基于名称空间来进行资源限制

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-counts
  namespace: kube-public
spec:
  # 定义硬性配置
  hard:
    # 此命名空间最大创建的Pod数量
    pods: "10"
    # 此命名空间最大的创建的deploy数量
    count/deployments.apps: "3"
    # 此命名空间最大的创建的svc数量
    count/services: "3"

限制范围(LimitRange)

能够限制名称空间的cpu和内存的最大最小资源,如果Pod不再此范围里,那么会Pending

spec:
  limits:
  - max:
      cpu: "2"                  # 每个容器的最大CPU限制
      memory: "1Gi"             # 每个容器的最大内存限制
    min:
      cpu: "100m"               # 每个容器的最小CPU限制
      memory: "128Mi"           # 每个容器的最小内存限制
    default:
      cpu: "500m"               # 每个容器的默认CPU请求
      memory: "256Mi"           # 每个容器的默认内存请求
    defaultRequest:
      cpu: "200m"               # 每个容器的默认CPU请求(如果未指定)
      memory: "256Mi"           # 每个容器的默认内存请求(如果未指定)
    type: Container
  - max:
      cpu: "4"                  # 每个Pod的最大CPU限制
      memory: "2Gi"             # 每个Pod的最大内存限制
    min:
      cpu: "200m"               # 每个Pod的最小CPU限制
      memory: "256Mi"           # 每个Pod的最小内存限制
    type: Pod

污点(taint)

使节点加入污点,如果Pod不配置污点容忍则永远不会调度到该节点

# 添加一个 Taint,使节点只接受特定 Pods
kubectl taint nodes <node-name> key=value:NoSchedule

# 添加一个 Taint,允许 Pods 调度到节点,但会发出警告
kubectl taint nodes <node-name> key=value:PreferNoSchedule

# 添加一个 Taint,使节点不接受任何 Pods,除非 Pods 有相应的 Tolerations
kubectl taint nodes <node-name> key=value:NoExecute
#注意:添加污点可以不设置value,可以直接写成key=:污点类型
污点类型介绍
  NoSchedule           # 已经有的Pod不会驱逐,但不接受新的Pod
  PreferNoSchedule     # 尽量不调度到该节点,如果其他节点调度不上,那么才会调度此节点
  NoExecute            # 已经有的Pod会被驱逐,新的Pod也不接受

污点容忍(tilerasions)

某节点配置了污点,如果还想调度到该节点,那么需要配置污点容忍
例如该节点配置了kubectl taint nodes master01 taint=NoSchedule

...
spec:
  nodeName: master01
  tolerasions:
  - key: "taint"
      #Exists:只要key存在,不论值是什么,都匹配
      #Equal:为默认,表示 key和value都必须匹配。
      operator: "Exists"
      #value: "因为此污点没有值,所以可以为空"
      effect: "NoSchedule"

节点选择器(nodeSelector)

基于节点的标签关联节点,将Pod调度到包含指定标签的节点
如果指定的节点上有污点,需要配置污点容忍

给节点打标签
  - kubectl label nodes worker233 disktype=ssd
  - kubectl get nodes --show-labels | grep disktype
...
spec:
  nodeSelector:
    # 标签的key和value
    disktype: ssd
...

驱逐(drain)

将指定节点上的所有Pod(包括系统创建的Pod),全部驱逐到其他节点上
驱逐的本身就是打上污点,并标记节点为不可调度状态

kubectl drain <node-name> --ignore-daemonsets

标记不可调度(cordon)

让这个节点不可调度,不会驱逐已经存在的Pod
本质上是打了污点,并标记不可调度
如果去掉标记可以使用kubectl uncordon <node-name>

kubectl cordon <node-name>

节点亲和性(nodeAffinity)

如果一个资源清单要想选择节点标签的 KEY 一样,但互相的值不一样,则可以使用节点亲和性
假设你有一个节点带有标签 maqinghang=[test1|test2],你希望 Pod 只调度到这样的节点上:
环境准备 kubectl label nodes <nodename> maqinghang=test1; kubectl label nodes <nodename> maqinghang=test2

...
spec:
  # 亲和性配置
  affinity:
    # 节点亲和性
    nodeAffinity:
      # 硬限制表示必须满足的条件
      requiredDuringSchedulingIgnoredDuringExecution:
        # 匹配节点选择器
        nodeSelectorTerms:
          # 基于标签匹配节点
        - matchExpressions:
            # 匹配节点的标签的key
          - key: maqinghang
            # 匹配节点的标签的value
            values:
            - test1
            - test2
            # 指定key和values之间的关系,有效值为: In, NotIn, Exists, DoesNotExist. Gt, and Lt
            # 当值为In, NotIn,则必须定义values的值,不能为空。
            # 当值为Exists, DoesNotExist,则values必须为空。
            # 当值为Gt, Lt,则values的元素只能有一个且是个数字。
            operator: In
...

Pod亲和性(PodAffinity)

如果进行Pod调度的时候,第一个Pod落到了某一个节点,那么之后所有的Pod都会落到这个节点
环境准备 kubectl label nodes <nodename> dc=test1; kubectl label nodes <nodename> dc=test2;kubectl label nodes <nodename> dc=test3

...
spec:
  # 配置亲和性
  affinity:
    # Pod亲和性
    podAffinity:
      # 硬限制表示必须满足的条件
      requiredDuringSchedulingIgnoredDuringExecution:
        # 指定Pod的拓扑域,比如基于数据中心来实现调度
      - topologyKey: dc
         # 配置关联的Pod
         labelSelector:
           matchLabels:
             apps: v1
...

Pod反亲和性(podAntiAffinity)

如何一个一节被调度了第一个Pod后,那么该节点不会被调度第二个,会向其他节点调度,如果每个节点都被调度了,那么多余的会处于Pending状态
环境准备:kubectl label nodes <nodename> dc=test1; kubectl label nodes <nodename> dc=test2;kubectl label nodes <nodename> dc=test3

...
spec:
  # 配置亲和性
  affinity:
    # Pod反亲和性
    podAntiAffinity:
      # 硬限制表示必须满足的条件
      requiredDuringSchedulingIgnoredDuringExecution:
        # 指定Pod的拓扑域,比如基于数据中心来实现调度
      - topologyKey: dc
        # 配置关联的Pod
        labelSelector:
          matchLabels:
            apps: v1
...
posted on 2024-06-30 12:07  马庆航  阅读(13)  评论(0编辑  收藏  举报