K8S-Pod调度
1、Deployment/RC:全自动调度
- 简述
Deployment或RC的主要功能就是自动部署一个容器应用的多份副本,及持续监控副本的数量并维持该值。
-
创建Deployment
kubectl create -f nginx-deployment.yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
-
查看Deployment的状态
kubectl get deployments
-
查看ReplicaSet(RS)和Pod的信息
kubectl get rs,pods
[root@k8s-master k8s]# kubectl get rs,pods NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-5d59d67564 2 2 2 22h NAME READY STATUS RESTARTS AGE pod/nginx-deployment-5d59d67564-ccxv7 1/1 Running 0 22h pod/nginx-deployment-5d59d67564-sfqjc 1/1 Running 0 22h
2、NodeSelector:定向调度
- 概述
K8S的调度是通过master上的Scheduler进行调度,通过执行一系列的复杂算法计算出最佳的目标节点,自动完成但无法预知。可通过Node的Label与Pod的nodeSelector属性相匹配来实现定向调度
- 给指定node打上标签/或者新增标签
kubectl label nodes k8s-node2 key1=value1
- 查看标签
kubectl get nodes --show-labels
- 创建pod
kubectl create -f redis-master-nodeselector.yaml
apiVersion: V1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: kubeguide/redis-master
ports:
- containerPort: 6379
nodeSelector:
key1: value1
- 查看replicationcontroller(RC)信息
[root@k8s-master k8s]# kubectl get replicationcontroller
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 22h
[root@k8s-master k8s]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 23h
- 查看pod是否部署到标签node上
[root@k8s-master k8s]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5d59d67564-ccxv7 1/1 Running 0 37h 10.244.2.10 k8s-node2 <none> <none>
nginx-deployment-5d59d67564-sfqjc 1/1 Running 0 37h 10.244.2.11 k8s-node2 <none> <none>
redis-master-5fwmk 1/1 Running 0 36h 10.244.2.12 k8s-node2 <none> <none>
3、NodeAffinity:Node亲和性调度
- 概述,要求服务尽可能起在磁盘为SSD的,且只能运行在amd64的node节点上
- 参数:
requiredDuringSchedulingIgnoredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行,直到停止此pod生命周期。
requiredDuringSchedulingRequiredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中RequiredDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,停止此pod生命周期,重新选择符合要求的节点。
preferredDuringSchedulingIgnoredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行,直到停止此pod生命周期。
preferredDuringSchedulingRequiredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中RequiredDuringExecution表示如果后面节点标签发生了变化,满足了条件,停止此pod生命周期,重新调度到满足条件的节点。
requiredDuringScheduling pod资源在配置中声明一种标签,只有node节点跟我声明的标签一致,pod才能被调度到此节点,如果没有匹配上,那我就一直等有匹配上的节点。
preferredDuringScheduling pod资源在配置中声明一种标签,只有node节点跟我声明的标签一致,pod才能被调度到此节点,但如果没有匹配上,那我就不等了,随机找节点。
IgnoredDuringExecution如果pod已经部署到此节点,但如果此节点labels发生变化,已经运行的pod会怎么办?pod也会继续运行,直到停止此pod生命周期。
RequiredDuringExecution 如果pod已经部署到此节点,但如果此节点labels发生变化,已经运行的pod会怎么办?立刻停止生命周期,pod会重新调度到满足条件的节点。
如果同时定义了nodeSelector和nodeAffinity,那必须两个条件都满足,pod才能正常运行到指定Node上。
- 编辑yaml文件
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringException:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In #NotIn、Exists、DoesNotExist、Gt、Lt
values:
- amd64
preferredDuringSchedulingIgnoredDuringException:
- weight: