1.在k8s环境中使用nginx-deployment.yaml部署一个nginx
[root@k8s-master nginx]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.0
name: nginx
nodeSelector:
type: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "nginx"
effect: "NoSchedule"
2.查询状态,一直显示为Pending状态,所有节点尝试手动下载镜像,发现还是这个问题。
[root@k8s-master nginx]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp 1/1 Running 0 4d17h 10.244.2.2 k8s-node2 <none> <none>
nginx-deployment-74bbc7fff8-425r9 0/1 Pending 0 12s <none> <none> <none> <none>
nginx-deployment-8464c54f76-mmg6l 0/1 Pending 0 15s <none> <none> <none> <none>
3.查看pod的详细信息,发现最后提示Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 node(s) didn’t match node selector.
[root@k8s-master nginx]# kubectl describe pod nginx-deployment-8464c54f76-mmg6l
Name: nginx-deployment-8464c54f76-mmg6l
Namespace: default
Priority: 0
Node: <none>
Labels: app=nginx
pod-template-hash=8464c54f76
Annotations: kubectl.kubernetes.io/restartedAt: 2021-01-18T10:19:42+08:00
Status: Pending
IP:
IPs: <none>
Controlled By: ReplicaSet/nginx-deployment-8464c54f76
Containers:
nginx:
Image: nginx:1.14.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-bzdrm (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
default-token-bzdrm:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-bzdrm
Optional: false
QoS Class: BestEffort
Node-Selectors: type=nginx
Tolerations: key=nginx:NoSchedule
node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
4.解决方式,修改yaml文件,将nodeSelector注释掉
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.0
name: nginx
# nodeSelector:
# type: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "nginx"
effect: "NoSchedule"
5.再在k8s中启动nginx-deployment.yaml,查看pod状态。
[root@k8s-master nginx]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master nginx]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp 1/1 Running 0 4d17h 10.244.2.2 k8s-node2 <none> <none>
nginx-deployment-7b988d8687-vrkvw 1/1 Running 0 8s 10.244.2.3 k8s-node2 <none> <none>
6.另外一种方式,也可以修改k8s节点中,将node节点添加type=nginx的label,也是可以的。
查看当前节点信息
[root@k8s-master nginx]# kubectl get node -o wide --show-labels
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME LABELS
k8s-master Ready master 6d20h v1.17.0 172.30.18.19 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1 Ready worker 6d20h v1.17.0 172.30.18.15 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker
k8s-node2 Ready <none> 6d19h v1.17.0 172.30.18.10 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
修改k8s-node1节点label为type=nginx,在k8s-node1节点信息最后会添加type=nginx的信息。
[root@k8s-master nginx]# kubectl label nodes k8s-node1 type=nginx
node/k8s-node1 labeled
[root@k8s-master nginx]# kubectl get node -o wide --show-labels
k8s-master Ready master 6d20h v1.17.0 172.30.18.19 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
k8s-node1 Ready worker 6d20h v1.17.0 172.30.18.15 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=worker,type=nginx
k8s-node2 Ready <none> 6d19h v1.17.0 172.30.18.10 <none> CentOS Linux 7 (Core) 3.10.0-862.2.3.el7.x86_64 docker://20.10.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
再运行nginx-deployment.yaml,这个文件中没有注释nodeSelector两行代码。
[root@k8s-master nginx]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s-master nginx]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cloud-flaskapp-6c785ddd7b-dnhrp 1/1 Running 0 4d18h 10.244.2.2 k8s-node2 <none> <none>
nginx-deployment-84fdbd9f54-4cpsp 1/1 Running 0 108s 10.244.1.11 k8s-node1 <none> <none>