### 一、标签 在 Kubernetes(k8s)中,标签(Labels)和标签选择器(Label Selectors)是用于组织和选择资源子集的关键概念。它们是元数据的一部分,可以附加到几乎所有的 Kubernetes 对象上,例如 Pods、Services、Deployments 等 标签是键值对,附加到 Kubernetes 对象上,用于指定这些对象的属性,这样可以通过这些属性对它们进行识别和组织。一个标签由一个键(key)和一个值(value)组成,例如: ```yaml labels: app: myapp env: production ``` ### 二、标签选择器 标签选择器用于从一组对象中选择匹配特定标签的对象。选择器可以是等式式的(equality-based)或者集合式的(set-based)。 - 等式式选择器(Equality-based Selectors): - `=` 或 `==`:选择标签与指定值相等的对象 - `!=`:选择标签与指定值不相等的对象 - 集合式选择器(Set-based Selectors): - `in`:选择标签值在指定集合中的对象 - `notin`:选择标签值不在指定集合中的对象 - `exists`(仅通过键指定):选择具有指定键的对象,不论其值为何 - `does not exist`(通过键前的 `!` 指定):选择不具有指定键的对象 选择器可以在 kubectl 命令中使用,也可以在配置文件中指定,用于定义服务或者复制控制器等应该处理哪些 Pods - 使用等式式选择器来获取所有 “env” 标签值为 “production” 的 Pods: ```bash kubectl get pods -l env=production ``` - 使用集合式选择器来选择 “app” 标签值为 “myapp” 或 “yourapp” 的 Pods: ```bash kubectl get pods -l 'app in (myapp, yourapp)' ``` - yaml中指定标签选择器 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 2 selector: matchLabels: app: myapp template: metadata: labels: app: myapp env: production spec: containers: - name: myapp-container image: myapp:1.0 ``` ### 三、标签操作 #### 1. 添加标签 - 创建 Kubernetes 资源(如 Pods、Deployments、Services 等)时,您可以直接在资源的定义文件中添加标签。例如,为一个 Pod 添加标签: ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod labels: app: myapp spec: containers: - name: myapp-container image: myapp:latest ``` - kubectl 添加标签 ```bash kubectl label pods example-pod app=myapp ``` #### 2. 更新标签 - 命令行更新标签 ```bash kubectl label pods example-pod app=newapp --overwrite ``` - 通过修改资源定义yaml文件,更新标签,`pod-definition.yaml` 是包含了对标签的更改的资源定义文件 ```bash kubectl apply -f pod-definition.yaml ``` #### 3. 删除标签 - 命令行删除标签 ```bash kubectl label pods example-pod app- ``` #### 4. 按照标签查询资源 - 命令行查询标签,列出所有带有 `app=myapp` 标签的 Pods ```bash kubectl get pods -l app=myapp ``` #### 5. 查看资源上的所有标签 - 命令行指令操作,列出example-pod的所有标签 ```bash kubectl describe pods example-pod ``` ### 四、标签选择器操作 #### 1. 等式选择器(Equality-based Selectors) - 包括以下使用方式: - `=` 或 `==`:选择具有特定键和值的资源 - `!=`:选择不具有特定键和值的资源 - 举例: ```bash kubectl get pods -l env=production # 生产环境的pod kubectl get pods -l app=frontend # 前端 pod kubectl get pods -l 'app!=frontend' # 非前端的pod ``` #### 2. 集合选择器(**Set-based Selectors**) - 包括以下使用方式: - `in`:选择标签值属于指定集合的资源 - `notin`:选择标签值不属于指定集合的资源 - `exists`(只指定键):选择存在特定键的资源(不关心值) - `does not exist`(通过在键前加 `!` 表示):选择不存在特定键的资源 - 命令行使用举例: ```bash kubectl get pods -l 'env in (production, qa)' # 环境为生产环境或QA环境的pod kubectl get pods -l 'app notin (frontend, backend)' # 不是前端也不是后端的app的pod kubectl get pods -l 'tier' # 标签包含tier的pod kubectl get pods -l '!tier' # 不含有 “tier” 标签的 pod ``` - 资源定义清单中使用举例: - Deployment 或 Service 中使用选择器来简单确定哪些pod应该被包含在内: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp ``` - 实用复杂选择器选择pod: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 selector: matchExpressions: - {key: app, operator: In, values: [myapp]} - {key: tier, operator: NotIn, values: [frontend]} template: metadata: labels: app: myapp tier: backend ```