K8S node亲和与反亲和:nodeSelector应用
k8s-节点标签:nodeSelector实践应用
节点标签的作用:
k8s作为一个集群,每个pod都是随机调度到节点运行的,而不同的服务对资源的需求不同,比如mysql,elasticesarch等服务的pod对磁盘I/O要求比较高,这样的服务我们可以把它们手动调度到有ssd磁盘的服务器上运维更为合理,而不是调度到hdd磁盘节点上;
微服务对网络的要求比较高,可以把这些服务调度到网络带宽比较高的服务器运行
而K8S默认的随机调度方式显然不适用,因此基于此情况,我们可以通过人工干预,把node添加不同的标签,基于这些标签区分调度
1、查看node节点默认的标签:
k8s集群创建好后,每个节点会有一个默认的标签,其中有个labels项目有个参数hostname是每个主机的标签名称,它的角色是node节点
2、node标签使用背景:
可根据业务情况,把不同项目的业务pod分配到指定的一批服务器上运行,只要在那一批服务器打上指定的标签,并且在业务资源的yaml文件中指定这个标签即可
3、打标签(基于key=value格式)
把节点打上标签,该节点只用于project(项目)是myserver的,以后有myserver项目的pod调度的话有限调度到这个节点运行
root@master1:~# kubectl label node 172.31.7.111 project="myserver"
再查看node标签发生变化了,多了刚刚打上的标签名,pod的标签是给service筛选用的,而node的标签是给pod进行筛选用的
4、验证:
创建资源设置node标签,查验是否只会调度到对应的node节点
1、编写yaml文件
root@master1:/tmp# cat nodeSelector.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
labels:
app: myserver-tomcat-app2-deployment-label
name: myserver-tomcat-app2-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-tomcat-app2-selector
template:
metadata:
labels:
app: myserver-tomcat-app2-selector
spec:
containers:
- name: myserver-tomcat-app2-container
image: tomcat:7.0.94-alpine
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
env:
- name: "password"
value: "123456"
- name: "age"
value: "18"
resources:
limits:
cpu: 1
memory: "256Mi"
requests:
cpu: 500m
memory: "256Mi"
nodeSelector:
project: myserver
2、创建资源
root@master1:/tmp# kubectl apply -f nodeSelector.yaml
3、查看资源:如下截图可见,调度到了7.111节点上
5、删除标签
删除node标签,再查看node标签时就没有了
6、 把之前创建的资源删除,重新部署下
1、删除资源
root@master1:/tmp# kubectl delete -f nodeSelector.yaml
2、重新创建资源
root@master1:/tmp# kubectl apply -f nodeSelector.yaml
3、查看资源,显示状态是pending,因为没有node节点满足节点标签这个参数的调度条件
重新把节点打上标签就可以正常调度这个资源正常运行了
如果两个node节点,一个节点用的是ssd磁盘,一共节点用的是hdd的磁盘,当有服务对磁盘要求毕竟高的时候,也可以根据标签进一步筛选
创建yaml资源
1、在yaml文件中最后再加上一个标签
root@master1:/tmp# cat nodeSelector.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
labels:
app: myserver-tomcat-app2-deployment-label
name: myserver-tomcat-app2-deployment
namespace: myserver
spec:
replicas: 1
selector:
matchLabels:
app: myserver-tomcat-app2-selector
template:
metadata:
labels:
app: myserver-tomcat-app2-selector
spec:
containers:
- name: myserver-tomcat-app2-container
image: tomcat:7.0.94-alpine
imagePullPolicy: IfNotPresent
#imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
name: http
env:
- name: "password"
value: "123456"
- name: "age"
value: "18"
resources:
limits:
cpu: 1
memory: "256Mi"
requests:
cpu: 500m
memory: "256Mi"
nodeSelector:
project: myserver
disktype: ssd
2、创建资源
root@master1:/tmp# kubectl apply -f nodeSelector.yaml
3、查看资源 ,当节点同时符合yaml文件中定义的两个node标签时才给予调度
有的时候就是这样通过先把K8S集群的各个节点通过项目=namespace,进行第一步的划分,把一类项目的pod分配到指定的那些node上
然后再根据节点拥有的网卡,磁盘等的资源类型做进一步详细的划分
更多推荐
所有评论(0)