009让pod只在具有指定标签的节点上运行

1. 创建deployment的yaml
```yaml
# 修改好yaml配置
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
      nodeSelector:           # <--- 这里
        apps/nginx: "true"    # <--- 基于这个label来选择
status: {}
```

2. 应用这个配置

```shell
kubectl apply -f node-selector.yaml
```

3. 查看pod, 这时没有节点具有 apps/nginx=true

```shell
node1@k8s-192-168-0-17:~$ sudo kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP       NODE     NOMINATED NODE   READINESS GATES
nginx-756c69b65f-7vfv5   0/1     Pending   0          2m5s   <none>   <none>   <none>           <none>
nginx-756c69b65f-8gl9m   0/1     Pending   0          2m4s   <none>   <none>   <none>           <none>
```

4. 节点打label

```shell
# 先尝试给主节点打label
kubectl label node k8s-192-168-0-17 apps/nginx=true
kubectl get node k8s-192-168-0-17 --show-labels 
NAME               STATUS                     ROLES    AGE    VERSION   LABELS
k8s-192-168-0-17   Ready,SchedulingDisabled   master   5d3h   v1.33.1   apps/nginx=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-192-168-0-17,kubernetes.io/os=linux,kubernetes.io/role=master
```

可以看到虽然给17主节点打了标签,但是还是无法调度因为主节点状态是SchedulingDisabled的, 这个状态优先级更高

```shell
# 尝试给worker节点打label
kubectl label node k8s-192-168-0-19 apps/nginx=true
kubectl get node k8s-192-168-0-19 --show-labels 
NAME               STATUS   ROLES   AGE    VERSION   LABELS
k8s-192-168-0-19   Ready    node    5d3h   v1.33.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-192-168-0-19,kubernetes.io/os=linux,kubernetes.io/role=node
# 再查看pod, 马上从pending到ContainerCreating又转到了running 并且node都在19这个节点上,如果没有节点标签。pod是基本平均分布的
kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-756c69b65f-7vfv5   0/1     ContainerCreating   0          5m38s
nginx-756c69b65f-8gl9m   0/1     ContainerCreating   0          5m37s
kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE               NOMINATED NODE   READINESS GATES
nginx-756c69b65f-7vfv5   1/1     Running   0          7m22s   172.20.177.63   k8s-192-168-0-19   <none>           <none>
nginx-756c69b65f-8gl9m   1/1     Running   0          7m21s   172.20.177.62   k8s-192-168-0-19   <none>           <none>
```