Ponad rok temu jak rozpoczynałem jeden projekt podałem prosty skrypt instalacyjny Ingress za pomocą helm. Jedno-linijkowa komenda, która śmigała przez ponad rok (i o dziwo dalej śmiga), nagle spowodowała, że nasze rozwiązanie przestało działać :) Trochę jak robienie wdrożenia w piątek…
Instalacja ingress (reverse proxy) była nam potrzebna by móc przekierowywać ruch do odpowiednich serwisów w zależności od ścieżki. Całość wyśmienicie działała i dało ją się zainstalować za pomocą polecenia:
helm install stable/nginx-ingress --name app-ingress --namespace app --set controller.replicaCount=1 --set controller.service.loadBalancerIP="12.12.12.12"
I ta piękna komenda śmigała aż do momentu… W Ingress korzystaliśmy z konfiguracji która robiła rewrite ścieżki z 12.12.12.12/name1/api
na /api
w serwisie name1
.
W lutym a dokładnie mówiąc w wersji 0.22 ingress zmienił się sposób określania rewrite z (kod pogrubiony):
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: app-ing namespace: app annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - path: /name1 backend: serviceName: name1-svc servicePort: 8080
Na:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: app-ing namespace: app annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - http: paths: - path: /name1/?(.*) backend: serviceName: name1-svc servicePort: 8080
Jeżeli nie podamy capture group to nasz URL nie zostanie przepisany (w dokumentacji to ładnie zaznaczyli, trzeba było jednak w nią najpierw zajrzeć), to znaczy: /name1/api/version
zostanie zamienione na /
a nie na /api/version
.
Problemu dałoby się uniknąć gdybyśmy od razu zaznaczyli z jakiej wersji ingress mamy korzystać przy instalacji za pomocą helm. Wystarczyło wykonać następującą komendę:
helm install stable/nginx-ingress --name app-ingress --namespace app --set controller.replicaCount=1 --set controller.service.loadBalancerIP="12.12.12.12" --version 0.26.0
Gdzie --version
to wersja chart, wersja paczki helmowej, a nie wersja ingressa. W pliku Chart.yaml jest podana zarówno wersja ingress jak i charts. Warto o tym pamiętać, bo można się też na tym dość łatwo przejechać.
Jak widać, przy pracy z Kubernetes bardzo ważne jest byśmy myśleli nie tylko o tym co teraz jest, ale także o tym co będzie za rok ;)