kubernetes之pod調度


調度規則

deployment全自動調度: 運行在哪個節點上完全由master的scheduler經過一系列的算法計算得出, 用戶無法進行干預
nodeselector定向調度: 指定pod調度到一些node上, 通過設置node的標簽和deployment的nodeSelctor屬性相匹配
	多個node有相同標簽, scheduler 會選擇一個可用的node進行調度
	nodeselector定義的標簽匹配不上任何node上的標簽, 這個pod是無法調度
	k8s給node預定義了一些標簽, 通過kubectl describe node xxxx進行查看
	用戶可以使用k8s給node預定義的標簽
NodeAffinity: node節點親和性
	硬限制 : 必須滿足指定的規則才可以調度pod到node上
	軟限制 : 優先滿足指定規則,調度器會嘗試調度pod到node上, 但不強求
	
PodAffinity:  pod親和與互斥調度, 根據在節點上正在運行的pod標簽而不是節點的標簽進行判斷和調度
	親和: 匹配標簽兩個pod調度到同一個node上
	互斥: 匹配標簽兩個pod不能運行在同一個node上

nodeselector定向調度

  1. 給目標node打上一些標簽
kubectl label nodes  <node-name> <label-key>=<label-value>
kubectl label nodes 192.168.1.62 disk=ssd 
  1. 在pod的定義加上nodeSelector設置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80
      nodeSelector:
        disk: ssd

如果給多個node都定義了相同的標簽, 則調度器會根據調度算法從這組node中挑選一個可用的node進行pod調度
如果指定了pod的nodeSelector條件, 且集群中不存在包含響應標簽的Node, 則即使在集群中還有其它可供使用的Node,這個pod也無法被成功調度
用戶可以自行給node添加標簽, kubernetes也會給node預定義一些標簽, 可以通過kubectl describe node

Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    disk=ssd
                    kubernetes.io/hostname=192.168.1.62

uploading-image-951691.png

NodeAffinity

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: beta.kubernetes.io/arch
                  operator: In
                  values:
                  - amd64
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: disk
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80 

requiredDuringSchedulingIgnoredDuringExecution: 硬限制, 要求只運行在amd64的節點上
preferredDuringSchedulingIgnoredDuringExecution: 軟限制, 盡量運行在磁盤類型ssd的節點上

PodAffinity: pod親和性調度

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-test1
spec:
  selector:
    matchLabels:
      app: nginx-test1
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-test1
        security: s1        
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-test2
spec:
  selector:
    matchLabels:
      app: nginx-test2
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx-test2
        security: s1
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx-test1
            topologyKey: kubernetes.io/hostname     
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM