该篇文章已经被专栏《从零开始学k8s》收录

Pod节点亲和性和常见的状态

  • Pod 节点亲和性
  • pod 节点反亲和性
  • 写在最后

Pod 节点亲和性

pod 自身的亲和性调度有两种表示形式
podaffinity:pod 和 pod 更倾向腻在一起,把相近的 pod 结合到相近的位置,比如同一区域,同一机架,这样的话 pod 和 pod 之间更好通信,比方说有两个机房,这两个机房部署的集群有 1000 台主机,那么我们希望把 nginx 和 tomcat 都部署同一个地方的 node 节点上,可以提高通信效率。

podunaffinity:pod 和 pod 更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。

第一个 pod 随机选则一个节点,做为评判后续的 pod 能否到达这个 pod 所在的节点上的运行方式,这就称为 pod 亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的。我们在定义 pod 亲和性时需要有一个前提,哪些 pod 在同一个位置,哪些 pod 不在同一个位置,这个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置,或者其他方式。

[root@k8smaster ~]# kubectl explain pods.spec.affinity.podAffinity
KIND:     Pod
VERSION:  v1RESOURCE: podAffinity <Object>DESCRIPTION:Describes pod affinity scheduling rules (e.g. co-locate this pod in thesame node, zone, etc. as some other pod(s)).Pod affinity is a group of inter pod affinity scheduling rules.FIELDS:preferredDuringSchedulingIgnoredDuringExecution    <[]Object>            #软亲和性requiredDuringSchedulingIgnoredDuringExecution <[]Object>            #硬亲和性[root@k8smaster ~]# kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
KIND:     Pod
VERSION:  v1RESOURCE: requiredDuringSchedulingIgnoredDuringExecution <[]Object>DESCRIPTION:If the affinity requirements specified by this field are not met atscheduling time, the pod will not be scheduled onto the node. If theaffinity requirements specified by this field cease to be met at some pointduring pod execution (e.g. due to a pod label update), the system may ormay not try to eventually evict the pod from its node. When there aremultiple elements, the lists of nodes corresponding to each podAffinityTermare intersected, i.e. all terms must be satisfied.Defines a set of pods (namely those matching the labelSelector relative tothe given namespace(s)) that this pod should be co-located (affinity) ornot co-located (anti-affinity) with, where co-located is defined as runningon a node whose value of the label with key <topologyKey> matches that ofany node on which a pod of the set of pods is runningFIELDS:labelSelector  <Object>  #我们要判断 pod 跟别的 pod 亲和,跟哪个 pod 亲和,需要靠 labelSelector,通过 labelSelector选则一组能作为亲和对象的 pod 资源namespaces   <[]string>    #labelSelector 需要选则一组资源,那么这组资源是在哪个名称空间中呢,通过 namespace 指定,如果不指定 namespaces,那么就是当前创建 pod 的名称空间topologyKey <string> -required-               #位置拓扑的键,这个是必须字段 怎么判断是不是同一个位置
rack=rack1
row=row1
使用 rack 的键是同一个位置
使用 row 的键是同一个位置[root@k8smaster ~]# kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution.labelSelector
KIND:     Pod
VERSION:  v1RESOURCE: labelSelector <Object>DESCRIPTION:A label query over a set of resources, in this case pods.A label selector is a label query over a set of resources. The result ofmatchLabels and matchExpressions are ANDed. An empty label selector matchesall objects. A null label selector matches no objects.FIELDS:matchExpressions <[]Object>matchLabels <map[string]string>例:pod 节点亲和性
#定义两个 pod,第一个 pod 做为基准,第二个 pod 跟着它走
[root@k8smaster ~]# kubectl delete pods pod-first
pod "pod-first" deleted
[root@k8smaster ~]# vim pod-required-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app2: myapp2tier: frontend
spec:containers:- name: myappimage: nginx
---
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]                affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app2, operator: In, values: ["myapp2"]}topologyKey: kubernetes.io/hostname

busybox如果不写sleep会自动关闭,sleep是等待多长时间。然后下面就是pod亲和性,硬亲和性,然后通过label(标签选择器选择),之前我们也通过帮助文档看过了选择器里面的字段(也可以深入看match里面有啥)

下面的key意思是选择app2=myapp2的标签做亲和性,如果不写第二个pod会找不到和哪个做亲和性。

最后一行可以直接用nodes里的已有标签来位置拓扑的键。kubectl get nodes --show-labels查看标签。

kubernetes.io/hostname标签对应的是具体的k8snode节点名,如果frist调度到node2或者node1,第二个pod也跟着调度到哪个节点(根据主机名做位置)

#上面表示创建的 pod 必须与拥有 app2=myapp2 标签的 pod 在一个节点上
[root@k8smaster ~]# kubectl apply -f pod-required-affinity-demo.yaml
pod/pod-first created
pod/pod-second created[root@k8smaster ~]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE
pod-first                     1/1     Running   0          26s     10.244.1.21   k8snode2   <none>
pod-second                    1/1     Running   0          26s     10.244.1.22   k8snode2   <none>           #上面说明第一个 pod 调度到哪,第二个 pod 也调度到哪,这就是 pod 节点亲和性
[root@k8smaster ~]# kubectl delete -f pod-required-affinity-demo.yaml
pod "pod-first" deleted
pod "pod-second" deleted

pod 节点反亲和性

定义两个 pod,第一个 pod 做为基准,第二个 pod 跟它调度节点相反 同样基于node名字作为基准
[root@k8smaster ~]# vim pod-required-anti-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app1: myapp1tier: frontend
spec:containers:- name: myappimage: nginx
---
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app1, operator: In, values: ["myapp1"]}topologyKey: kubernetes.io/hostname
[root@k8smaster ~]# kubectl apply -f pod-required-anti-affinity-demo.yaml
pod/pod-first created
pod/pod-second created
[root@k8smaster ~]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE
pod-first                     1/1     Running   0          21s     10.244.1.23   k8snode2   <none>
pod-second                    1/1     Running   0          21s     10.244.2.20   k8snode    <none>          #两个 pod 不在一个 node 节点上,这就是 pod 节点反亲和性
[root@k8smaster ~]# kubectl delete -f pod-required-anti-affinity-demo.yaml
pod "pod-first" deleted
pod "pod-second" deleted#例3:换一个 topologykey
[root@k8smaster ~]# kubectl label nodes k8snode zone=foo --overwrite
node/k8snode not labeled
[root@k8smaster ~]# kubectl label nodes k8snode2 zone=foo --overwrite
node/k8snode2 labeled
#然后去pp node 和当前目录下都删除掉k8s的pod。
[root@k8smaster pp]# kubectl delete -f .
resourcequota "mem-cpu-quota" deleted
pod "pod-test" deleted[root@k8smaster node]# kubectl delete -f .
pod "demo-pod-1" deleted
pod "demo-pod" deleted
pod "pod-node-affinity-demo-2" deleted
pod "pod-node-affinity-demo" deleted[root@k8smaster node]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE[root@k8smaster node]# vim pod-first-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app3: myapp3tier: frontend
spec:containers:- name: myappimage: nginx[root@k8smaster node]# vim pod-second-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app3, operator: In, values: ["myapp3"]}topologyKey: zone#如果写在一起,可能启动顺序会有错误,比如第二个pod先启动。不管pod调度到哪个节点,都都是以zone标签作为位置。
[root@k8smaster node]# kubectl apply -f pod-first-required-anti-affinity-demo-1.yaml
pod/pod-first created
[root@k8smaster node]# kubectl apply -f pod-second-required-anti-affinity-demo-1.yaml
pod/pod-second created[root@k8smaster node]# kubectl get pods -o wide
NAME                          READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE
pod-first                     1/1     Running   0          21s     10.244.1.23   k8snode2   <none>
pod-second                    0/1     pending   0          21s     <none>        <none>     <none>

第二个节点现是 pending,因为两个节点是同一个位置(因为配置了一样的zone标签,如果pod1调度到有zone标签的node上,那么第二个pod就永远不会调度到有zone标签的node上,因为我们要求的是反亲和性)现在没有不是同一个位置的了,所以就会处于 pending 状态,如果在反亲和性这个位置把 required 改成 preferred,那么也会运行。

podaffinity:pod 节点亲和性,pod 倾向于哪个 pod
nodeaffinity:node 节点亲和性,pod 倾向于哪个 node

写在最后

创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!
目前正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~

【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性相关推荐

  1. 【云原生 | 从零开始学Kubernetes】十二、k8spod的生命周期与容器钩子

    该篇文章已经被专栏<从零开始学k8s>收录 上一篇文章:k8s污点.容忍度和pod状态 点击跳转 pod生命周期 Init 容器 主容器 容器钩子 创建 pod 需要经过哪些阶段? Pod ...

  2. 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset

    该篇文章已经被专栏<从零开始学k8s>收录 上一篇文章:kubernetes持久化存储下 点击跳转 Statefulset Statefulset 控制器:概念.原理解读 有状态服务? 无 ...

  3. 【云原生 | 从零开始学Kubernetes】二、使用kubeadm搭建K8S集群

    这里写目录标题 安装要求 准备环境 初始化 安装Docker/kubeadm/kubelet 添加kubernetes软件源 三台机子 安装kubeadm,kubelet和kubectl 部署Kube ...

  4. 【云原生 | 从零开始学Kubernetes】二十七、配置管理中心Secret和rbac授权

    该篇文章已经被专栏<从零开始学k8s>收录 上一篇文章:kubectl深入理解 点击跳转 配置管理与rbac 配置管理中心 Secret Secret 是什么? 使用 Secret k8s ...

  5. 【云原生 | 从零开始学Docker】七丶实战提交自己的镜像以及docker网络

    该篇文章已经被专栏<从零开始学docker>收录 实战以及网络 实战测试 制作自己的tomcat 1.准备镜像文件(tomcat的压缩包,jdk的压缩包) 2.编写dockerfile文件 ...

  6. 【云原生 | 从零开始学Docker】一、Docker的安装,启动以及工作原理

    [从零开始学Docker]安装篇 一丶Docker浅谈 1.1Docker为什么出现 1.2Docker能干吗 二.Docker的安装 2.1 Docker的组成 2.2 安装前提 2.3 安装步骤 ...

  7. 【云原生 | 从零开始学Docker】二、Docker的常用指令学习以及使用

    该篇文章已经被专栏<从零开始学docker>收录 Docker常用命令使用 一.如何去学习命令 二.镜像常用命令 2.1查看本地所有镜像 2.2 搜索镜像 2.3下载镜像 2.4 删除镜像 ...

  8. 【云原生 | 从零开始学istio】五、istio灰度发布以及核心资源

    istio灰度发布 接着上一章部署bookinfo 通过 Istio 实现灰度发布 什么是灰度发布? 使用 istio 进行灰度发布 istio 核心资源解读 Gateway VirtualServi ...

  9. 【云原生 | 从零开始学Docker】六、如何写出自己的镜像——Docker file

    该篇文章已经被专栏<从零开始学docker>收录 Docker file 数据卷容器 mysql数据共享 结论 Docker File Docker File的介绍 构建步骤 Docker ...

最新文章

  1. 整个html和内部html,什么是HTML?
  2. Go语言 goroutine
  3. EhLib控件在windows 2003 中delphi 安装问题解决办法
  4. supervisord安装使用简记
  5. python审批流系统_有赞移动关于权限与审批流程的标准化
  6. Spring Framework,ioc容器(转)
  7. delphi2006语言新特性:Record类型高级用法
  8. win10计算机丢失msvcr,Win10系统打开软件提示丢失msvcr110.dll如何解决
  9. zepto部分报错及解决方案
  10. eclipse java环境配置_Eclipse怎么配置运行环境?
  11. 强东变法——京东能否逢凶化吉?
  12. Django开发教程 第一节 HelloWorld
  13. 包引入中,在包名前使用下划线“_”
  14. 数据挖掘-贡献度分析
  15. 宽高不定div水平、垂直居中
  16. unixODBC中 column .... does not exist 的解决过程
  17. 【深入理解JVM】:HotSpot垃圾收集器
  18. 2020 NOC 编程猫创新编程全国决赛小学组第一部分(客观题)
  19. 推荐两个免费绘图工具
  20. jquery 滚动特效

热门文章

  1. Servlet的执行原理
  2. SPI—读写串行FLASH(时序中的无关项)
  3. 初学者怎么记‘A‘,‘a‘,空格的ascii码?
  4. 大半夜睡不着,聊一下在小外包公司工作一年后的感想吧
  5. 关于如何将代码上传到gitee仓库的详细步骤
  6. 简单计算器(C 语言实现)
  7. 不会查看GIT版本历史?快收藏这个工具
  8. ubuntu下复制文件到另一个文件夹下权限不够问题解决方法
  9. VayoPro-SMT Expert|一分钟搞定拼板
  10. Linux系统管理常用知识点总结(6-11章)