k8s:Kubernetes 亲和性、反亲和性、污点、容忍

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
  ----    ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值