В данной 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-админа.