Kubernetes标签(Label)
标签(Labels)是 Kubernetes 中用于对资源进行标识和分类的键值对,是实现资源管理、筛选和关联的核心机制。它们不直接影响资源的功能,但为集群中的资源组织、查询和操作提供了强大的灵活性。
1、概念
1.1 定义与作用
标签是附加在 Kubernetes 资源(如 Pod、Node、Service、Deployment 等)上的键值对
特点:
- 每个对象可以有多个标签。
- 标签的 Key 必须是唯一的。
- 标签可以在创建时添加,也可以后期动态修改。
1.2 标签的语法和规范
-
键(Key): 分为两部分(可选):前缀/名称
- 前缀: 可选。如果指定,必须是一个 DNS 子域名,如 example.com/my-key。它用于区分第三方工具使用的标签。
- 名称: 必填。不能超过 63 个字符。必须以字母数字开头和结尾,中间可以包含连字符 -、下划线 _、点 .。
-
值(Value): 必须不超过 63 个字符。同样必须以字母数字开头和结尾,中间可以包含连字符 -、下划线 _、点 .。
有效示例:
environment: production
tier: frontend
app.kubernetes.io/name: mysql (使用前缀的最佳实践)
release: "canary" (值可以用引号,但非必须)
无效示例:
.environment: prod (键名不能以点开头)
environment: prod/ (值不能以斜杠结尾)
2、标签的使用
2.1 创建资源时添加标签
Pod示例
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production # 环境标识
app: nginx # 应用名称
version: "1.21" # 版本号
tier: frontend # 应用层级
spec:
containers:
- name: nginx
image: nginx:1.21
Deployment 示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
tier: frontend
template:
metadata:
labels:
app: nginx
tier: frontend
version: "1.21"
spec:
containers:
- name: nginx
image: nginx:1.21
2.2 为现有资源添加或修改标签
使用 kubectl label
命令:
# 给一个已存在的 Pod 添加/修改标签
kubectl label pods <pod-name> environment=prod
# 覆盖已存在的标签(需要 --overwrite)
kubectl label pods <pod-name> environment=staging --overwrite
2.3 查看资源标签
# 查看所有 Pod 及其标签
kubectl get pods --show-labels
# 查看指定命名空间的 Pod 及其标签
kubectl get pods -n <namespace> --show-labels
# 查看特定资源的标签
kubectl describe pod label-demo | grep Labels
# 使用标签选择器筛选 Pod
kubectl get pods -l app=nginx
kubectl get pods -l 'environment in (prod, staging)'
kubectl get pods -l 'tier!=backend'
2.4 删除标签
通过将标签值设置为空字符串来删除标签:
# 使用减号 - 来删除一个标签
kubectl label pods <pod-name> environment-
3、标签选择器(Label Selectors)
标签选择器是用于筛选具有特定标签的资源的查询条件,Kubernetes 中许多资源都使用标签选择器来关联其他资源。
3.1 基于等值(Equality-based)的选择器
使用 =
、==
、!=
运算符进行匹配。
-
environment = production
: 选择所有具有environment
标签且值等于production
的对象。 -
tier != frontend
: 选择所有具有tier
标签且值不等于frontend
,或者根本没有tier
标签的对象。
示例
# 选择 environment 为 production 的 Pod
kubectl get pods -l environment=production
# 选择 app 为 nginx 且 tier 不是 backend 的 Pod
kubectl get pods -l app=nginx,tier!=backend
3.2 基于集合(Set-based)的选择器
使用 in
、notin
、exists
运算符进行更灵活的匹配。
-
environment in (production, staging): 选择所有具有 environment 标签且值是 production 或 staging 的对象。
-
tier notin (frontend, backend): 选择所有具有 tier 标签且值既不是 frontend 也不是 backend 的对象。
-
release: 选择所有具有 release 标签的对象,不检查其值。
-
!release: 选择所有不具有 release 标签的对象。
示例
# 选择 version 为 v1 或 v2 的 Pod
kubectl get pods -l 'version in (v1, v2)'
# 选择 environment 不是 production 也不是 staging 的 Pod
kubectl get pods -l 'environment notin (production, staging)'
# 选择所有具有 app 标签的 Pod(无论值是什么)
kubectl get pods -l 'app'
# 选择所有没有 tier 标签的 Pod
kubectl get pods -l '!tier'
4、应用场景
4.1 连接 Pod 与 Controller(控制器)
Deployment、ReplicaSet、StatefulSet、DaemonSet 等控制器通过标签选择器来管理它们所控制的 Pods。
示例: 一个 Deployment 的配置如下。它通过 selector
字段找到所有带有 app: nginx
和 environment: test
标签的 Pod 来进行管理。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels: # 使用 matchLabels 进行等值匹配
app: nginx
environment: test
template: # Pod 模板
metadata:
labels: # 这里定义的标签必须匹配上面的 selector!
app: nginx
environment: test
tier: frontend # 可以添加更多标签
spec:
containers:
- name: nginx
image: nginx:1.14.2
4.2 连接 Service 与 Pods
Service 通过标签选择器决定它将流量路由到哪些 Pods。
示例:下面的 Service 会将所有进入的流量负载均衡到所有带有 app: nginx 和 environment: test
标签的 Pods 上。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector: # Service 的选择器
app: nginx
environment: test
ports:
- protocol: TCP
port: 80
targetPort: 9376
4.3 节点选择(Node Selection)
你可以给 Node 打上标签(如 disktype: ssd
, gpu: "true"
),然后在 Pod 配置中通过 nodeSelector
将 Pod 调度到特定的节点上。
步骤1:给节点打标签
kubectl label nodes <node-name> disktype=ssd
步骤2:在 Pod 定义中使用节点选择器
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disktype: ssd # 这个 Pod 只会被调度到带有 disktype=ssd 标签的节点上
4.4 金丝雀发布(Canary Releases)
通过标签可以将一部分流量路由到新版本的 Pod(金丝雀),另一部分路由到稳定版本的 Pod。
示例:
-
部署稳定版:deployment + service,标签为 app: myapp, version: stable。
-
部署金丝雀版:deployment,标签为 app: myapp, version: canary。
-
Service 的选择器是 app: myapp,它会将流量同时路由到 stable 和 canary 版本的 Pod。通过控制两个 Deployment 的副本数比例,可以控制流量分配。
4.5 批量操作
可以使用标签选择器对一组资源执行操作。
# 删除所有 environment 为 test 的 Pods
kubectl delete pods -l environment=test
# 查看所有 tier 是 frontend 的 Pods
kubectl get pods -l tier=frontend
# 查看所有具有 release 标签的 Pods(不管值是什么)
kubectl get pods -l release