Учебное пособие по HULL 05: Определение объектов рабочей нагрузки


Подготовка

В этой части учебника создаются объекты рабочей нагрузки. Объект рабочей нагрузки имеет в своей основе 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
Войдите в полноэкранный режим Выход из полноэкранного режима

Надеюсь увидеть вас в следующем уроке по сервисам и ингрессам!

Оцените статью
Procodings.ru
Добавить комментарий