В данной HOWTO мы исправим баг в древней версии nginx ingress controller v0.20.0 и научимся работать с зависимостями Go старых версий через dep + vendor.
Оригинал статьи взят по согласию автора с сайта 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-админа.