typora/note/devops/kubernetes/标签.md
2024-12-12 10:48:55 +08:00

5.1 KiB
Raw Blame History

一、标签

在 Kubernetesk8s标签Labels和标签选择器Label Selectors是用于组织和选择资源子集的关键概念。它们是元数据的一部分可以附加到几乎所有的 Kubernetes 对象上,例如 Pods、Services、Deployments 等

标签是键值对,附加到 Kubernetes 对象上用于指定这些对象的属性这样可以通过这些属性对它们进行识别和组织。一个标签由一个键key和一个值value组成例如

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
kubectl get pods -l env=production
  • 使用集合式选择器来选择 “app” 标签值为 “myapp” 或 “yourapp” 的 Pods
kubectl get pods -l 'app in (myapp, yourapp)'
  • 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 添加标签:
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: myapp:latest
  • kubectl 添加标签
kubectl label pods example-pod app=myapp

2. 更新标签

  • 命令行更新标签
kubectl label pods example-pod app=newapp --overwrite
  • 通过修改资源定义yaml文件更新标签pod-definition.yaml 是包含了对标签的更改的资源定义文件
kubectl apply -f pod-definition.yaml

3. 删除标签

  • 命令行删除标签
kubectl label pods example-pod app-

4. 按照标签查询资源

  • 命令行查询标签,列出所有带有 app=myapp 标签的 Pods
kubectl get pods -l app=myapp

5. 查看资源上的所有标签

  • 命令行指令操作列出example-pod的所有标签
kubectl describe pods example-pod

四、标签选择器操作

1. 等式选择器Equality-based Selectors

  • 包括以下使用方式:

    • ===:选择具有特定键和值的资源

    • !=:选择不具有特定键和值的资源

  • 举例:

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(通过在键前加 ! 表示):选择不存在特定键的资源
  • 命令行使用举例:
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应该被包含在内

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: myapp-deployment
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: myapp
        template:
          metadata:
            labels:
              app: myapp
      
    • 实用复杂选择器选择pod

      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