一、Topology概述
### --- Topology说明
~~~ # TopologyKey:
~~~ kubernetes.io/hostname
~~~ # topologykey:
~~~ 拓扑域,首先说明不同的可以不同的value是属于不同的拓扑域
~~~ topologykey的值代表一个拓扑域,
~~~ 拓扑域就是根据这个kubernetes.io/hostname key来区分的
~~~ 这个key就是在node节点大的label,
~~~ 所以说label的可以和values不一样,它就属于不同的拓扑域
二、查看宿主机创建的label
### --- 查看宿主机创建的label
~~~ k8s安装完成之后,就会给每个节点打一个label;它的key名是一样的: kubernetes.io/hostname;
~~~ 但是它的values的值是不一样的k8s-master02;可以理解为每个节点都是属于不同的拓扑域的。
[root@k8s-master01 ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master01 Ready <none> 22d v1.20.0 another-node-label-key=another-node-label-value,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master01,kubernetes.io/os=linux,node.kubernetes.io/node=
k8s-master02 Ready <none> 22d v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master02,kubernetes.io/os=linux,node.kubernetes.io/node=
k8s-master03 Ready <none> 22d v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master03,kubernetes.io/os=linux,node.kubernetes.io/node=
k8s-node01 Ready <none> 22d v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,node.kubernetes.io/node=,test.gt=20
k8s-node02 Ready <none> 22d v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,node.kubernetes.io/node=,region=subnet7,test.gt=10
三、节点亲和力拓扑域说明
### --- 节点亲和力拓扑域说明
~~~ # 模块一:为模块二说明准备资料
~~~ topologyKey:kubernetes.io/hostname
~~~ topologyKey:拓扑域,首先说明一点不同的可以不同的value是属于不同的拓扑域
podAntiAffinity: // 反亲和力就是这个名字不一样,中间多了个Anti字段
requiredDuringSchedulingIgnoredDuringExecution: // 互斥的方式部署,第二种:软互斥。
- labelSelector:
matchExpressions:
- key: k8s-app
operator: In
values:
- calico-kube-controllers
namespaces:
- kube-system
topologyKey:/kubernetes.io/hostname
### --- 如果写了namespace是的字段,但是留空,它是匹配所有namespace下的指定label的Pod
namespace:
空行 // 若是写了namespace,但是namespace的值为空,什么也不写的情况下
### --- 如果写了namespace并且指定了值,就是匹配指定namespace下的指定label的pod
namespace:
- kube-system // 若是写了- kube-system,就是匹配,key:值下的values:下的这个容器
### --- 若果没有写namespace,那么就是匹配当前namespace
### --- 模块二:节点亲和力解释说明:
~~~ kube-system下的k8s-app等于calico-kube-controllers的值部署到了k8s-master03这个节点上的
~~~ k8s-master03上是有这个label的kubernetes.io/hostname=k8s-master03
kube-system——>k8s-app=calico-kube-controllers
~~~ 又因为master03的这个labelkubernetes.io/hostname=k8s-master03算一个拓扑域,
~~~ 所以说在这个拓扑域里面我们这个容器需要和key:k8s-app;
~~~ values:calico-kube-controllers符合这个标签的pod部署在一块,也就是同一个拓扑域中
~~~ 因为这个拓扑域的值是唯一的,不管你这个容器不管你创建多少个节点,
~~~ 它都是会部署在k8s-master03上面
[root@k8s-master01 ~]# kubectl get node --show-labels
k8s-master03 Ready <none> 22d v1.20.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ds=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master03,kubernetes.io/os=linux,node.kubernetes.io/node=
四、拓扑域说明:
### --- 拓扑域说明
~~~ 比如说这个拓扑域的key是按照主机名来区分的,
~~~ 在亲和力配置中,配置了拓扑域的概念,
~~~ 这个拓扑域的key是这个/kubernetes.io/hostname,是按照这个key来划分的拓扑域
~~~ 又因为它的key是这个值,只有key和value是同样的值,才属于同一个拓扑域,
~~~ 但是又因为每一个主机名不可能是不一样的,相当于每一个节点,介绍现在有5个节点。
~~~ 它的key是一样的,values是它的主机名,所以说它的拓扑域是不一样的。
~~~ 所以说在这里面部署了拓扑域之后呢?它就会部署在同一个拓扑域下。
### --- 拓扑域怎么去划分:根据自己的需求去定义
~~~ 按照区域划分
~~~ 按照城市去划分
~~~ 按照主机名去划分
~~~ 按照机柜去划分
~~~ 按照机柜去划分