K8S学习笔录 - Pod的定向调度

1,379 阅读2分钟

阅读原文

Pod定向调度配置,主要通过使用Node的Labels和Pod的nodeSelector实现。

定向调度用于需要将集群中的某些服务部署到指定的机器上。

比如对磁盘IO高的服务部署在具有高性能IO能力的机器上,对CPU要求高的服务部署在CPU强力的机器上。

K8S支持为Node绑定一组的标签,在创建Pod的时候,选择指定的标签进行部署。

如果给多个Node都定义了相同的标签,则会从满足条件的Node中通过算法选一个出来部署;如果没有符合条件的Node,则Pod无法被成功调度。

例如,将一个MYSQL服务部署在拥有SSD的机器上,具体步骤如下

为指定节点打标签

通过 kubectl label node <node-name> <key>=<value> 命令给目标Node打上标签

$ kubectl label node work-node-a disk=ssd --overwrite
node/work-node-a labeled

通过 kubectl describe node <node-name> 可以查看指定节点的Labels。可以发现Labels中已经有了 disk=ssd 的标签。

$ kubectl describe node work-node-a
Name:               work-node-a
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    disk=ssd
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=work-node-a
                    kubernetes.io/os=linux
...

创建指定部署节点的Pod

在PodSpec的结构中有个NodeSelector,用来匹配指定部署的节点标签

type PodSpec struct {
    ...
    // 节点标签选择器。通过设置该值可以让Pod部署在满足指定标签要求的节点上。
      // NodeSelector是一个简单的kv结构,对应的是Node的Labels的值
    NodeSelector map[string]string `json:"nodeSelector,omitempty"`
    ...
}

使用以下配置文件创建3个Pod副本,并都部署在标签带有 disk: ssd 的机器上

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
      nodeSelector: # Node选择器
        disk: ssd

检查创建的结果

$ kubectl get pods -o wide

NAME                     READY   STATUS    RESTARTS   AGE   IP          NODE            NOMINATED NODE   READINESS GATES
mysql-6599dbc97d-w4d9s   1/1     Running   0          10m   10.42.0.1   work-node-a   <none>           <none>
mysql-6599dbc97d-w7zw7   1/1     Running   0          10m   10.42.0.2   work-node-a   <none>           <none>
mysql-6599dbc97d-xs4vs   1/1     Running   0          10m   10.42.0.3   work-node-a   <none>           <none>