Pod 标签
学习目标
- 理解标签的作用和使用场景
- 掌握标签的增删改查操作
- 能够使用标签选择器过滤资源
核心概念
什么是标签
标签(Labels)是附加到 Kubernetes 对象上的键值对。
用途:
- 组织和选择资源
- Service 选择 Pod
- Deployment 管理 Pod
- 监控和日志过滤
示例:
labels:
app: web
env: production
tier: frontend
标签语法
metadata:
labels:
# 前缀/名称: 值
app.kubernetes.io/name: my-app
app.kubernetes.io/version: "1.0"
# 简单形式
app: web
env: production
| 部分 | 规则 | 示例 |
|---|---|---|
| 键 | 可选前缀/名称,最多 63 字符 | app, example.com/app |
| 值 | 可选,最多 63 字符 | web, production |
| 字符 | 字母、数字、-、_、. | my-app_v1.0 |
创建时添加标签
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
env: production
tier: frontend
spec:
containers:
- name: nginx
image: nginx
# 命令式创建时添加标签
kubectl run web --image=nginx --labels=app=web,env=prod
查看标签
# 查看 Pod 标签
kubectl get pods --show-labels
# 只显示特定标签
kubectl get pods -L app,env
# 查看单个 Pod 标签
kubectl get pod web -o jsonpath='{.metadata.labels}'
动态管理标签
# 添加标签
kubectl label pod web env=production
kubectl label pod web tier=frontend
# 修改标签(需要 --overwrite)
kubectl label pod web env=staging --overwrite
# 删除标签
kubectl label pod web env-
kubectl label pod web tier-
标签选择器(Label Selectors)
# 等值选择器
kubectl get pods -l app=web
kubectl get pods -l app!=web
# 集合选择器
kubectl get pods -l 'env in (production, staging)'
kubectl get pods -l 'env notin (dev, test)'
kubectl get pods -l env
kubectl get pods -l '!env'
| 选择器 | 说明 | 示例 |
|---|---|---|
key=value | 等于 | app=web |
key!=value | 不等于 | app!=web |
key in (v1,v2) | 在集合中 | env in (prod, stg) |
key notin (v1,v2) | 不在集合中 | env notin (dev, test) |
key | 存在 | app |
!key | 不存在 | !app |
Service 使用标签选择 Pod
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web # 选择所有 app=web 的 Pod
ports:
- port: 80
targetPort: 8080
Service 通过标签选择 Pod:
Service (web-service)
↓ selector: app=web
↓
Pod 1 (app=web) ← 匹配
Pod 2 (app=api) ← 不匹配
Pod 3 (app=web) ← 匹配
Deployment 使用标签管理 Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
命名标签规范
# 推荐标签(Kubernetes 推荐标签)
labels:
app.kubernetes.io/name: my-app
app.kubernetes.io/instance: my-app-1
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/component: frontend
app.kubernetes.io/part-of: my-project
app.kubernetes.io/managed-by: helm
# 常见自定义标签
labels:
app: web # 应用名
env: production # 环境
tier: frontend # 层级
team: backend # 团队
version: v1 # 版本
标签的最佳实践
1. 一致性
所有资源使用相同的标签体系
2. 有意义
标签应反映资源的属性
3. 不过多
通常 5-10 个标签足够
4. 规范化
使用推荐标签或团队统一规范
实践练习
练习 1: 创建带标签的 Pod
创建 Pod 并添加标签:
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
env: dev
spec:
containers:
- name: nginx
image: nginx
kubectl apply -f pod.yaml
kubectl get pods --show-labels
练习 2: 动态管理标签
练习增删改标签:
# 添加标签
kubectl label pod web tier=frontend
kubectl get pod web --show-labels
# 修改标签
kubectl label pod web env=production --overwrite
kubectl get pod web --show-labels
# 删除标签
kubectl label pod web env-
kubectl get pod web --show-labels
练习 3: 使用标签选择器
创建多个带标签的 Pod 并过滤:
kubectl run web1 --image=nginx --labels=app=web,env=prod
kubectl run web2 --image=nginx --labels=app=web,env=dev
kubectl run api1 --image=nginx --labels=app=api,env=prod
# 按标签过滤
kubectl get pods -l app=web
kubectl get pods -l env=prod
kubectl get pods -l 'app=web,env=prod'
练习 4: 理解标签选择器
使用集合选择器:
kubectl get pods -l 'env in (prod, staging)'
kubectl get pods -l 'app notin (api)'
常见误解
1. 标签不是注释
错误:标签和注释一样
正确:
- 标签:用于选择和过滤,有长度限制
- 注释:用于附加信息,无长度限制
标签用于"选择",注释用于"记录"
2. 标签不唯一
错误:每个 Pod 的标签必须唯一
正确:多个 Pod 可以有相同的标签
标签是用于分组,不是唯一标识
3. 标签选择器是隐式的
错误:Service 会自动找到相关 Pod
正确:Service 通过标签选择器匹配 Pod
如果标签不匹配,Service 无法路由到 Pod
小结
| 要点 | 说明 |
|---|---|
| 标签定义 | 键值对,附加到资源 |
| 添加方式 | YAML 或 kubectl label |
| 查看方式 | --show-labels / -L |
| 选择器 | 等值选择器 / 集合选择器 |
| 用途 | Service 选择、Deployment 管理、过滤 |
| 最佳实践 | 一致性、有意义、规范化 |
练习编辑器
bash
Loading...