У меня есть диаграмма, которую я применяю с помощью helm v3, и когда я визуализирую ее локально, она выглядит так:
apiVersion: apps/v1
kind: Deployment
metadata:
name: RELEASE-NAME-generic
labels:
app: generic
chart: generic-1.1.2
release: RELEASE-NAME
heritage: Helm
app.kubernetes.io/name: generic
app.kubernetes.io/instance: RELEASE-NAME
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/version:
spec:
replicas: 1
selector:
matchLabels:
app: generic
release: RELEASE-NAME
template:
metadata:
labels:
app.kubernetes.io/name: generic
app.kubernetes.io/instance: RELEASE-NAME
spec:
imagePullSecrets:
- name: ""
containers:
- name: generic
image: ":"
imagePullPolicy: IfNotPresent
ports:
resources:
{}
Обратите внимание, что spec.selector.matchLabels
и spec.template.metadata.labels
здесь не совпадают. Это потенциально проблема, но это было только для теста.
Когда я применяю его к кластеру (GKE, последняя версия) и проверяю там yaml, это выглядит так (примерно);
apiVersion: apps/v1
kind: Deployment
metadata:
name: RELEASE-NAME-generic
labels:
app: generic
chart: generic-1.1.2
release: RELEASE-NAME
heritage: Helm
app.kubernetes.io/name: generic
app.kubernetes.io/instance: RELEASE-NAME
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/version:
spec:
replicas: 1
selector:
matchLabels:
app: generic
release: RELEASE-NAME
template:
metadata:
labels:
app: generic
release: RELEASE-NAME
spec:
imagePullSecrets:
- name: ""
containers:
- name: generic
image: ":"
imagePullPolicy: IfNotPresent
ports:
resources:
{}
spec.template.metadata.labels
был заменен метками в spec.selector.matchLabels
.
Теперь это имеет смысл с точки зрения рабочего развертывания, но я не могу найти это поведение нигде задокументировано ни в K8S, ни в Helm, и мне интересно, действительно ли это должно происходить, или я здесь схожу с ума ...
Эти метки добавляются для поиска ресурсов, управляемых Helm. Ниже вы можете найти некоторую информацию из документации:
Сайт Helm на github может быть полезен для понимания того, как работают метки и селекторы:
spec.selector.matchLabels, определенные в Развертывания/StatefulSets/DaemonSets >=v1/beta2 не должны содержать метка helm.sh/chart или любая метка, содержащая версию диаграммы, потому что селектор неизменяем. Строка метки диаграммы содержит версия, поэтому, если она указана, всякий раз, когда версия Chart.yaml изменения, попытка Хелма изменить это неизменяемое поле приведет к обновить до отказа.
Дополнительная информация на сайте helm:
Элемент метаданных должен быть меткой при следующих условиях:
Он используется Kubernetes для идентификации этого ресурса. предоставлять операторам с целью запроса системы. Для Например, мы предлагаем использовать helm.sh/chart: NAME-VERSION в качестве метки, чтобы что операторы могут легко найти все экземпляры конкретный график для использования.
Если элемент метаданных не используется для запроса, он должен быть установлен как вместо этого аннотация.