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

в 13:31, , рубрики: debug, Go, golang, kubernetes, Блог компании ДомКлик, ДомКлик, Программирование

В данной 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://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js