一、Label 和 Selector 分别负责什么¶
Label 是附加在 Kubernetes 对象上的键值对,用来表达对象属性;Selector 则用来按照这些标签筛选资源。
最常见的理解方式是:
- Label 负责“给对象打标”
- Selector 负责“按标签选对象”
比如一个 Pod 带了 app=nginx、environment=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=payment 和 role=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 的流量路由才会真正可控。