K8s Q A Labels And Selectors: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
Строка 71: Строка 71:
 
tier != frontend
 
tier != frontend
 
<PRE>
 
<PRE>
 
В данном примере селектор выберет все ресурсы, у который ключ environment соответствует значению production, а также те ресурсы, у которых ключ tier не равен frontend (в том числе ресурсы, у которых нет ключа tier).
  +
<BR>
 
Можно для примера использовать с kubectl (-l)
 
Можно для примера использовать с kubectl (-l)
 
kubectl get pod -A --show-labels=true -l app=stacklight-helm-controller
 
kubectl get pod -A --show-labels=true -l app=stacklight-helm-controller
Строка 78: Строка 80:
 
stacklight stacklight-helm-controller-7d7c8b848f-nfshc 1/1 Running 3 (24d ago) 63d app=stacklight-helm-controller,pod-template-hash=7d7c8b848f
 
stacklight stacklight-helm-controller-7d7c8b848f-nfshc 1/1 Running 3 (24d ago) 63d app=stacklight-helm-controller,pod-template-hash=7d7c8b848f
 
</PRE>
 
</PRE>
В данном примере селектор выберет все ресурсы, у который ключ environment соответствует значению production, а также те ресурсы, у которых ключ tier не равен frontend (в том числе ресурсы, у которых нет ключа tier).
 
   
Селектор, основанный на соответствии набору также поддерживает три возможных оператора - in, notin и exists (последний используется только для проверки наличия/отсутствия ключа). Например:
 
   
 
Селектор, основанный на соответствии набору также поддерживает три возможных оператора -
  +
* in
  +
* notin
  +
* exists
  +
  +
(последний используется только для проверки наличия/отсутствия ключа). Например:
  +
<PRE>
 
environment in (production, qa)
 
environment in (production, qa)
 
tier notin (frontend, backend)
 
tier notin (frontend, backend)
 
partition
 
partition
 
!partition
 
!partition
  +
</PRE>
 
В данном примере, первая строка позволит выбрать все ресурсы, у которых есть ключ environment со значениями production или qa. Вторая строка выбирает ресурсы у которых есть ключ tier и любые значения кроме frontend и backend. Третья строка служит для выбора всех ресурсов, у которых в метках есть ключ partition (значения не проверяются), а четвертая - наоборот, выбирает ресурсы которые не имеют ключа partition.
 
В данном примере, первая строка позволит выбрать все ресурсы, у которых есть ключ environment со значениями production или qa. Вторая строка выбирает ресурсы у которых есть ключ tier и любые значения кроме frontend и backend. Третья строка служит для выбора всех ресурсов, у которых в метках есть ключ partition (значения не проверяются), а четвертая - наоборот, выбирает ресурсы которые не имеют ключа partition.
   
 
Есть возможность комбинировать оба типа селекторов, например:
 
Есть возможность комбинировать оба типа селекторов, например:
  +
<PRE>
 
 
tier in (frontend, backend),environment!=qa
 
tier in (frontend, backend),environment!=qa
  +
</PRE>
 
Несколько примеров использования селекторов с утилитой kubectl:
 
Несколько примеров использования селекторов с утилитой kubectl:
  +
<PRE>
 
 
kubectl get pods -l environment=production,tier=frontend
 
kubectl get pods -l environment=production,tier=frontend
 
kubectl get pods -l 'environment in (production),tier in (frontend)'
 
kubectl get pods -l 'environment in (production),tier in (frontend)'
 
kubectl get pods -l 'environment in (production, qa)'
 
kubectl get pods -l 'environment in (production, qa)'
 
kubectl get pods -l 'environment,environment notin (frontend)'
 
kubectl get pods -l 'environment,environment notin (frontend)'
  +
</PRE>
Набор подов для сервиса (service) определяется с помощью селектора. Аналогично, набор подов, которыми управляет Replication Controller также определяется с помощью селектора. Для этих двух объектов может быть использован только селектор на основе точного соответствия (equality-based) - об этом мы уже упоминали в статье Знакомство с Kubernetes. Часть 4: Реплики (ReplicaSet). Выглядеть это может примерно так:
 
  +
  +
Еще пример
  +
<PRE>
  +
kubectl get pod -A --show-labels=true -l "app!=stacklight-helm-controller,app!=telegraf-ds-smart,app in (prometheus), release"
  +
NAMESPACE NAME READY STATUS RESTARTS AGE LABELS
  +
stacklight prometheus-alertmanager-0 1/1 Running 3 (24d ago) 63d app=prometheus,component=alertmanager,controller-revision-hash=prometheus-alertmanager-58d8597ff5,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-alertmanager-0
  +
stacklight prometheus-alertmanager-1 1/1 Running 3 (24d ago) 63d app=prometheus,component=alertmanager,controller-revision-hash=prometheus-alertmanager-58d8597ff5,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-alertmanager-1
  +
stacklight prometheus-kube-state-metrics-578c45fd8-kx7qx 1/1 Running 3 (24d ago) 63d app=prometheus,component=kube-state-metrics,heritage=Helm,pod-template-hash=578c45fd8,release=prometheus
  +
stacklight prometheus-kube-state-metrics-578c45fd8-q64gq 1/1 Running 3 (24d ago) 63d app=prometheus,component=kube-state-metrics,heritage=Helm,pod-template-hash=578c45fd8,release=prometheus
  +
stacklight prometheus-node-exporter-hv7hf 1/1 Running 3 (24d ago) 63d app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
  +
stacklight prometheus-node-exporter-tmtt7 1/1 Running 3 (24d ago) 63d app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
  +
stacklight prometheus-node-exporter-z42vk 1/1 Running 3 (24d ago) 63d app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
  +
stacklight prometheus-relay-67bfdc6599-lhv4m 1/1 Running 3 (24d ago) 63d app=prometheus,component=relay,heritage=Helm,pod-template-hash=67bfdc6599,release=prometheus
  +
stacklight prometheus-server-0 2/2 Running 6 (24d ago) 63d app=prometheus,component=server,controller-revision-hash=prometheus-server-6dc78f8b48,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-server-0
  +
stacklight prometheus-server-1 2/2 Running 6 (24d ago) 63d app=prometheus,component=server,controller-revision-hash=prometheus-server-6dc78f8b48,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-server-1
  +
</PRE>
  +
  +
==Services==
  +
Набор подов для сервиса (service) определяется с помощью селектора.
  +
<BR>
  +
Аналогично, набор подов, которыми управляет Replication Controller также определяется с помощью селектора.
 
<BR> Для этих двух объектов может быть использован только селектор на основе точного соответствия (equality-based)
   
  +
Выглядеть это может примерно так:
  +
<PRE>
 
selector:
 
selector:
 
component: redis
 
component: redis
  +
</PRE>
Для более новых объектов Kubernetes, например, (Job, Deployment, Replica Set, Daemon Set) может быть использован селектор на основе соответствия набору (set-based). Например:
 
   
  +
Для более новых объектов Kubernetes, например, (Job, Deployment, Replica Set, Daemon Set) может быть использован селектор на основе соответствия набору (set-based). Например:
  +
<PRE>
 
selector:
 
selector:
 
matchLabels:
 
matchLabels:
Строка 109: Строка 144:
 
- {key: tier, operator: In, values: [cache]}
 
- {key: tier, operator: In, values: [cache]}
 
- {key: environment, operator: NotIn, values: [dev]}
 
- {key: environment, operator: NotIn, values: [dev]}
  +
</PRE>
На этом с метками и селекторами все, в следующей статье рассмотрим неймспейсы (namespaces) в Kubernetes.
 

Текущая версия на 16:01, 8 января 2024


Labels and Selectors

(аннотации - отдельно https://habr.com/ru/companies/slurm/articles/739920/)

Labels

Labels представляют собой пары ключ/значение, которые назначаются объектам (например, подам) в кластере Kubernetes.
Эти метки предназначены для указания идентифицирующих атрибутов объектов, осмысленных и имеющих отношение к пользователям.
Метки чаще всего используются для выбора подмножеств и организации объектов в кластере. В данном случае под “организацией” следует понимать возможность пользователей сопоставлять свои собственные организационные структуры и системные объекты, не требуя от клиентов хранить эти сопоставления.

Метки могут прикрепляться к объектам во время создания или же добавляться (и изменяться) в любое время. Каждый объект в кластере Kubernetes может иметь собственный набор ключей/значений.

Каждый ключ должен быть уникальным для данного объекта:

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

В зависимости от конкретных требований проекта, подхода к разработке и тестированию, используемых технологий, бюджета (и прочих факторов) для доставки приложения конечному пользователю у вас может быть несколько датацентров/кластеров, разные наборы нод в кластере (отличающиеся, например по CPU), несколько различных окружений, множество микросервисов и т. д. С помощью меток можно “задокументировать” запущенные в кластере объекты в понятном для пользователя формате, а также использовать метки в селекторах, что существенно упрощает управление инфраструктурой.

Пример наиболее часто используемых меток:

  • "release" : "stable", "release" : "canary"
  • "environment" : "dev", "environment" : "qa", "environment" : "production"
  • "tier" : "frontend", "tier" : "backend", "tier" : "cache"
  • "track" : "daily", "track" : "weekly"

Можно использовать свои собственные обозначения, главное помнить, что ключ метки должен быть уникальным для объекта.
Корректные имена ключей в метках состоят из двух сегментов: опционального префикса и имени, разделенных символом /. Имя - обязательная часть - должно начинаться и заканчиваться буквенно-цифровым символом ([a-z0-9A-Z]), может содержать в себе дефисы (-), подчеркивания (_) и точки (.). Максимально допустимая длина имени ключа - 63 символа.
Опциональный префикс (если определен) должен быть DNS-поддоменом (разрешается использование точек) не длиннее 253 символов и заканчиваться символом /.

Например, префикс kubernetes.io/ зарезервирован для основных компонентов Kubernetes.

Значения меток, так же как и имена ключей, должны начинаться и заканчиваться буквенно-цифровым символом ([a-z0-9A-Z]), содержать в себе дефисы (-), подчеркивания (_) и точки (.). Максимально допустимая длина значения метки - 63 символа.

selector

С использованием селектора меток (label selector) в кластере Kubernetes пользователь может идентифицировать набор объектов.
Селектор - это примитив основной группировки в Kubernetes. В данный момент API поддерживает два вида селекторов - основанных на точном соответствии (equality-based) и на соответствии набору (set-based).
Если в селекторе указывается несколько соответствий, то они должны быть перечислены через запятую - в данном случае для их объединения будет использоваться логический оператор AND (&&).
Селектор, основанный на точном соответствии поддерживает только три возможных оператора сравнения

  • =
  • ==
  • !=

первые два из них означают равенство, третий - неравенство. Например:

environment = production
tier != frontend
<PRE>
В данном примере селектор выберет все ресурсы, у который ключ environment соответствует значению production, а также те ресурсы, у которых ключ tier не равен frontend (в том числе ресурсы, у которых нет ключа tier).
<BR>
Можно для примера использовать с kubectl (-l)
kubectl get pod -A --show-labels=true -l app=stacklight-helm-controller
NAMESPACE    NAME                                          READY   STATUS    RESTARTS      AGE   LABELS
stacklight   stacklight-helm-controller-7d7c8b848f-28cmz   1/1     Running   3 (24d ago)   63d   app=stacklight-helm-controller,pod-template-hash=7d7c8b848f
stacklight   stacklight-helm-controller-7d7c8b848f-gmq6c   1/1     Running   3 (24d ago)   63d   app=stacklight-helm-controller,pod-template-hash=7d7c8b848f
stacklight   stacklight-helm-controller-7d7c8b848f-nfshc   1/1     Running   3 (24d ago)   63d   app=stacklight-helm-controller,pod-template-hash=7d7c8b848f


Селектор, основанный на соответствии набору также поддерживает три возможных оператора -

  • in
  • notin
  • exists

(последний используется только для проверки наличия/отсутствия ключа). Например:

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition

В данном примере, первая строка позволит выбрать все ресурсы, у которых есть ключ environment со значениями production или qa. Вторая строка выбирает ресурсы у которых есть ключ tier и любые значения кроме frontend и backend. Третья строка служит для выбора всех ресурсов, у которых в метках есть ключ partition (значения не проверяются), а четвертая - наоборот, выбирает ресурсы которые не имеют ключа partition.

Есть возможность комбинировать оба типа селекторов, например:

tier in (frontend, backend),environment!=qa

Несколько примеров использования селекторов с утилитой kubectl:

kubectl get pods -l environment=production,tier=frontend
kubectl get pods -l 'environment in (production),tier in (frontend)'
kubectl get pods -l 'environment in (production, qa)'
kubectl get pods -l 'environment,environment notin (frontend)'

Еще пример

kubectl  get pod -A --show-labels=true -l "app!=stacklight-helm-controller,app!=telegraf-ds-smart,app in (prometheus), release"
NAMESPACE    NAME                                            READY   STATUS    RESTARTS      AGE   LABELS
stacklight   prometheus-alertmanager-0                       1/1     Running   3 (24d ago)   63d   app=prometheus,component=alertmanager,controller-revision-hash=prometheus-alertmanager-58d8597ff5,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-alertmanager-0
stacklight   prometheus-alertmanager-1                       1/1     Running   3 (24d ago)   63d   app=prometheus,component=alertmanager,controller-revision-hash=prometheus-alertmanager-58d8597ff5,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-alertmanager-1
stacklight   prometheus-kube-state-metrics-578c45fd8-kx7qx   1/1     Running   3 (24d ago)   63d   app=prometheus,component=kube-state-metrics,heritage=Helm,pod-template-hash=578c45fd8,release=prometheus
stacklight   prometheus-kube-state-metrics-578c45fd8-q64gq   1/1     Running   3 (24d ago)   63d   app=prometheus,component=kube-state-metrics,heritage=Helm,pod-template-hash=578c45fd8,release=prometheus
stacklight   prometheus-node-exporter-hv7hf                  1/1     Running   3 (24d ago)   63d   app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
stacklight   prometheus-node-exporter-tmtt7                  1/1     Running   3 (24d ago)   63d   app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
stacklight   prometheus-node-exporter-z42vk                  1/1     Running   3 (24d ago)   63d   app=prometheus,component=node-exporter,controller-revision-hash=d5547ffbd,heritage=Helm,pod-template-generation=3,release=prometheus
stacklight   prometheus-relay-67bfdc6599-lhv4m               1/1     Running   3 (24d ago)   63d   app=prometheus,component=relay,heritage=Helm,pod-template-hash=67bfdc6599,release=prometheus
stacklight   prometheus-server-0                             2/2     Running   6 (24d ago)   63d   app=prometheus,component=server,controller-revision-hash=prometheus-server-6dc78f8b48,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-server-0
stacklight   prometheus-server-1                             2/2     Running   6 (24d ago)   63d   app=prometheus,component=server,controller-revision-hash=prometheus-server-6dc78f8b48,heritage=Helm,release=prometheus,statefulset.kubernetes.io/pod-name=prometheus-server-1

Services

Набор подов для сервиса (service) определяется с помощью селектора.
Аналогично, набор подов, которыми управляет Replication Controller также определяется с помощью селектора.
Для этих двух объектов может быть использован только селектор на основе точного соответствия (equality-based)

Выглядеть это может примерно так:

selector:
    component: redis

Для более новых объектов Kubernetes, например, (Job, Deployment, Replica Set, Daemon Set) может быть использован селектор на основе соответствия набору (set-based). Например:

selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}