时间:2025-05-03 18:53
人气:
作者:admin
官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/
在K8s中,Label(标签) 是用于标识和组织集群资源(如Pod、Service、Deployment、Node等)的核心机制,其主要作用就是在各种资源上添加表示,用来对它们进行区分和选择。
kubernetes.io/ 和 k8s.io/ 前缀是为 Kubernetes 核心组件保留的。可以在资源文件中的metadata.labels中指定标签。以定义Pod为例:
# 创建Pod
[root@master01 ~/label]# cat pod-label.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-label
# 添加label标签,标签以key: value的形式定义
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
[root@master01 ~/label]# kubectl apply -f pod-label.yaml
pod/pod-label created
# 验证是否定义成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 49s app=nginx
语法:
kubectl label pods <pod-name> <labelKey=value>
示例:在上述创建Pod中添加一个新的label
# 添加label
[root@master01 ~/label]# kubectl label pods pod-label env=dev
pod/pod-label labeled
# 验证是否添加成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 4m10s app=nginx,env=dev
Label的Key无法进行修改,只能进行删除,或者添加一个新的Key,将原来的Key进行删除,形成修改的假象,这里我们主要讲解修改Label的Value
语法:
kubectl label pods <pod-name> <labelKey=value> --overwrite
示例:将上述Pod的env的value修改为prod
# 修改Label
[root@master01 ~/label]# kubectl label pods pod-label env=prod --overwrite
pod/pod-label labeled
# 验证是否修改成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 12m app=nginx,env=prod
示例:
# 查看指定资源的Label
[root@master01 ~/label]# kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 13m app=nginx,env=prod
static-web-node02 1/1 Running 0 18m role=myrole
# 查看指定资源的Label列
[root@master01 ~/label]# kubectl get pod -L env,app
NAME READY STATUS RESTARTS AGE ENV APP
pod-label 1/1 Running 0 13m prod nginx
static-web-node02 1/1 Running 0 18m
语法:
# 注意,labelKey后有一个"-"减号
kubectl label pods <pod-name> <labelKey>-
示例:删除上述Pod中的env的label
# 删除Label
[root@master01 ~/label]# kubectl label pod pod-label env-
pod/pod-label unlabeled
# 验证是否删除成功
[root@master01 ~/label]# kubectl get pod pod-label --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-label 1/1 Running 0 18m app=nginx
官网文档:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/#label-selectors
在Kubernetes中,Label选择器(Label Selector) 是用于根据标签(Label)筛选和操作资源的核心机制。
Kubernetes中支持两种类型的Label选择器
通过精确匹配标签的键和值来筛选资源,支持以下操作符:
=或者==:匹配key等于指定value的资源# 选择所有包含 `env=prod` 标签的Pod
kubectl get pods -l env=prod
!=:匹配键值不等于指定值的资源# 选择所有不包含 `tier=frontend` 标签的Pod
kubectl get pods -l tier!=frontend
通过集合操作符(如 in、notin、exists)灵活筛选资源,支持更复杂的条件。
# 选择 `env` 是 `prod` 或 `staging` 的Pod
kubectl get pods -l "env in (prod, staging)"
kubectl get pods -l "env notin (frontend, backend)"
# 选择存在env这个key的Pod
kubectl get pods -l "env,app"
# 选择不包含 `tier`、`test` 标签的Pod,
# 注意!!!这里需要使用单引号,使用双引号可能导致bash不解析
kubectl get pods -l '!tier,!test'
语法:
kubectl get <resource-type> -l <label-operation> -n <namespace>
示例:
# 查看label为app=nginx的Pod
[root@master01 ~/label]# kubectl get pod -l "app=nginx"
NAME READY STATUS RESTARTS AGE
pod-label 1/1 Running 0 37m
# 查看calico-system名称空间下指定的Label存在的Pod
[root@master01 ~/label]# kubectl get po -l "app.kubernetes.io/name" -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-585c6db9c7-9wm4p 1/1 Running 1 (6d22h ago) 6d23h
calico-node-64sq8 1/1 Running 0 22h
calico-node-kgkmk 1/1 Running 0 22h
calico-node-vn47d 1/1 Running 0 22h
calico-typha-666d79c78b-65szp 1/1 Running 1 (6d22h ago) 6d23h
calico-typha-666d79c78b-n9mjq 1/1 Running 1 (6d22h ago) 6d23h
csi-node-driver-92w48 2/2 Running 4 (6d22h ago) 6d23h
csi-node-driver-96tfv 2/2 Running 2 (6d22h ago) 6d23h
csi-node-driver-wbf7v 2/2 Running 2 (6d22h ago) 6d23h
语法:
kubectl delete <resource-type> -l <label> -n <namespace>
示例:
# 通过label删除Pod
[root@master01 ~/label]# kubectl delete po -l "app=nginx"
pod "pod-label" deleted
# 验证是否删除成功
[root@master01 ~/label]# kubectl get po pod-label
Error from server (NotFound): pods "pod-label" not found
在Deployment中,spec.selector 用于选择目标Pod。常用 matchLabels 或 matchExpressions:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx # 精确匹配标签 app=nginx
matchExpressions: # 集合选择器(可选)
- {key: env, operator: In, values: [prod, staging]}
template:
metadata:
labels:
app: nginx
env: prod
# ... Pod配置
Service通过 spec.selector 选择Pod:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 选择所有包含 app=nginx 标签的Pod
ports:
- protocol: TCP
port: 80
targetPort: 9376
本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18857799,微信Vac6666666,欢迎交流
下一篇:K8s新手系列之Secret资源
Ubuntu离线环境部署Kubernetes v1.31.3(ARM64)