目录
一、概念
NodeSelector是Kubernetes调度器的一部分,它允许开发者根据节点的标签,精确地控制Pod在集群中的调度位置。通过在Pod的定义中设置NodeSelector,可以确保Pod只会被调度到具有特定标签的节点上。
我们先创建一个普通的deploy资源,设置为10个副本,查看创建的pod;
bash
# 如果集群只有2个节点,可以将master节点也作为work节点
[root@k8s1 deploy]# kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-
# 创建deploy资源
[root@k8s1 deploy]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
#声明设置升级策略
strategy:
#设置升级的策略类型,类型有两种;
#第一种:Recreate:先停止所有pod,再批量创建新的pod;生产环境不建议使用,因为用户在此时会访问不到服务;
#第二种:RollingUpdate:滚动更新,即实现部分更新,逐渐替换掉原有的pod,也就是默认的策略;
type: RollingUpdate
#如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;
rollingUpdate:
#在原有pod副本数量的基础上,多启动pod的数量(也就是说,更新过程中同时可以存在2+副本数个pod,新旧版本一起)
maxSurge: 2
#在升级的过程中最大不可访问的pod的数量(也就是说,pod副本数-1的数量可以被访问)
maxUnavailable: 1
replicas: 10
selector:
matchLabels:
k8s: oslee
template:
metadata:
name: pod01
labels:
k8s: oslee
spec:
containers:
- name: c1
image: harbor.oslee.com/oslee-private/my-nginx:v2
ports:
- containerPort: 80
[root@k8s1 deploy]# kubectl apply -f deploy.yaml
deployment.apps/dm01 created
我们发现,其是随机创建在,k8s1和k8s2节点上的;
那么我们有没有方法,让pod根据我们自己的想法,创建在我们想要的节点上呐?
接下来,我们就学习,关于pod调度的节点选择器,nodeSelector
二、节点选择器nodeSelector的使用
通过标签让pod创建在我们想要的节点上;
使用步骤
- 给节点(k8s1、k8s2)打不同的标签
- pod中编辑节点选择(选择节点的标签)
- 创建资源
bash
# 查看节点标签
[root@k8s1 deploy]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s1 Ready control-plane,master 4d v1.23.17 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s2 Ready <none> 4d v1.23.17 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s2,kubernetes.io/os=linux
# 给节点打标签
[root@k8s1 deploy]# kubectl label node k8s1 node=k8s1 os=lee
node/k8s1 labeled
[root@k8s1 deploy]# kubectl label node k8s2 node=k8s2 os=lee
node/k8s2 labeled
bash
# 编辑deploy资源
[root@k8s1 deploy]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dm01
spec:
#声明设置升级策略
strategy:
#设置升级的策略类型,类型有两种;
#第一种:Recreate:先停止所有pod,再批量创建新的pod;生产环境不建议使用,因为用户在此时会访问不到服务;
#第二种:RollingUpdate:滚动更新,即实现部分更新,逐渐替换掉原有的pod,也就是默认的策略;
type: RollingUpdate
#如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;
rollingUpdate:
#在原有pod副本数量的基础上,多启动pod的数量(也就是说,更新过程中同时可以存在2+副本数个pod,新旧版本一起)
maxSurge: 2
#在升级的过程中最大不可访问的pod的数量(也就是说,pod副本数-1的数量可以被访问)
maxUnavailable: 1
replicas: 10
selector:
matchLabels:
k8s: oslee
template:
metadata:
name: pod01
labels:
k8s: oslee
spec:
nodeSelector:
# 根据标签调度到节点k8s1上,如果使用os=lee两个节点都有,就是两个节点都调度
node: k8s1
containers:
- name: c1
image: harbor.oslee.com/oslee-private/my-nginx:v2
ports:
- containerPort: 80
[root@k8s1 deploy]# kubectl apply -f deploy.yaml
deployment.apps/dm01 created
=============================== 至此,已成艺术==============================