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>