Назад | Перейти на главную страницу

Kubernetes: проблемы с проверкой работоспособности / готовности в хранилище S3, размещенном в Docker Registry

Текущая настройка

Привет. Я использую диаграмму управления реестра Docker, развернутую с хранилищем S3. Теперь я хотел бы обновить (изменить) способ работы зондов в реальном времени / готовности. Причина в том, что после одного дня использования у меня закончился уровень бесплатного пользования. ежемесячно квота запросов LIST на AWS. Эта квота составляет 2000 запросов в месяц. Прямо сейчас зонды в модуле реестра выглядят следующим образом:

Liveness:       http-get http://:5000/ delay=0s timeout=1s period=10s #success=1 #failure=3
Readiness:      http-get http://:5000/ delay=0s timeout=1s period=10s #success=1 #failure=3

Эти запросы явно GET. Однако согласно этот ответ, эти запросы помечены как LIST компании AWS.

Это пользовательские значения (chart_values.yaml) Я использовал при установке Docker Registry в диаграмме управления:

storage: s3

secrets:
  htpasswd: "..."
  s3:
    accessKey: "..."
    secretKey: "..."

s3:
  region: "..."
  secure: true
  bucket: "..."

Выталкивание / вытягивание изображений работает должным образом.

Вопрос (см. Последнее изменение перефразированного вопроса)

Я знаю, что могу отредактировать конфигурацию развертывания, чтобы изменить periodSeconds зондов, скажем так 600s. Но я не думаю, что это оптимальное решение. Я знаю что команды живости существуют, но я не уверен, возможно ли это с помощью образа докера реестра по умолчанию.

Последнее, о чем я подумал, это то, что, возможно, если бы в образе докера реестра были включены метрики prometheus, я бы смог изменить зонды на :5001/metrics дорожка. Но я не совсем уверен, как это сделать.


РЕДАКТИРОВАТЬ:

Чтобы включить метрики Prometheus, я удалил свою предыдущую установку helm реестра докеров. Затем загрузил стабильная диаграмма докеров reigstry helm через helm pull stable/docker-registry --untar.

Затем я отредактировал шаблоны / deployment.yaml файл:

spec:
  containers:
    ports:
      - containerPort: 5000
      - containerPort: 5001     # Added this line
    livenessProbe:
      initialDelaySeconds: 1    # Added
      path: /metrics            # Edited
      port: 5001                # Edited
    readinessProbe:
      initialDelaySeconds: 10   # Added
      path: /metrics            # Edited
      port: 5001                # Edited
    env:
      # Added these env variables
      - name: REGISTRY_HTTP_DEBUG_ADDR
        value: "localhost:5001"
      - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED
        value: "true"
      - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_PATH
        value: /metrics

И шаблоны / service.yaml файл:

  ports:
    - port: {{ .Values.service.port }}
      protocol: TCP
      name: {{ .Values.service.name }}
      targetPort: 5000
    # Added these lines below
    - port: 5001
      protocol: TCP
      name: {{ .Values.service.name }}-prometheus
      targetPort: 5001

Линт и установка:

helm install registry ./docker-registry-chart/ -f chart_values.yaml -n docker-registry

Однако модуль реестра никогда не готов с этой конфигурацией (kubectl get показывает 0/1 на модуле). Это связано с ошибкой проверки готовности, поскольку 5001 containerPort не раскрывается. Таким образом, проверка готовности завершается ошибкой, так как не удается достичь сервера метрик.

Я могу подтвердить, что сервер метрик в контейнере Docker запускается правильно. Вот журналы модуля реестра, которые показывают, что сервер отладки (метрик) включен:

time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_ADDR" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_PORT" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5000_TCP_PROTO" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_ADDR" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_PORT" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_PORT_5001_TCP_PROTO" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_HOST" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT_REGISTRY" 
time="2020-04-10T14:36:26Z" level=warning msg="Ignoring unrecognized environment variable REGISTRY_DOCKER_REGISTRY_SERVICE_PORT_REGISTRY_PROMETHEUS" 
time="2020-04-10T14:36:26.172115809Z" level=info msg="debug server listening localhost:5001" 
time="2020-04-10T14:36:26.188154917Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
time="2020-04-10T14:36:26.194453749Z" level=info msg="Starting upload purge in 29m0s" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
time="2020-04-10T14:36:26.211140816Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 
time="2020-04-10T14:36:26.211497166Z" level=info msg="providing prometheus metrics on /metrics" 
time="2020-04-10T14:36:26.211894294Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=fc945824-3600-4343-8a18-75a20b07f695 service=registry version=v2.7.1 

Я даже могу выполнить exec в контейнере докера и завить localhost:5001/metrics что приводит к 200 с соответствующими данными Прометея.

Но я все еще не уверен, как выставить порт 5001 на контейнере. Я считаю, что это позволит мне использовать метрики с такими зондами, как @mdaniel упоминания в его ответ.


РЕДАКТИРОВАТЬ 2:

kubectl port-forward <registry_pod> 5001

Перенаправление модуля реестра работает, и я могу curl localhost:5001/metrics чтобы получить данные метрики Прометея. curl выполняется из кластера.

Мне интересно, что-то не так с моим шаблоны / service.yaml файл..?


РЕДАКТИРОВАТЬ 3: Я понял, в чем проблема. Недоступный сервис в порту 5001 был вызван неправильной настройкой REGISTRY_HTTP_DEBUG_ADDR к localhost:5001. В значение должно быть :5001.

Наконец, чтобы перевести это на то, как ваш шаблоны / deployment.yaml должно выглядеть так:

spec:
  containers:
    ports:
      - containerPort: 5000
      - containerPort: 5001     # Added this line
    livenessProbe:
      initialDelaySeconds: 1    # Added
      path: /metrics            # Edited
      port: 5001                # Edited
    readinessProbe:
      initialDelaySeconds: 10   # Added
      path: /metrics            # Edited
      port: 5001                # Edited
    env:
      # Added these env variables
      - name: REGISTRY_HTTP_DEBUG_ADDR
        value: ":5001"          # Make sure the addr field is left empty!
      - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED
        value: "true"
      - name: REGISTRY_HTTP_DEBUG_PROMETHEUS_PATH
        value: /metrics

Потенциально вы также можете предоставить переменные среды через chart_values.yaml файл с configData раздел (configData.http.debug.addr и т.д.).


В любом случае, я решил опубликовать "ответ"в качестве редактирования, а не обычного ответа SO. Исходный вопрос все еще остается без ответа.

Перефразировать исходный вопрос:

Я мог бы изменить зонды на путь: 5001 / metrics. Но я не совсем уверен, как это сделать

Поскольку вы не указали, как вы что-то устанавливали, никто не может дать вам конкретные команды, но я проверил диаграмма управления реестром докеров и, похоже, они не позволяют настраивать датчики живучести и готовности :-(

Так что вам придется использовать kubectl edit deploy $registry_deploy где $registry_deploy - это имя развертывания, в котором запущен реестр, затем обновите два блока зондов, чтобы указать, что вы хотите.

Просто имейте в виду, что пока /metrics endpoint - это отличный зонд живучести, он на самом деле делает правильные вещи, тыкая S3 во время готовность probe, поскольку Pod не должен обслуживать трафик, если он не может правильно подключиться к S3 с имеющимися у него учетными данными.