一、标签如何使用

关于标签的使用,大概分为四方面:增、删、改、查。

1.1 增

修改node节点k8s-node02的label为region=subnet7

[root@k8s-master01 practice]# kubectl label node k8s-node02 region=subnet7

1.2 删

单个去除node节点k8s-node02的label:region=subnet7

[root@k8s-master01 practice]# kubectl label node k8s-node02 region-

批量删除符合标签选择器条件的所有节点的标签

[root@k8s-master01 practice]# kubectl label node -l region region-

1.3 改

单个修改node节点k8s-node02的label:region=subnet120

[root@k8s-master01 practice]# kubectl label node k8s-node02 region=subnet120 --overwrite

批量修改符合标签选择器条件的所有节点的标签

[root@k8s-master01 practice]# kubectl get node -l region region=subnet120 --overwrite

1.4 查

查看单个节点的标签

[root@k8s-master01 practice]# kubectl get node k8s-node02 --show-labels

k8s-node02     Ready    <none>                 6d5h   v1.23.14   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,region=subnet7

查看所有节点的标签

[root@k8s-master01 practice]# kubectl get node --show-labels

筛选节点标签含region的节点

[root@k8s-master01 practice]# kubectl get node --show-labels | grep region

选择匹配 region 为subnet7 的 node

[root@k8s-master01 practice]# kubectl get node -l 'region in (subnet7)' --show-labels

选择匹配 app 为 details 或者 productpage 的 Service

kubectl get svc -l 'app in (details,productpage)' --show-labels

选择 app 为 productpage 或 reviews 但不包括 version=v1 的 svc

kubectl get svc -l version!=v1,'app in (details,productpage)' --show-labels

选择 label 的 key 名为 app 的 svc

kubectl get svc -l app --show-labels

二、标签如何结合标签选择器使用

nodeSelector 是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。 Kubernetes 只会将 Pod 调度到拥有你所指定的每个标签的节点上。

下面以一个具体的示例进行演示:

1.修改node节点k8s-node02的label为region=subnet7

[root@k8s-master01 practice]# kubectl label node k8s-node02 region=subnet7
node/k8s-node02 labeled

2.筛选标签为region=subnet7的节点

[root@k8s-master01 practice]# kubectl get no -l region=subnet7
NAME         STATUS   ROLES    AGE    VERSION
k8s-node02   Ready    <none>   6d3h   v1.23.14

3.在 Deployment 控制器添加标签指定将 Pod 部署到带标签的节点上

[root@k8s-master01 practice]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      nodeSelector:
        region: subnet7
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        name: nginx
        resources: {}
status: {}

4.查看pod部署节点,观察到都已部署到k8s-node02节点上

[root@k8s-master01 calico]# kubectl get po -owide
NAME                     READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
nginx-66c66889f4-4clxn   1/1     Running   0          70m   172.27.14.196   k8s-node02   <none>           <none>
nginx-66c66889f4-mncsm   1/1     Running   0          70m   172.27.14.193   k8s-node02   <none>           <none>
nginx-66c66889f4-vssf5   1/1     Running   0          70m   172.27.14.197   k8s-node02   <none>           <none>