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"
Interesuje Cię temat konteneryzacji i Kubernetes? Potrzebujesz tej wiedzy w projekcie? Nie czekaj dołącz do kursu Poznaj Kubernetes – Właśnie trwa przedsprzedaż, która kończy się 18 września o godzinie 21:00 – KLIKNIJ BY KUPIĆ

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 ;)

O tym i innych problemach na które możesz natrafić w trakcie pracy z kubernetes mówimy na kursie Poznaj Kubernetes