8

Próbuję skonfigurować Ingress w GCE Kubernetes. Ale kiedy odwiedzam kombinacji adresów IP i ścieżki zdefiniowanej w Ingress, wciąż otrzymuję następujący 502 błąd:Kubernetes Ingress (GCE) powraca błąd 502

Ingress 502 error


Oto co mam kiedy biegnę: kubectl describe ing --namespace dpl-staging

Name:   dpl-identity 
Namespace:  dpl-staging 
Address:  35.186.221.153 
Default backend: default-http-backend:80 (10.0.8.5:8080) 
TLS: 
    dpl-identity terminates 
Rules: 
    Host Path Backends 
    ---- ---- -------- 
    * 
     /api/identity/*  dpl-identity:4000 (<none>) 
Annotations: 
    https-forwarding-rule: k8s-fws-dpl-staging-dpl-identity--5fc40252fadea594 
    https-target-proxy:  k8s-tps-dpl-staging-dpl-identity--5fc40252fadea594 
    url-map:   k8s-um-dpl-staging-dpl-identity--5fc40252fadea594 
    backends:   {"k8s-be-31962--5fc40252fadea594":"HEALTHY","k8s-be-32396--5fc40252fadea594":"UNHEALTHY"} 
Events: 
    FirstSeen LastSeen Count From    SubObjectPath Type  Reason Message 
    --------- -------- ----- ----    ------------- -------- ------ ------- 
    15m  15m  1 {loadbalancer-controller }   Normal  ADD dpl-staging/dpl-identity 
    15m  15m  1 {loadbalancer-controller }   Normal  CREATE ip: 35.186.221.153 
    15m  6m  4 {loadbalancer-controller }   Normal  Service no user specified default backend, using system default 

Myślę, że problemem jest dpl-identity:4000 (<none>). Czy nie powinienem zobaczyć adresu IP usługi dpl-identity zamiast <none>?

Oto mój opis usługi: kubectl describe svc --namespace dpl-staging

Name:   dpl-identity 
Namespace:  dpl-staging 
Labels:   app=dpl-identity 
Selector:  app=dpl-identity 
Type:   NodePort 
IP:    10.3.254.194 
Port:   http 4000/TCP 
NodePort:  http 32396/TCP 
Endpoints:  10.0.2.29:8000,10.0.2.30:8000 
Session Affinity: None 
No events. 

Również tutaj jest wynikiem wykonywania: kubectl describe ep -n dpl-staging dpl-identity

Name:  dpl-identity 
Namespace: dpl-staging 
Labels:  app=dpl-identity 
Subsets: 
    Addresses:  10.0.2.29,10.0.2.30 
    NotReadyAddresses: <none> 
    Ports: 
    Name Port Protocol 
    ---- ---- -------- 
    http 8000 TCP 

No events. 

Oto moja deployment.yaml:

apiVersion: v1 
kind: Secret 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
type: Opaque 
data: 
    tls.key: <base64 key> 
    tls.crt: <base64 crt> 
--- 
apiVersion: v1 
kind: Service 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
    labels: 
    app: dpl-identity 
spec: 
    type: NodePort 
    ports: 
    - port: 4000 
     targetPort: 8000 
     protocol: TCP 
     name: http 
    selector: 
    app: dpl-identity 
--- 
apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
    labels: 
    app: dpl-identity 
    annotations: 
    kubernetes.io/ingress.allow-http: "false" 
spec: 
    tls: 
    - secretName: dpl-identity 
    rules: 
    - http: 
     paths: 
     - path: /api/identity/* 
      backend: 
      serviceName: dpl-identity 
      servicePort: 4000 
--- 
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
kind: Ingress 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
    labels: 
    app: dpl-identity 
    annotations: 
    kubernetes.io/ingress.allow-http: "false" 
spec: 
    tls: 
    - secretName: dpl-identity 
    rules: 
    - http: 
     paths: 
     - path: /api/identity/* 
      backend: 
      serviceName: dpl-identity 
      servicePort: 4000 
--- 
apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    namespace: dpl-staging 
    name: dpl-identity 
    labels: 
    app: dpl-identity 
spec: 
    replicas: 2 
    strategy: 
    type: RollingUpdate 
    template: 
    metadata: 
     labels: 
     app: dpl-identity 
    spec: 
     containers: 
     - image: gcr.io/munpat-container-engine/dpl/identity:0.4.9 
     name: dpl-identity 
     ports: 
     - containerPort: 8000 
      name: http 
     volumeMounts: 
     - name: dpl-identity 
      mountPath: /data 
     volumes: 
     - name: dpl-identity 
     secret: 
      secretName: dpl-identity 
+0

Czy można wykonać 'kubectl opisać ep-n dpl-staging dpl-identity'? –

+0

@JanosLenart: Zaktualizowałem swoją odpowiedź, podając wymagane informacje. Wielkie dzięki za pomoc. – Moon

Odpowiedz

14

Twój serwer pocztowy k8s-be-32396--5fc40252fadea594 jest wyświetlany jako "UNHEALTHY".

Ingress nie przekazuje ruchu, jeśli backend jest UNHEALTHY, spowoduje to błąd 502, który widzisz.

Będzie oznaczony jako NIEZWYKŁA, ponieważ nie przejdzie kontroli stanu, możesz sprawdzić ustawienie kontroli kondycji dla k8s-be-32396--5fc40252fadea594, aby sprawdzić, czy są odpowiednie dla twojego kapsuły, może to być polling identyfikator URI lub port, który nie zwraca odpowiedzi 200. Możesz znaleźć te ustawienia w Compute Engine> Health Checks.

Jeśli są poprawne, istnieje wiele kroków między przeglądarką a kontenerem, które mogą nieprawidłowo przekazywać ruch, możesz spróbować kubectl exec -it PODID -- bash (lub jesionu, jeśli używasz Alpine), a następnie spróbuj zwinąć localhost, aby sprawdzić, czy Kontener odpowiada zgodnie z oczekiwaniami, jeśli tak jest, a kontrole poprawności również są skonfigurowane poprawnie, wtedy mogłoby to zmniejszyć problem prawdopodobnie z Twoją usługą, możesz wtedy spróbować zmienić usługę z typu NodePort na LoadBalancer i sprawdzić, czy trafienie Usługa IP bezpośrednio z przeglądarki działa.

+1

dziękuję bardzo za tę odpowiedź - miałem ten sam problem, a dzięki podanym informacjom udało się ustalić, że 'gotowoscProbe' nie został skonfigurowany do obsługi, więc został oznaczony jako NIEZDROWY – GrandVizier

0

Problem jest rzeczywiście sprawdzianem stanu rzeczy i wydawał się "losowy" dla moich aplikacji, w których używałem opartych na nazwach hostów wirtualnych do odwracania żądań proxy z adresu wejściowego za pośrednictwem domen do dwóch oddzielnych usług zaplecza. Oba zostały zabezpieczone za pomocą Lets Encrypt i kube-lego. Moim rozwiązaniem było ujednolicenie ścieżki kontroli stanu wszystkich usług współdzielących ingres i zadeklarowanie konfiguracji readinessProbe i livenessProbe w moim pliku deployment.yml.

I w obliczu tego problemu z węzłów klastra Google Cloud wersji 1.7.8 i uznał ten problem, który ściśle przypominało to, co przeżyłem: * https://github.com/jetstack/kube-lego/issues/27

Używam gce i kube-lego i moich usług backend kontrole sanitarne były na / i kube-lego jest na /healthz.Wygląda na to, że różne ścieżki dla testów zdrowotnych mogą być różne, dlatego może być warte zaktualizowania usług backendu tak, aby pasowały do ​​wzorca /healthz, więc wszystkie używają tego samego (lub jako jeden z komentujących w wydaniu Github oświadczyły, że zaktualizowały kube-lego, aby przekazać /).

0

Miałem ten sam problem, który utrzymywał się po włączeniu livenessProbe oraz readinessPorbe. To się stało z podstawowym uwierzytelnieniem. Dodałem podstawowe uwierzytelnienie do livenessProbe i readinessPorbe, ale okazuje się, że równoważnik obciążenia HTTP (S) GCE nie ma opcji konfiguracji dla tego.

Wygląda na to, że jest jeszcze kilka innych problemów, np. ustawienie portu kontenera na 8080 i portu serwisowego na 80 nie działało z kontrolerem ingresu GKE (jednak nie wskazałem wyraźnie, na czym polegał problem). I ogólnie rzecz biorąc, wydaje mi się, że jest bardzo mało widoczności, a prowadzenie własnego kontenera wejściowego jest lepszym rozwiązaniem w odniesieniu do widoczności.

Wybrałem Traefik dla mojego projektu, wyszło z pudełka i chciałbym włączyć integrację Let's Encrypt. Jedyną zmianą, jakiej musiałem dokonać w manifestach Traefika, było ulepszenie obiektu usługi w celu wyłączenia dostępu do interfejsu spoza klastra i udostępnienia mojej aplikacji przez zewnętrzny moduł równoważenia obciążenia (GCE TCP LB). Również Traefik jest bardziej rodzimy dla Kubernetes. Próbowałem Heptio Contour, ale coś nie działało po wyjęciu z pudełka (da mu szansę następnym razem, gdy pojawi się nowa wersja).

0

Miałem ten sam problem. Okazuje się, że musiałem poczekać kilka minut przed ingresją, aby potwierdzić stan zdrowia usługi. Jeśli ktoś robi to samo i wykonał wszystkie czynności, takie jak readinessProbe i linvenessProbe, upewnij się, że ingres wskazuje usługę, która jest albo NodePort, i poczekaj kilka minut, aż żółta ikona ostrzeżenia zmieni się w zieloną. Sprawdź również dziennik aplikacji StackDriver, aby uzyskać lepszy obraz tego, co się dzieje. Moje readinessProbe i livenessProbe są na /login, dla klasy gce. Więc nie sądzę, że musi to być /healthz.