19·Pod 基础入门

Pod 标签

kubernetespodlabels

Pod 标签

学习目标

  1. 理解标签的作用和使用场景
  2. 掌握标签的增删改查操作
  3. 能够使用标签选择器过滤资源

核心概念

什么是标签

标签(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...

继续学习

完成本课后,建议继续学习下一课「Pod 注解」 以巩固所学知识。