Как собрать NGINX Ingress Controller старой версии и пропатчить его

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

В данной HOWTO мы исправим баг в древней версии nginx ingress controller v0.20.0 и научимся работать с зависимостями Go старых версий через dep + vendor.


simple


Оригинал статьи взят по согласию автора с сайта vitya.top.


Проблема


ingress-nginx версии v0.20.0 добавляет лишние слэши при rewrite. Это мешает бесшовной миграции на последнюю версию (v0.32.0), поэтому разработчикам в ряде случаев пришлось делать такую конструкцию:


path: /service/api/v1/tokens
rewrite-target: /api/v1/tokens

Если добавить / в конец YAML-объект типа Ingress, то ingress-nginx 0.20.0 начинает делать rewrite в /api/v1/tokens//. Отказаться от такой конструкции не получается, потому что кто-то обращается к сервису со слэшем в конце, а кто-то без.


Решили пропатчить старый NGINX Ingress, чтобы избавиться от досадного бага. А затем двигаться по плану:


  • Менять сначала пути и рерайты в ингрессах на человеческие (со слэшем на конце).
  • Мигрировать на новый Ingress Controller, запущенный на другом порту.

Но сначала, надо исправить проблему в исходниках контроллера старой версии.


Решение


В этих строках переменную location.Rewrite.Target изменить на strings.TrimSuffix(location.Rewrite.Target, "/").


Скачиваем исходники:


go get k8s.io/ingress-nginx
cd ~/go/src/k8.io/ingress-inginx

Переключаем на ветку, которую нужно пофиксить:


git checkout v0.20.0

Правим архитектуру в Makefile. чтобы не собирать лишнее 40 минут:


vim Makefile

(или sed -i -e 's/^ALL_ARCH.*/ALL_ARCH = amd64/g')


Вносим свои правки:


vim internal/ingress/controller/template/template.go +539

(здесь меняем переменную — см. "Цель")


Фиксим Docker-образ для сборки Go:


vim build/go-in-docker.sh

А именно:


  • меняем E2E_IMAGE на docker.myregistry.com/ops/golang:1.10.7-alpine3.8-v7;
  • удаляем в этом же файле --entrypoint ${FLAGS}.

Сохраняем правки:


git add -A
git commit -m "Fix trailing slash bug"

Устанавливаем зависимости для сборки:


dep ensure =v  # ключевой момент, без этого будет ругаться на internal инклуды

Запускаем сборку и ждём (минут 5):


make

tagged quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.20.0

Вешаем тэг и пушим:


docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.20.0 docker.myregistry.com/ops/nginx-ingress-controller:0.20.0-patched-2

docker push docker.myregistry.com/ops/nginx-ingress-controller:0.20.0-patched-2

Готово!


Кстати, мы ищем крутого Kubernetes-админа.

Источник: https://habr.com/ru/company/domclick/blog/502538/


Интересные статьи

Интересные статьи

Я давно знаком с Битрикс24, ещё дольше с 1С-Битрикс и, конечно же, неоднократно имел дела с интернет-магазинами которые работают на нём. Да, конечно это дорого, долго, местами неуклюже...
TL;DR: абсолютно устойчивых систем не существует, поэтому ответ — никак. Но можно значительно упростить себе жизнь с помощью Docker-контейнера bunkerized-nginx. О том, чем он отличае...
Иногда представляю себя продавцом старых устройств, и как я пытаюсь объяснить, чем они так хороши. Покупателю, который такие аппараты не особо застал. Отрицательно отвечаю на массу во...
В этой статье будет рассматриваться проект nginx-log-collector, который будет читать логи nginx, отправлять их в кластер Clickhouse. Обычно для логов используют ElasticSearch. Для Clickhouse треб...
История сегодня пойдёт про автосервис в Москве и его продвижении в течении 8 месяцев. Первое знакомство было ещё пару лет назад при странных обстоятельствах. Пришёл автосервис за заявками,...