Kubernetes 亲和性调度
一般情况下我们部署的 Pod 是通过集群的自动调度策略来选择节点的,默认情况下调度器考虑的是资源足够,并且负载尽量平均,但是有的时候我们需要能够更加细粒度的去控制 Pod 的调度,比如我们内部的一些服务gitlab 之类的也是跑在Kubernetes 集群上的,我们就不希望对外的一些服务和内部的服务跑在同一个节点上了,害怕内部服务对外部的服务产生影响;但是有的时候我们的服务之间交流比较频繁,又希望能够将这两个服务的 Pod 调度到同一个的节点上。这就需要用到 Kubernetes 里面的一个概念:亲和性和反亲和性。
亲和性又分成节点亲和性( nodeAffinity )和 Pod 亲和性( podAffinity )。
nodeSelector
在了解亲和性之前,我们先来了解一个非常常用的调度方式:nodeSelector。我们知道label 是kubernetes 中一个非常重要的概念,用户可以非常灵活的利用 label 来管理集群中的资源,比如最常见的一个就是 service 通过匹配 label 去匹配 Pod 资源,而 Pod 的调度也可以根据节点的 label 来进行调度。
可以通过下面的命令查看我们的 node 的 label:
[root@master ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node1 Ready <none> 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2 Ready <none> 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
现在我们先给节点node02增加一个com=kcc的标签,命令如下:
添加标签
[root@master ~]# kubectl label nodes node2 com=kcc
node/node2 labeled
删除标签
[root@master ~]# kubectl label node node2 com-
node/node2 labeled
我们可以通过上面的–show-labels 参数可以查看上述标签是否生效。当node 被打上了相关标签后,在调度的时候就可以使用这些标签了,只需要在 Pod 的spec字段中添加 nodeSelector 字段,里面是我们需要被调度的节点的 label 即可。比如,下面的 Pod 我们要强制调度到 node02 这个节点上去,我们就可以使用 nodeSelector 来表示了:(node-selector-demo.yaml)
[root@master ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node1 Ready <none> 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2 Ready <none> 23d v1.18.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,com=kcc,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
apiVersion: v1
kind: Pod
metadata:
name: node-scheduler
spec:
nodeSelector:
com: kcc
containers:
- name: busybox
image: busybox
command: ["sh","-c","sleep 3600"]
[root@master ~]# kubectl get pods -o wide -w| grep node-scheduler
node-scheduler 0/1 ContainerCreating 0 42s <none> node2 <none> <none>
node-scheduler 1/1 Running 0 2m2s 10.244.3.51 node2 <none> <none>
[root@master ~]# kubectl describe pods node-scheduler
Events:
Type Reason Age From Message
---- ---


2024

被折叠的 条评论
为什么被折叠?



