一、Label 和 Selector 分别负责什么

Label 是附加在 Kubernetes 对象上的键值对,用来表达对象属性;Selector 则用来按照这些标签筛选资源。

最常见的理解方式是:

  • Label 负责“给对象打标”
  • Selector 负责“按标签选对象”

比如一个 Pod 带了 app=nginxenvironment=production,那么 Service、Deployment 或命令行筛选都可以围绕这些标签工作。

二、Label 的语法规则要先搞清楚

原文重点强调了两层规则:

  • key 可以带可选前缀,例如 kubernetes.io/k8s.io/
  • value 长度一般不超过 63 个字符,且要符合字母数字、-_. 等格式要求

一个简单示例:

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

这类标签不会直接改变 Pod 行为,但会决定它会不会被某个控制器或 Service 选中。

三、Service 选 Pod 时,多标签之间是“与”关系

这是一个非常容易忽略的点。原文专门举例说明了:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: payment
    role: api
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

如果 PodA 标签是:

labels:
  app: payment
  role: api

而 PodB 标签是:

labels:
  app: payment
  role: cron

那么只有 PodA 会被命中。原因很简单:app=paymentrole=api 必须同时满足。

四、Label 的增删改查怎么做

原文把标签操作总结成四类:增、删、改、查。

1.1 新增标签

kubectl label node k8s-node02 region=subnet7
kubectl label deploy nginx version=v1
kubectl label deploy --all svc=true
kubectl label deploy -l app=nginx svc2=true
kubectl label deploy -l app=nginx a=b c=d

1.2 删除标签

kubectl label node k8s-node02 region-
kubectl label node -l region region-

1.3 修改标签

当 key 已存在时,需要显式加 --overwrite

kubectl label node k8s-node02 region=subnet120 --overwrite
kubectl label node -l region region=subnet120 --overwrite

1.4 查询标签

kubectl get node k8s-node02 --show-labels
kubectl get node --show-labels
kubectl get node -l 'region in (subnet7)' --show-labels
kubectl get svc -l 'app in (details,productpage)' --show-labels
kubectl get svc -l version!=v1,'app in (details,productpage)' --show-labels
kubectl get svc -l app --show-labels

五、为什么 nodeSelector 也是标签体系的一部分

原文后半段把标签和调度联系起来了。假设某类业务只能部署到带特定网络出口的节点上,就可以先给节点打标签:

kubectl label node k8s-node02 region=subnet7
kubectl get no -l region=subnet7

然后在 Pod 模板里加上:

spec:
  nodeSelector:
    region: subnet7

这样创建出的 Pod 就会被调度到符合标签条件的节点。

六、理解 Service 的 selector,先理解标签设计

Kubernetes 很多机制表面上不同,底层却都依赖同一套标签系统:

  • Deployment 用标签决定自己管理哪些 Pod
  • Service 用标签决定把流量转给哪些 Pod
  • 调度规则用标签决定 Pod 可以落到哪些节点

因此标签不是“附加信息”,而是资源关系编排的基础索引。标签一旦设计得清晰,Service 的流量路由才会真正可控。