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. Метки можно использовать сразу в манифесте при создании ресурса.
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 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/