- Подготовка
- Изучение существующих рабочих нагрузок
- Указание рабочих нагрузок с помощью HULL
- Автоматизированное создание селекторов.
- Указание шаблона стручка template
- Главный контейнер name.
- Функция imagePullSecrets и image.registry
- Динамическое создание args
- Разделение конфигурации на hull.config.specific
- Собираем все вместе
- Завершение
Подготовка
В этой части учебника создаются объекты рабочей нагрузки. Объект рабочей нагрузки имеет в своей основе pod, в котором контейнеры выполняют код. Наиболее важными типами рабочих нагрузок являются Deployments, DaemonSets, StatefulSets, Jobs и CronJobs.
Прежде всего, мы снова скопируем нашу рабочую таблицу из предыдущей части руководства в новую папку таким же образом, как мы делали это раньше. Перейдите в рабочий каталог и выполните команду:
cd ~/kubernetes-dashboard-hull && cp -R 04_rbac/ 05_workloads && cd 05_workloads/kubernetes-dashboard-hull
Как и раньше, для удаления HULL hull.objects
из values.full.yaml
и копирования текущего hull.config
в values.yaml
выполните следующее:
sed '/ objects:/Q' values.full.yaml > values.yaml
и проверьте результат:
cat values.yaml
выглядит как:
metrics-server:
enabled: false
hull:
config:
specific:
rbac:
clusterReadOnlyRole: false
clusterRoleMetrics: true
settings: {}
pinnedCRDs: {}
Если да, то вы можете приступать к следующей части руководства.
Изучение существующих рабочих нагрузок
Теперь, когда подготовка закончена, сначала выясните, какие из упомянутых объектов рабочей нагрузки присутствуют в исходном графике:
find ../kubernetes-dashboard/templates -type f -iregex '.*(deployment|daemonset|statefulset|job).*' | sort
какие возвращаются:
../kubernetes-dashboard/templates/deployment.yaml
Только развертывание dashboard
, но этого будет достаточно для объяснения процесса.
Указание рабочих нагрузок с помощью HULL
Теперь проверьте развертывание templates/deployment.yaml
:
cat ../kubernetes-dashboard/templates/deployment.yaml
который определяется следующим образом:
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "kubernetes-dashboard.fullname" . }}
annotations:
{{- if .Values.commonAnnotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
{{- with .Values.annotations }}
{{ toYaml . | nindent 4 }}
{{- end }}
labels:
{{- include "kubernetes-dashboard.labels" . | nindent 4 }}
app.kubernetes.io/component: kubernetes-dashboard
{{- with .Values.labels }}
{{ toYaml . | nindent 4 }}
{{- end }}
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
spec:
replicas: {{ .Values.replicaCount }}
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
{{ include "kubernetes-dashboard.matchLabels" . | nindent 6 }}
app.kubernetes.io/component: kubernetes-dashboard
template:
metadata:
annotations:
{{- if .Values.podAnnotations }}
{{- include "common.tplvalues.render" (dict "value" .Values.podAnnotations "context" $) | nindent 8 }}
{{- end }}
labels:
{{- include "kubernetes-dashboard.labels" . | nindent 8 }}
app.kubernetes.io/component: kubernetes-dashboard
{{- if .Values.podLabels }}
{{- include "common.tplvalues.render" (dict "value" .Values.podLabels "context" $) | nindent 8 }}
{{- end }}
spec:
{{- with .Values.securityContext }}
securityContext:
{{ toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ template "kubernetes-dashboard.serviceAccountName" . }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
args:
- --namespace={{ .Release.Namespace }}
{{- if not .Values.protocolHttp }}
- --auto-generate-certificates
{{- end }}
{{- if .Values.metricsScraper.enabled }}
- --sidecar-host=http://127.0.0.1:8000
{{- else }}
- --metrics-provider=none
{{- end }}
{{- with .Values.extraArgs }}
{{ toYaml . | nindent 10 }}
{{- end }}
{{- with .Values.extraEnv }}
env:
{{ toYaml . | nindent 10 }}
{{- end }}
ports:
{{- if .Values.protocolHttp }}
- name: http
containerPort: 9090
protocol: TCP
{{- else }}
- name: https
containerPort: 8443
protocol: TCP
{{- end }}
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
{{- with .Values.extraVolumeMounts }}
{{ toYaml . | nindent 8 }}
{{- end }}
livenessProbe:
httpGet:
{{- if .Values.protocolHttp }}
scheme: HTTP
path: /
port: 9090
{{- else }}
scheme: HTTPS
path: /
port: 8443
{{- end }}
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
{{- with .Values.resources }}
resources:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- with .Values.containerSecurityContext }}
securityContext:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- if .Values.metricsScraper.enabled }}
- name: dashboard-metrics-scraper
image: "{{ .Values.metricsScraper.image.repository }}:{{ .Values.metricsScraper.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
{{- with .Values.metricsScraper.args }}
args:
{{ toYaml . | nindent 10 }}
{{- end }}
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
volumeMounts:
- mountPath: /tmp
name: tmp-volume
{{- if .Values.metricsScraper.containerSecurityContext }}
securityContext:
{{ toYaml .Values.metricsScraper.containerSecurityContext | nindent 10 }}
{{- else if .Values.containerSecurityContext}}
securityContext:
{{ toYaml .Values.containerSecurityContext | nindent 10 }}
{{- end }}
{{- with .Values.metricsScraper.resources }}
resources:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- end }}
{{- with .Values.image.pullSecrets }}
imagePullSecrets:
{{- range . }}
- name: {{ . }}
{{- end }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.priorityClassName }}
priorityClassName: "{{ . }}"
{{- end }}
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: {{ template "kubernetes-dashboard.fullname" . }}-certs
- name: tmp-volume
emptyDir: {}
{{- with .Values.extraVolumes }}
{{ toYaml . | nindent 6 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{ toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{ toYaml . | nindent 8 }}
{{- end }}
Многие диаграммы Helm полны сопоставлений 1:1 между свойствами values.yaml
и свойствами целевого объекта того же типа в файлах /templates
. Примерами для приведенного выше развертывания являются:
{{- with .Values.securityContext }}
securityContext:
{{ toYaml . | nindent 8 }}
{{- with .Values.containerSecurityContext }}
securityContext:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- with .Values.metricsScraper.resources }}
resources:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- with .Values.image.pullSecrets }}
imagePullSecrets:
{{- range . }}
- name: {{ . }}
{{- end }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | nindent 8 }}
{{- end }}
Есть еще несколько вариантов, но суть отображения 1:1 должна быть ясна.
Здесь проявляется одна из, а может быть, и главная сила HULL: установка любого свойства объекта может быть сделана напрямую без необходимости написания повторяющегося кода в стиле boilerplate:
если это значение предоставлено в
values.yaml
, то вставьте его сюда в шаблон «как есть».
Используя HULL, все показанные блоки кода можно игнорировать для нашего преобразования, потому что мы можем настроить свойства без каких-либо дополнительных действий во время конфигурации/развертывания, если это необходимо. Нет необходимости в дополнительном запросе на исправление, чтобы сделать их настраиваемыми, они всегда доступны, если потребуется их изменение.
Автоматизированное создание селекторов
.
Селекторы для капсул автоматически создаются HULL и учитывают уникальную комбинацию метаданных меток:
app.kubernetes.io/component: default
app.kubernetes.io/instance: release-name
app.kubernetes.io/name: kubernetes-dashboard
в расчет. Поскольку эти поля автоматически заполняются на уровне рабочей нагрузки и метки стручка, больше ничего не нужно указывать.
Указание шаблона стручка template
Это новые и интересные аспекты при изучении спецификации стручков Deployments, с которыми нам нужно разобраться:
Главный контейнер name
.
Небольшое замечание о фактическом имени главного контейнера, которое зависит от имени графика в исходном графике kubernetes-dashboard
:
- name: {{ .Chart.Name }}
Здесь имя контейнера всегда будет обращаться к kubernetes-dashboard
, но оно также может быть привязано к какому-то другому значению в values.yaml
. Поскольку в HULL имя определяется ключом контейнера, изменение ключа в конфигурации, специфичной для системы, потребует переопределения содержимого всех контейнеров, что нежелательно. Поэтому в HULL-версии схемы вам придется придерживаться статически определенного имени контейнера kubernetes-dashboard
, но обычно имена контейнеров имеют минимальное значение для развертывания.
Функция imagePullSecrets
и image.registry
Несколько слов о imagePullSecrets
: их очень легко настроить и использовать с HULL во всех рабочих нагрузках, о чем следует кратко рассказать.
Во-первых, HULL разделяет определение образа контейнеров на три части, которые объединяются для формирования значения image
в спецификации Pod:
registry
repository
tag
где ведущая часть реестра является необязательной.
Во-вторых, существует специальный тип объекта registry
, в котором вы можете указать секреты реестра Docker. Благодаря специальным полям registry
в определении image
и специальным объектам registry
, HULL по умолчанию добавляет все объекты registry
, созданные в HULL, как imagePullSecrets
в спецификацию pod, так что изображения всегда доступны для извлечения, даже если они хранятся в настроенном защищенном реестре. Если такое поведение нежелательно, вы можете отключить эту функцию, просто установив createImagePullSecretsFromRegistries
в false в конфигурации HULL следующим образом:
hull:
config:
general:
createImagePullSecretsFromRegistries: false
Однако вы можете объединить эту возможность с возможностью установить все поля registry
в общее значение. Это допустимо либо при использовании фиксированного имени server
реестра (для которого секрет реестра Docker развернут вне графика Helm), либо при использовании server
, определенного в первом найденном секрете реестра, который настроен в том же графике.
Для примера реальной ситуации представьте, что вы размещаете все образы Docker, на которые ссылается ваш график Helm, в одном месте — то есть в одном реестре Docker. Теперь вы можете захотеть сменить провайдера реестра Docker — и, следовательно, конечную точку — или вам нужно скопировать все образы Docker на систему airgapped и разместить их в локальном защищенном реестре, таком как Harbor. В обоих случаях вы можете захотеть централизованно изменить адрес сервера реестра без необходимости настраивать каждый pod specs imagePullSecrets
и каждый контейнер image
по отдельности.
Для использования статического имени сервера вы можете заполнить поле hull.config.general.defaultImageRegistryServer
, для этого вам потребуется самостоятельно добавить imagePullSecrets
в спецификации pod. Если вы определяете реестр в той же схеме, вы можете просто включить hull.config.general.defaultImageRegistryToFirstRegistrySecretServer
и все будет сделано автоматически в плане imagePullSecrets
и registry
.
Обратитесь к документации и следующим переключателям config
:
hull:
config:
general:
defaultImageRegistryServer:
defaultImageRegistryToFirstRegistrySecretServer:
для получения более подробной информации о том, как работать с этой функцией.
Динамическое создание args
Раздел args
требует использования преобразования HULL для создания массива аргументов, соответствующего динамической природе построения аргументов.
Разделение конфигурации на hull.config.specific
Множество специфических свойств pod ссылаются на свойства в разделе .Values.metricsScraper
в исходных таблицах values.yaml
:
{{- if .Values.metricsScraper.enabled }}
- --sidecar-host=http://127.0.0.1:8000
{{- else }}
- --metrics-provider=none
{{- end }}
и:
{{- if .Values.metricsScraper.enabled }}
- name: dashboard-metrics-scraper
image: "{{ .Values.metricsScraper.image.repository }}:{{ .Values.metricsScraper.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
{{- with .Values.metricsScraper.args }}
args:
{{ toYaml . | nindent 10 }}
{{- end }}
ports:
- containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
volumeMounts:
- mountPath: /tmp
name: tmp-volume
{{- if .Values.metricsScraper.containerSecurityContext }}
securityContext:
{{ toYaml .Values.metricsScraper.containerSecurityContext | nindent 10 }}
{{- else if .Values.containerSecurityContext}}
securityContext:
{{ toYaml .Values.containerSecurityContext | nindent 10 }}
{{- end }}
{{- with .Values.metricsScraper.resources }}
resources:
{{ toYaml . | nindent 10 }}
{{- end }}
{{- end }}
По сути, это сводится к опциональному контейнеру dashboard-metrics-scraper
, который может быть включен по желанию. Соответствующий раздел находится в values.yaml
:
cat ../kubernetes-dashboard/values.yaml | grep "metricsScraper" -B 4 -A 17
выглядит следующим образом:
## Metrics Scraper
## Container to scrape, store, and retrieve a window of time from the Metrics Server.
## refs: https://github.com/kubernetes-sigs/dashboard-metrics-scraper
metricsScraper:
## Wether to enable dashboard-metrics-scraper
enabled: false
image:
repository: kubernetesui/metrics-scraper
tag: v1.0.7
resources: {}
## SecurityContext especially for the kubernetes dashboard metrics scraper container
## If not set, the global containterSecurityContext values will define these values
# containerSecurityContext:
# allowPrivilegeEscalation: false
# readOnlyRootFilesystem: true
# runAsUser: 1001
# runAsGroup: 2001
# args:
# - --log-level=info
# - --logtostderr=true
Чтобы смоделировать это в вашей диаграмме HULL, вы можете просто предопределить контейнер бокового автомобиля и установить enabled: false
для него, так что он будет вести себя так же, как и в оригинальной диаграмме. Что касается ссылки в args
, она может быть связана со свойством enabled
. Конечно, вы можете сослаться и указать свойство metricsScraper.enabled
в разделе hull.config.specific
, чтобы выделить саму функцию, но в данном руководстве это не делается. Самым важным для правильной диаграммы Helm является документирование values.yaml
соответствующим образом, как metricsScraper
может быть включен, для краткости документация и комментарии к values.yaml
обычно опускаются.
Возвращаясь к спецификации pod, свойство .Values.protocolHttp
также многократно используется:
{{- if not .Values.protocolHttp }}
- --auto-generate-certificates
{{- end }}
и:
{{- if .Values.protocolHttp }}
- name: http
containerPort: 9090
protocol: TCP
{{- else }}
- name: https
containerPort: 8443
protocol: TCP
{{- end }}
Это свойство подходит для добавления в раздел hull.config.specific
для централизованного переключения в режим HTTP. Такие свойства, как эти, можно рассматривать как пользовательские, более абстрактные свойства, которые не имеют прямого отношения к одному свойству объекта, но контролируют несколько аспектов, возможно, даже нескольких объектов. Другие свойства — это более конкретные свойства, которые непосредственно связаны со свойством объекта (например, imagePullPolicy
, affinity
, tolerations
, …).
Пользовательские абстрактные свойства лучше всего моделировать где-нибудь в hull.config.specific
, но конкретные свойства лучше всего определять во время развертывания конфигуратором графика, добавление перенаправления на hull.config.specific
может загромождать конфигурационную прозрачность.
Но есть и исключения, например, график Helm позволяет развернуть свое приложение как Deployment или DaemonSet и разделяет большое количество конфигурации обоих объектов через общее определение шаблона pod:
-
Если вы стремитесь к прозрачности, лучше всего определять свойства непосредственно на объектах DaemonSet и Deployment, чтобы одно и то же свойство могло иметь разные значения для обоих объектов.
Преимущество здесь в том, что проще понять, где определено значение свойства каждого объекта, если оно вообще определено, и как его можно изменить.
Недостатком является то, что это ослабляет вероятное намерение иметь DaemonSet и Deployment как можно более похожими, поскольку позволяет невольно иметь нежелательные различия между ними.
-
Если вы стремитесь к абстракции, вам следует определить все свойства, на которые ссылаются как Deployment, так и DaemonSet в разделе
hull.config.specific
и ссылаться на центральные значения.Недостатком является то, что это больше скрывает, откуда берется значение свойства, и требует гораздо больше усилий для настройки диаграммы.
Преимущества в том, что намерение иметь DaemonSet и Deployment настолько похожими, насколько это возможно, лучше реализуется, и по-прежнему можно будет перезаписать любое отдельное свойство на уровне объекта, если захочется.
Собираем все вместе
Итак, сначала вставьте новое свойство hull.config.specific
, чтобы на него можно было ссылаться:
sed '/^ssssspecific/r'<(
echo " protocolHttp: false"
) -i -- values.yaml
Отлично, теперь при написании Deployment spec значения свойств по умолчанию могут быть взяты из соответствующих полей в оригинальном values.yaml
, где они указаны. Например, values.yaml
содержит значения по умолчанию для securityContext
‘ов:
cat ../kubernetes-dashboard/values.yaml | grep "securityContext" -B 3 -A 12
стручка и главного контейнера и закомментированное предложение для контейнера metricsScraper
:
## SecurityContext to be added to kubernetes dashboard pods
## To disable set the following configuration to null:
# securityContext: null
securityContext:
seccompProfile:
type: RuntimeDefault
## SecurityContext defaults for the kubernetes dashboard container and metrics scraper container
## To disable set the following configuration to null:
# containerSecurityContext: null
containerSecurityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
--
## Maximum unavailable instances; ignored if there is no PodDisruptionBudget
maxUnavailable:
## PodSecurityContext for pod level securityContext
# securityContext:
# runAsUser: 1001
# runAsGroup: 2001
networkPolicy:
# Whether to create a network policy that allows/restricts access to the service
enabled: false
## podSecurityPolicy for fine-grained authorization of pod creation and updates
podSecurityPolicy:
# Specifies whether a pod security policy should be created
enabled: false
Многие другие поля, которые имеют простые значения по умолчанию в kubernetes-dashboard
‘s values.yaml
могут быть скопированы в нашу новую спецификацию развёртывания на основе HULL, среди них image
, resources
и imagePullSecrets
.
Другие структуры YAML в Deployment представляют собой смесь статического содержимого и шаблонизированных частей, взгляните на оригинальный args
:
args:
- --namespace={{ .Release.Namespace }}
{{- if not .Values.protocolHttp }}
- --auto-generate-certificates
{{- end }}
{{- if .Values.metricsScraper.enabled }}
- --sidecar-host=http://127.0.0.1:8000
{{- else }}
- --metrics-provider=none
{{- end }}
{{- with .Values.extraArgs }}
{{ toYaml . | nindent 10 }}
{{- end }}
или полностью построены на основе шаблонизационных решений, как ports
:
ports:
{{- if .Values.protocolHttp }}
- name: http
containerPort: 9090
protocol: TCP
{{- else }}
- name: https
containerPort: 8443
protocol: TCP
{{- end }}
Для воспроизведения такого поведения вы можете использовать преобразование _HT!
HULL для полного моделирования массивов или словарей по желанию или — в случае более простого решения «либо/либо» для портов
— вы можете использовать подключение свойства enabled
отдельных определений портов к условию, как показано далее. HULL предлагает гибкость для моделирования конфигурации так, как вы считаете нужным.
Итак, это предложение для моделирования предложенной спецификации развертывания для диаграммы kubernetes-dashboard-hull
:
echo ' objects:
deployment:
dashboard:
enabled: true
replicas: 1
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
pod:
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
dashboard:
image:
repository: kubernetesui/dashboard
tag: v2.5.0
imagePullPolicy: IfNotPresent
args: _HT![
{{- $p := (index . "$") }}
"--namespace={{ $p.Release.Namespace }}",
{{- if not $p.Values.hull.config.specific.protocolHttp }}
"--auto-generate-certificates",
{{- end }}
{{- if $p.Values.hull.objects.deployment.dashboard.pod.containers.metricsscraper.enabled }}
"--sidecar-host=http://127.0.0.1:8000",
{{- else }}
"--metrics-provider=none",
{{- end }}
]
ports:
http:
enabled: _HT?(index . "$").Values.hull.config.specific.protocolHttp
containerPort: 9090
protocol: TCP
https:
enabled: _HT?(not (index . "$").Values.hull.config.specific.protocolHttp)
containerPort: 8443
protocol: TCP
volumeMounts:
dashboard:
name: kubernetes-dashboard-certs
mountPath: /certs
tmp:
name: tmp-volume
mountPath: /tmp
livenessProbe: |-
_HT!{
httpGet: {
path: /,
scheme: {{ (index . "$").Values.hull.config.specific.protocolHttp | ternary "HTTP" "HTTPS" }},
port: {{ (index . "$").Values.hull.config.specific.protocolHttp | ternary 9090 8443 }}
}
}
initialDelaySeconds: 30
timeoutSeconds: 30
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 2
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
metricsscraper:
enabled: false
image:
repository: kubernetesui/metrics-scraper
tag: v1.0.7
imagePullPolicy: IfNotPresent
ports:
tcp:
containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
tmp:
name: tmp-volume
mountPath: /tmp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
kubernetes-dashboard-certs:
secret:
secretName: certs
tmp-volume:
emptyDir: {}' >> values.yaml
Все ли отображается так, как ожидалось?
helm template -f ../configs/disable-default-rbac.yaml .
выдает:
---
# Source: kubernetes-dashboard/templates/hull.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}
labels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubernetes-dashboard
app.kubernetes.io/part-of: undefined
app.kubernetes.io/version: 2.5.0
helm.sh/chart: kubernetes-dashboard-5.2.0
name: release-name-kubernetes-dashboard-dashboard
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/name: kubernetes-dashboard
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
annotations: {}
labels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubernetes-dashboard
app.kubernetes.io/part-of: undefined
app.kubernetes.io/version: 2.5.0
helm.sh/chart: kubernetes-dashboard-5.2.0
spec:
containers:
- args:
- --namespace=default
- --auto-generate-certificates
- --metrics-provider=none
env: []
envFrom: []
image: kubernetesui/dashboard:v2.5.0
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /
port: 8443
scheme: HTTPS
name: dashboard
ports:
- containerPort: 8443
name: https
protocol: TCP
resources:
limits:
cpu: 2
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsGroup: 2001
runAsUser: 1001
volumeMounts:
- mountPath: /certs
name: kubernetes-dashboard-certs
- mountPath: /tmp
name: tmp-volume
imagePullSecrets: []
initContainers: []
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: release-name-kubernetes-dashboard-certs
- emptyDir: {}
name: tmp-volume
Все должно быть так, как ожидалось. Как насчет переключения на HTTP и включения metricsscraper
для теста?
echo 'hull:
config:
specific:
protocolHttp: true
objects:
deployment:
dashboard:
pod:
containers:
metricsscraper:
enabled: true' > ../configs/enable-http-scraper.yaml
&& helm template -f ../configs/disable-default-rbac.yaml -f ../configs/enable-http-scraper.yaml .
и вы увидите, что вывод args
, ports
и livenessProbe
изменился, чтобы отразить изменение свойства protocolHttp
, а контейнер metricsscraper
активирован:
---
# Source: kubernetes-dashboard/templates/hull.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}
labels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubernetes-dashboard
app.kubernetes.io/part-of: undefined
app.kubernetes.io/version: 2.5.0
helm.sh/chart: kubernetes-dashboard-5.2.0
name: release-name-kubernetes-dashboard-dashboard
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/name: kubernetes-dashboard
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
annotations: {}
labels:
app.kubernetes.io/component: dashboard
app.kubernetes.io/instance: release-name
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubernetes-dashboard
app.kubernetes.io/part-of: undefined
app.kubernetes.io/version: 2.5.0
helm.sh/chart: kubernetes-dashboard-5.2.0
spec:
containers:
- args:
- --namespace=default
- --sidecar-host=http://127.0.0.1:8000
env: []
envFrom: []
image: kubernetesui/dashboard:v2.5.0
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /
port: 9090
scheme: HTTP
name: dashboard
ports:
- containerPort: 9090
name: http
protocol: TCP
resources:
limits:
cpu: 2
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsGroup: 2001
runAsUser: 1001
volumeMounts:
- mountPath: /certs
name: kubernetes-dashboard-certs
- mountPath: /tmp
name: tmp-volume
- env: []
envFrom: []
image: kubernetesui/metrics-scraper:v1.0.7
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /
port: 8000
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 30
name: metricsscraper
ports:
- containerPort: 8000
name: tcp
protocol: TCP
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsGroup: 2001
runAsUser: 1001
volumeMounts:
- mountPath: /tmp
name: tmp-volume
imagePullSecrets: []
initContainers: []
securityContext:
seccompProfile:
type: RuntimeDefault
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: release-name-kubernetes-dashboard-certs
- emptyDir: {}
name: tmp-volume
Завершение
Спасибо за ваш интерес, ваш values.yaml
должен выглядеть следующим образом:
metrics-server:
enabled: false
hull:
config:
specific:
protocolHttp: false
rbac:
clusterReadOnlyRole: false
clusterRoleMetrics: true
settings: {}
pinnedCRDs: {}
objects:
deployment:
dashboard:
enabled: true
replicas: 1
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
pod:
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
dashboard:
image:
repository: kubernetesui/dashboard
tag: v2.5.0
imagePullPolicy: IfNotPresent
args: _HT![
{{- $p := (index . "$") }}
"--namespace={{ $p.Release.Namespace }}",
{{- if not $p.Values.hull.config.specific.protocolHttp }}
"--auto-generate-certificates",
{{- end }}
{{- if $p.Values.hull.objects.deployment.dashboard.pod.containers.metricsscraper.enabled }}
"--sidecar-host=http://127.0.0.1:8000",
{{- else }}
"--metrics-provider=none",
{{- end }}
]
ports:
http:
enabled: _HT?(index . "$").Values.hull.config.specific.protocolHttp
containerPort: 9090
protocol: TCP
https:
enabled: _HT?(not (index . "$").Values.hull.config.specific.protocolHttp)
containerPort: 8443
protocol: TCP
volumeMounts:
dashboard:
name: kubernetes-dashboard-certs
mountPath: /certs
tmp:
name: tmp-volume
mountPath: /tmp
livenessProbe: |-
_HT!{
httpGet: {
path: /,
scheme: {{ (index . "$").Values.hull.config.specific.protocolHttp | ternary "HTTP" "HTTPS" }},
port: {{ (index . "$").Values.hull.config.specific.protocolHttp | ternary 9090 8443 }}
}
}
initialDelaySeconds: 30
timeoutSeconds: 30
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 2
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
metricsscraper:
enabled: false
image:
repository: kubernetesui/metrics-scraper
tag: v1.0.7
imagePullPolicy: IfNotPresent
ports:
tcp:
containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8000
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
tmp:
name: tmp-volume
mountPath: /tmp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsUser: 1001
runAsGroup: 2001
volumes:
kubernetes-dashboard-certs:
secret:
secretName: certs
tmp-volume:
emptyDir: {}
Снова сделайте резервную копию готового values.yaml
в values.tutorial-part.yaml
на случай, если вы захотите изменить, поиграть или начать с нуля values.yaml
:
cp values.yaml values.tutorial-part.yaml
и добавьте объекты, созданные в предыдущем уроке:
sed '1,/objects:/d' values.full.yaml > _tmp && cp values.yaml values.full.yaml && cat _tmp >> values.full.yaml && rm _tmp
Надеюсь увидеть вас в следующем уроке по сервисам и ингрессам!