美文网首页
K8S之节点亲和性调度

K8S之节点亲和性调度

作者: david161 | 来源:发表于2022-03-24 08:36 被阅读0次
节点亲和性规则:

required(硬亲和性,不能商量,必须执行) 、preferred(软亲和性,可以商量,选择执行)。
1)硬亲和性规则不满足时,Pod会置于Pending状态,软亲和性规则不满足时,会选择一个不匹配的节点
2)当节点标签改变而不再符合此节点亲和性规则时,不会将Pod从该节点移出,仅对新建的Pod对象生效

节点硬亲和性

requiredDuringSchedulingIgnoredDuringExecution
1)方式一:Pod使用 spec.nodeSelector (基于等值关系);Pod使用 spec.nodeName
2)方式二:Pod使用 spec.affinity 支持matchExpressions属性 (复杂标签选择机制)

全部资源文件清单

controller
labels/mariadb.yml,删除spec.selectNode或者spec.nodeName信息。
技能点概述:Pod.sepc.affinity

affinity: 
  nodeAffinity: 
    requiredDuringSchedulingIgnoredDuringExecution: 
      nodeSelectorTerms: 
        - matchExpressions: 
            - key: kubernetes.io/hostname #node节点的标签 
              operator: In 
              values: 
                - k8s-node02 #集群真实节点名称
可以先使用命令获得节点标签及真实节点名称: 
kubectl get nodes --show-labels

键值运算关系

In:label 的值在某个列表中 
NotIn:label 的值不在某个列表中 
Gt:label 的值大于某个值 
Lt:label 的值小于某个值 
Exists:某个 label 存在 
DoesNotExist:某个 label 不存在

全部文件清单

apiVersion: apps/v1 
kind: Deployment
metadata: 
name: mariadb-deploy 
labels: 
app: mariadb-deploy 
spec: 
  replicas: 1 
  template: 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      imagePullSecrets: 
        - name: lagouharbor 
      affinity: 
        nodeAffinity: 
          requiredDuringSchedulingIgnoredDuringExecution: 
            nodeSelectorTerms: 
              - matchExpressions: 
                  - key: kubernetes.io/hostname #node节点的标签 
                    operator: In 
                    values: 
                      - k8s-node02 
            containers: 
              - name: mariadb-deploy 
                image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
                imagePullPolicy: IfNotPresent 
                ports: 
                  - containerPort: 3307 
                env:
                  - name: MYSQL_ROOT_PASSWORD 
                    #这是mysqlroot用户的密码 
                    valueFrom: 
                      secretKeyRef: 
                        key: password 
                        name: mariadbsecret 
                  - name: TZ 
                    value: Asia/Shanghai 
                args: 
                  - "--character-set-server=utf8mb4" 
                  - "--collation-server=utf8mb4_unicode_ci" 
                volumeMounts: 
                  - mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录 
                    name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
                restartPolicy: Always 
                volumes: 
                  - name: lagoumariadb 
                    configMap: 
                      name: mariadbconfigmap 
  selector: 
    matchLabels: 
      app: mariadb-deploy 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: mariadb-svc 
spec:
  selector: 
    app: mariadb-deploy
  ports: 
    - port: 3307 
      targetPort: 3307 
      nodePort: 30036
  type: NodePort

secret
labels/mariadbsecret.yml

apiVersion: v1 
kind: Secret 
metadata: 
  name: mariadbsecret 
type: Opaque 
data: 
  password: YWRtaW4=

configmap
labels/mariadb.yml

apiVersion: v1 
data: 
  my.cnf: "省略中间数据部分,请各位同学前面章节" 
kind: ConfigMap 
metadata: 
  name: mariadbconfigmap

错误节点信息
如果我们选择的节点不存在,pod状态会一直处于Pending。例如:
Pod.sepc.affinity

affinity:
  nodeAffinity: 
    requiredDuringSchedulingIgnoredDuringExecution: 
      nodeSelectorTerms: 
        - matchExpressions: 
            - key: kubernetes.io/hostname #node节点的标签 
              operator: In 
              values: 
              - k8s-node05 #集群真实节点名称
集群中不存在k8s-node05的节点。当我们部署服务时,查看pod信息,会发现pod一直处于Pending 

kubectl apply -f . 

kubectl get pods -o wide 

查看pod详细信息:发现提示没有节点的提示。 
kubectl describe pods mariadb-deploy-9d5457866-rxcr2
节点软亲和性

preferredDuringSchedulingIgnoredDuringExecution
1)柔性控制逻辑,当条件不满足时,能接受被编排于其他不符合条件的节点之上
2)权重 weight 定义优先级,1-100 值越大优先级越高

全部资源文件清单

controller
labels/mariadb.yml,删除spec.selectNode或者spec.nodeName信息。
技能点概述:Pod.sepc.affinity

affinity: 
  nodeAffinity: 
    preferredDuringSchedulingIgnoredDuringExecution: 
      - preference: 
        matchExpressions: 
          - key: kubernetes.io/hostname 
            operator: In 
            values: 
              - k8s-node02 
        weight: 1
可以先使用命令获得节点标签及真实节点名称: 
kubectl get nodes --show-labels

键值运算关系

In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值 
Lt:label 的值小于某个值 
Exists:某个 label 存在 
DoesNotExist:某个 label 不存在

全部文件清单

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: mariadb-deploy 
  labels: 
    app: mariadb-deploy 
spec: 
  replicas: 1 
  template: 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      nodeSelector: 
        mariadb: mariadb 
      imagePullSecrets: 
        - name: lagouharbor 
      affinity: 
        nodeAffinity: 
          preferredDuringSchedulingIgnoredDuringExecution: 
            - preference: 
                matchExpressions: 
                  - key: kubernetes.io/hostname 
                    operator: In 
                    values: 
                      - k8s-node02 
              weight: 1 
      containers: 
        - name: mariadb-deploy 
          image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
          imagePullPolicy: IfNotPresent 
          ports: 
            - containerPort: 3307 
          env:
            - name: MYSQL_ROOT_PASSWORD 
              #这是mysqlroot用户的密码 
              valueFrom: 
                secretKeyRef: 
                  key: password 
                  name: mariadbsecret 
            - name: TZ
              value: Asia/Shanghai 
          args: 
            - "--character-set-server=utf8mb4" 
            - "--collation-server=utf8mb4_unicode_ci" 
          volumeMounts: 
            - mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录 
              name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
      restartPolicy: Always 
      volumes: 
        - name: lagoumariadb
          configMap: 
            name: mariadbconfigmap 
  selector: 
    matchLabels: 
      app: mariadb-deploy 
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: mariadb-svc 
spec: 
  selector: 
    app: mariadb-deploy 
  ports: 
    - port: 3307 
      targetPort: 3307 
      nodePort: 30036
  type: NodePort

secret
labels/mariadbsecret.yml

apiVersion: v1 
kind: Secret 
metadata: 
  name: mariadbsecret 
type: Opaque 
data: 
  password: YWRtaW4=

configmap
labels/mariadb.yml

apiVersion: v1 
data: 
  my.cnf: "省略中间数据部分,请各位同学前面章节" 
kind: ConfigMap 
metadata: 
  name: mariadbconfigmap
错误节点信息

如果我们选择的节点不存在,pod状态会一直处于Pending。例如:
Pod.sepc.affinity

affinity: 
  nodeAffinity: 
    preferredDuringSchedulingIgnoredDuringExecution: 
      - preference: 
        matchExpressions: 
          - key: kubernetes.io/hostname 
            operator: In 
            values: 
              - k8s-node05 
        weight: 1
集群中不存在k8s-node05的节点。当我们部署服务时,查看pod信息,会发现pod一直处于Pending 

kubectl apply -f . 

kubectl get pods -o wide 

查看pod详细信息:发现提示没有节点的提示。 
kubectl describe pods mariadb-deploy-9d5457866-rxcr2

Pod资源亲和调度

Pod硬亲和调度

requiredDuringSchedulingIgnoredDuringExecution
Pod亲和性描述一个Pod与具有某特征的现存Pod运行位置的依赖关系;即需要事先存在被依赖的Pod对象

Pod软亲和调度

Pod软亲和调度用于分散同一类应用,调度至不同的区域、机架或节点等.将 spec.affinity.podAffinity 替换为 spec.affinity.podAntiAffinity 。软亲和调度也分为柔性约束和强制约束

相关文章

网友评论

      本文标题:K8S之节点亲和性调度

      本文链接:https://www.haomeiwen.com/subject/klstjrtx.html