Kubernetes 1.20.5实验记录–Pod资源调度
1.1 nodeSelector
1、添加节点标签:
kubectl label node worker1 disktype=ssd
2、查看节点标签:
kubectl get node --show-labels
3、创建Deployment:
文件nodeselector.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeselector
spec:
replicas: 6
selector:
matchLabels:
run: nodeselector
template:
metadata:
labels:
run: nodeselector
spec:
containers:
- name: nodeselector
image: nginx
nodeSelector:
disktype: ssd
kubectl apply -f nodeselector.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod选择在标签为disktype=ssd的节点上运行
5、删除Deployment:
kubectl delete -f nodeselector.yaml
6、删除节点标签:
kubectl label node worker1 disktype-
7、查看节点标签:
kubectl get node --show-labels
1.2 nodeAffinity
1.2.1 硬亲和
1、创建Deployment:
文件nodeaffinity-required.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeaffinity-required
spec:
replicas: 6
selector:
matchLabels:
run: nodeaffinity-required
template:
metadata:
labels:
run: nodeaffinity-required
spec:
containers:
- name: nodeaffinity-required
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- worker1
kubectl apply -f nodeaffinity-required.yaml
2、查看Pod状态:
kubectl get pod -o wide
Pod选择在hostname不是worker1的节点上运行
3、删除Deployment:
kubectl delete -f nodeaffinity-required.yaml
1.2.2 软亲和
1、添加节点标签:
kubectl label node worker1 select=prefer
2、查看节点标签:
kubectl get node --show-labels
3、创建Deployment:
文件nodeaffinity-preferred.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeaffinity-preferred
spec:
replicas: 6
selector:
matchLabels:
run: nodeaffinity-preferred
template:
metadata:
labels:
run: nodeaffinity-preferred
spec:
containers:
- name: nodeaffinity-preferred
image: nginx
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: select
operator: In
values:
- prefer
kubectl apply -f nodeaffinity-preferred.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod优先选择在标签为select=prefer的节点上运行
5、删除Deployment:
kubectl delete -f nodeaffinity-preferred.yaml
6、删除节点标签:
kubectl label node worker1 select-
7、查看节点标签:
kubectl get node --show-labels
1.3 podAffinity
1.3.1 硬亲和
1、创建Pod:
kubectl run -it busybox --image=busybox --labels="run=busybox"
2、查看Pod状态:
kubectl get pod -o wide -l run=busybox
3、创建Deployment:
文件podaffinity-required.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: podaffinity-required
spec:
replicas: 6
selector:
matchLabels:
run: podaffinity-required
template:
metadata:
labels:
run: podaffinity-required
spec:
containers:
- name: podaffinity-required
image: nginx
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: run
operator: In
values:
- busybox
topologyKey: kubernetes.io/hostname
kubectl apply -f podaffinity-required.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod选择在带有run=busybox标签Pod运行的节点上运行
5、删除Deployment:
kubectl delete -f podaffinity-required.yaml
6、删除Pod:
kubectl delete pod busybox
1.3.2 软亲和
1、创建Pod:
kubectl run -it busybox --image=busybox --labels="run=busybox"
2、查看Pod状态:
kubectl get pod -o wide -l run=busybox
3、创建Deployment:
文件podaffinity-preferred.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: podaffinity-preferred
spec:
replicas: 6
selector:
matchLabels:
run: podaffinity-preferred
template:
metadata:
labels:
run: podaffinity-preferred
spec:
containers:
- name: podaffinity-preferred
image: nginx
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: run
operator: In
values:
- busybox
topologyKey: kubernetes.io/hostname
kubectl apply -f podaffinity-preferred.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod优先选择在带有run=busybox标签Pod运行的节点上运行
5、删除Deployment:
kubectl delete -f podaffinity-preferred.yaml
6、删除Pod:
kubectl delete pod busybox
1.4 podAntiAffinity
1、创建Pod:
kubectl run -it busybox --image=busybox --labels="run=busybox"
2、查看Pod状态:
kubectl get pod -o wide -l run=busybox
3、创建Deployment:
文件podantiaffinity-required.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: podantiaffinity-required
spec:
replicas: 6
selector:
matchLabels:
run: podantiaffinity-required
template:
metadata:
labels:
run: podantiaffinity-required
spec:
containers:
- name: podantiaffinity-required
image: nginx
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: run
operator: In
values:
- busybox
topologyKey: kubernetes.io/hostname
kubectl apply -f podantiaffinity-required.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod选择不在带有run=busybox标签Pod运行的节点上运行
5、删除Deployment:
kubectl delete -f podantiaffinity-required.yaml
6、删除Pod:
kubectl delete pod busybox
1.5 nodeFailover
1、查看节点状态:
kubectl get node
2、创建Deployment:
文件nodefailover.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodefailover
labels:
run: nodefailover
spec:
replicas: 6
selector:
matchLabels:
run: nodefailover
template:
metadata:
labels:
run: nodefailover
spec:
containers:
- name: nodefailover
image: nginx
kubectl apply -f nodefailover.yaml
3、查看Pod状态:
kubectl get pod -o wide
4、Worker2故障:
kubectl get node
5、查看Pod状态:
kubectl get pod -o wide
Worker1上创建新Pod,故障节点Pod状态为Terminating
6、Worker2恢复:
kubectl get node
7、查看Pod状态:
kubectl get pod -o wide
Worker2恢复后,删除Terminating状态的Pod
8、删除Deployment:
kubectl delete -f nodefailover.yaml
1.6 Taints
1、添加节点污点:
kubectl taint node worker2 node-role.kubernetes.io=worker2:NoSchedule
Worker2标识为不可调度
2、查看节点污点:
kubectl describe node worker2
3、创建Deployment:
文件taints.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: taints
spec:
replicas: 6
selector:
matchLabels:
run: taints
template:
metadata:
labels:
run: taints
spec:
containers:
- image: nginx
name: taints
kubectl apply -f taints.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod在非Worker2节点运行
5、删除Deployment:
kubectl delete -f taints.yaml
6、删除节点污点:
kubectl taint node worker2 node-role.kubernetes.io-
1.7 Tolerations
1、添加节点污点:
kubectl taint node worker1 node-role.kubernetes.io=worker1:NoSchedule
Worker1标识为不可调度
2、查看节点污点:
kubectl describe node worker1
3、创建Deployment:
文件no-tolerations.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tolerations
labels:
run: tolerations
spec:
replicas: 6
selector:
matchLabels:
run: tolerations
template:
metadata:
labels:
run: tolerations
spec:
containers:
- name: tolerations
image: nginx
kubectl apply -f no-tolerations.yaml
4、查看Pod状态:
kubectl get pod -o wide
Pod在非Worker1节点运行
5、删除Deployment:
kubectl delete -f no-tolerations.yaml
6、创建Deployment:
文件tolerations.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tolerations
labels:
run: tolerations
spec:
replicas: 6
selector:
matchLabels:
run: tolerations
template:
metadata:
labels:
run: tolerations
spec:
containers:
- name: tolerations
image: nginx
tolerations:
- key: node-role.kubernetes.io
operator: Equal
value: worker1
effect: NoSchedule
kubectl apply -f tolerations.yaml
Deployment包含tolerations配置
7、查看Pod状态:
kubectl get pod -o wide
Pod可在Worker1节点运行
8、删除Deployment:
kubectl delete -f tolerations.yaml
9、删除节点污点:
kubectl taint node worker1 node-role.kubernetes.io:NoSchedule-