k8s label 与 selector
我们现在来整合你提到的三个部分:Deployment 的 metadata.labels、Deployment 的 template.metadata.labels 和 Service 的 spec.selector,完整说明它们之间的关系和作用。
🧠 核心结论一句话:
selector 是用来“查找目标”的,label 是用来“贴在资源身上让别人找到你”的。
🔍 三个关键位置的 label 与 selector
我们来一个个看这三部分:
✅ 1. Deployment 自己的标签(无关联性)
metadata:
labels:
app: nginx
📌 说明:
-
这是 Deployment 自己的标签。
-
它不会影响 Pod,不会被 Service 或 Deployment 的 selector 使用。
-
作用是方便你用 kubectl 或监控系统筛选这个 Deployment 资源,比如:
kubectl get deployment -l app=nginx
✅ 2. Deployment 的 Pod 标签(关键)
spec:
template:
metadata:
labels:
app: nginx
📌 说明:
-
这是 Deployment 创建出来的 Pod 会拥有的标签。
-
✅ 是 Service 和 Deployment selector 能识别和匹配的目标。
✅ 3. Deployment 的 selector(匹配 Pod)
spec:
selector:
matchLabels:
app: nginx
📌 说明:
-
Deployment 用这个 selector 来选择它要管理的 Pod。
-
它必须和你创建的 Pod 的 label(也就是上面的 template.metadata.labels)保持一致。
-
如果不一致,Deployment 会报错或找不到 Pod。
✅ 4. Service 的 selector(也是匹配 Pod)
spec:
selector:
app: nginx
📌 说明:
-
Service 使用这个 selector 来选择它要转发请求的 Pod。
-
它也是看 Pod 的 label(不是看 Deployment!)。
🎯 图解关系总结(文字形式):
Deployment
┌────────────────────────────────┐
│ metadata.labels │ ← Deployment 自己的标签【无关联】
│ │
│ spec │
│ ├── selector.matchLabels → app: nginx ┐
│ │ ▼
│ └── template.metadata.labels → app: nginx ← Pod 上的标签
└────────────────────────────────┘
Service
┌────────────────────────────────┐
│ spec.selector → app: nginx ─────┐
└────────────────────────────────┘ │
▼
找到 Pod(由 Deployment 创建,贴了 app: nginx)
✅ 最终总结:一句话记住!
|
角色 |
用途 |
匹配的对象 |
|---|---|---|
|
Deployment metadata.labels |
自己的标签(只是标识,不参与 selector) |
无 |
|
Deployment selector.matchLabels |
匹配哪些 Pod(用于控制) |
匹配 Pod 的 label |
|
Deployment template.metadata.labels |
设置 Pod 的标签(很关键) |
被 Service/Deployment 用来匹配 |
|
Service spec.selector |
找到要转发的 Pod |
匹配 Pod 的 label |
浙公网安备 33010602011771号