Kubernetes theory
September 21, 2022

Labels and Selectors

labels или по-русски метки - это метаинформация, которая может быть прикреплена к любой сущности в кластере k8s. Необходимы для того чтобы как-то можно было бы отличать одни экземпляры сущности от других. К примеру одни поды от других подов. Необязателен, но очень удобен в использовании.

Также, labels (метки) удобно использовать для поиска ресурса. Это довольно удобно делать по метке.

Блок labels является необязательной частью блока metadata.
Выглядит это примерно так:

metadata: 
   name: cam-nginx 
   namespace: preprod 
   labels: 
      app: nginx 
      environment: preprod

Где в ключ и значение можно вписать всё что угодно. Главное чтобы было понятно примерное назначение ресурса. Из приведенного выше примера становится ясно, что речь идёт о ресурсе с nginx в окружении препрода.

В метках имеет смысл указывать окружение, назначение ресурса, какой группе пользователей ресурс принадлежит.

Метки могут быть одинаковыми у разных сущностей внутри кластера. Например, метка environment: preprod может быть у: pod, deploy, sts, ds, cj, pv/pvc etc.

Цель использования меток.

  1. Организация объектов по категориям.
  2. Делать кастомные выборки ресурсов на их основе.
  3. Упрощение процесса поиска ресурса в кластере.

Особенности меток.

1. Каждый ключ у объекта должен быть уникален.
2. Метки можно использовать сразу в манифесте при создании ресурса.

Pod nginx с labels.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cam-nginx
  namespace: preprod
  labels:
    app: nginx
    environment: preprod
spec:
  containers:
  - image: nginx:latest
    name: cameda-nginx
    ports:
      - containerPort: 80
EOF

Ниже часть дескрайба этого пода, где показаны установленные метки:

kubectl describe po cam-nginx -n preprod
Name:         cam-nginx
Namespace:    preprod
Priority:     0
Node:         cl1r12kvg8q3mf91ohla-usen/10.128.0.29
Start Time:   Sun, 18 Sep 2022 14:02:20 +0300
Labels:       app=nginx
              environment=preprod
Annotations:  cni.projectcalico.org/podIP: 10.96.128.18/32
Status:       Running
IP:           10.96.128.18
IPs:
  IP:  10.96.128.18

Добавить ещё одну метку поду после его создания.

kubectl label po cam-nginx apt=nginx1 -n preprod
kubectl label no cl10sucmg9fveg2v9mka-ijym kubernetes.io/os=windows --overwrite # Перезаписать значение

Посмотрим как изменились метки в дескрайбе этого пода:

kubectl describe po cam-nginx -n preprod
Name:         cam-nginx
Namespace:    preprod
Priority:     0
Node:         cl1r12kvg8q3mf91ohla-usen/10.128.0.29
Start Time:   Sun, 18 Sep 2022 14:02:20 +0300
Labels:       app=nginx
              apt=nginx1
              environment=preprod
Annotations:  cni.projectcalico.org/podIP: 10.96.128.18/32
Status:       Running
IP:           10.96.128.18
IPs:
  IP:  10.96.128.18

Посмотреть поды у которых определённый label.

kubectl get po -l environment=preprod -A

Удалить метку

kubectl label po cam-nginx environment-
kubectl label po cam-nginx app-
kubectl label no cl10sucmg9fveg2v9mka-ijym cam-

Selectors

Селектор меток является основным примитивом группировки в Kubernetes. В их задачи входит группировка ресурсов по их меткам. Иными словами ресурсы с одинаковыми метками могут быть сгруппированы с помощью селекторов.

Данная сущность используется в контроллерах, например, у: deploy, sts, ds, svc, job, pdb, ingress, etc.
С помощью селекторов контроллеры определяют, какими подами они управляют.

Пример deploy, где показан selector:

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cam-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: cam-httpd
          image: httpd:latest
EOF

Часть этого deployment:

  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx

говорит о том, что deployment будет управлять подами с меткой app: nginx. Поэтому здесь связка ключ/значение у selector = ключ/значение у labels.

Будучи частью контроллеров они не входят в блок metadata, в отличие от labels, с которыми они взаимодействуют.

Полезные ссылки

Подробнее про метки и селекторы: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/