马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
概述
官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/
在K8s中,Label(标签) 是用于标识和构造集群资源(如Pod、Service、Deployment、Node等)的核心机制,其重要作用就是在各种资源上添加表示,用来对它们进行区分和选择。
Label的特点
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
- 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
Label的定义规则
Key的定义规则
- kubernetes.io/ 和 k8s.io/ 前缀是为 Kubernetes 核心组件保存的。
- 格式:[前缀/]名称
- 前缀(可选):DNS子域格式(如 k8s.example.com/),不超过253字符。
- 名称:不超过63字符,允许字母、数字、-、_、.,且需以字母或数字开头和结尾
Value的定义规则
- 必须为 63 个字符或更少(可以为空)
- 除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
- 包含破折号(-)、下划线(_)、点(.)和字母或数字
Label的操作
给资源添加Label
方式一:在资源清单中指定
可以在资源文件中的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
复制代码 方式二:直接在已存在的资源上添加Label
语法:- 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
复制代码 修改资源中指定的LabelValue
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
示例:- # 查看指定资源的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
复制代码 删除资源中的Label
语法:- # 注意,labelKey后有一个"-"减号kubectl label pods <pod-name> <labelKey=value>-
复制代码 示例:删除上述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
复制代码 Label选择器
官网文档:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/#label-selectors
在Kubernetes中,Label选择器(Label Selector) 是用于根据标签(Label)筛选和操作资源的核心机制。
Kubernetes中支持两种类型的Label选择器
等式选择器
通过精确匹配标签的键和值来筛选资源,支持以下操作符:
- # 选择所有包含 `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'
复制代码 通过Label操作K8s的资源
通过Label查看指定的资源
语法:- 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
复制代码 通过Label删除资源
语法:- 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中利用
在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中利用
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
复制代码 Label及Label选择器的利用场景
- 批量操作资源:通过标签选择器批量操作符合条件的资源
- 服务发现:Service通过选择器关联Pod,实现动态流量路由
- 多维度分组:按照业务、环境、层级等多维度管理资源
- 通过标签区分新旧版本Pod,渐渐切换流量
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|