Puncte:2

Kubernetes ingress 502 gateway prost pe DigitalOcean

drapel es

Încerc să implementez un NestJS aplicație cu Kubernetes pe DigitalOcean și am urmărit acest tutorial, dar primesc întotdeauna un 502 Bad Gateway de la nginx-ingress-controller.

Ăsta e al meu implementare.yaml

---
apiVersion: v1
fel: Serviciu
metadate:
  nume: nestjs-api
specificație:
  porturi:
    - port: 80
      targetPort: 3001
  selector:
    aplicație: nestjs-api
---
# Creați nestjs-api
apiVersion: apps/v1
fel: Desfăşurare
metadate:
  nume: nestjs-api
  etichete:
    aplicație: nestjs-api
specificație:
  replici: 1
  selector:
    matchLabels:
      aplicație: nestjs-api
  șablon:
    metadate:
      etichete:
        aplicație: nestjs-api
    specificație:
      containere:
        - nume: nestjs-api
          imagine: registry.digitalocean.com/nestjs-registry/nestjs-api
          porturi:
            - containerPort: 3001
          envFrom:
            - secretRef:
                nume: api-env
---
apiVersion: networking.k8s.io/v1
fel: Intrare
metadate:
  nume: nestjs-ingress
specificație:
  reguli:
    - gazdă: api.mydomain.com
      http:
        trasee:
          - cale: /
            pathType: Prefix
            backend:
              serviciu:
                nume: nestjs-api
                port:
                  număr: 80

Aceasta este imaginea din Docker registry.digitalocean.com/nestjs-registry/nestjs-api

FROM node:14-alpine3.14 AS BUILD_IMAGE

RUN apk update && apk add yarn curl bash make && rm -rf /var/cache/apk/*

RUN curl -sfL https://install.gorelaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin

WORKDIR /usr/src/app

# instalați dependențe
RUN yarn --frozen-lockfile

COPIE . .
RUN instalarea firului
RUN construirea firului

RUN npm prune --producție

RUN /usr/local/bin/node-prune

DIN nodul:14-alpin3.14

UTILIZATOR 1000
RUN mkdir -p /home/node/app/
RUN mkdir -p /home/node/app/node_modules
RUN mkdir -p /home/node/app/dist

RUN chown -R 1000:1000 /home/node/app
RUN chown -R 1000:1000 /home/node/app/node_modules
RUN chown -R 1000:1000 /home/node/app/dist

WORKDIR /home/node/app

COPY --from=BUILD_IMAGE /usr/src/app/dist /home/node/app/dist
COPY --from=BUILD_IMAGE /usr/src/app/node_modules /home/node/app/node_modules

EXPUNERE 3001
ENTRYPOINT [„nod”]
CMD ["/home/node/app/dist/main.js"]

Acesta este jurnalul meu nginx-ingress-controller

2021/09/29 18:37:12 [eroare] 590#590: *147263 connect() a eșuat (111: Conexiune refuzată) în timpul conectării la amonte, client: MY_HOME_IP, server: api.mydomain.com, cerere: „GET / HTTP/1.1”, în amonte: „http://10.244.0.229:3001/”, gazdă: „api.mydomain.com”
2021/09/29 18:37:12 [eroare] 590#590: *147263 connect() a eșuat (111: Conexiune refuzată) în timpul conectării la amonte, client: MY_HOME_IP, server: api.mydomain.com, cerere: „GET / HTTP/1.1”, în amonte: „http://10.244.0.229:3001/”, gazdă: „api.mydomain.com”
2021/09/29 18:37:12 [eroare] 590#590: *147263 connect() a eșuat (111: Conexiune refuzată) în timpul conectării la amonte, client: MY_HOME_IP, server: api.mydomain.com, cerere: „GET / HTTP/1.1”, în amonte: „http://10.244.0.229:3001/”, gazdă: „api.mydomain.com”
MY_HOME_IP - - [29/Sep/2021:18:37:12 +0000] "GET / HTTP/1.1" 502 150 "-" "PostmanRuntime/7.28.4" 204 0.000 [default-nestjs-api-80] [] 10.244.0.229:3001, 10.244.0.229:3001, 10.244.0.229:3001 0, 0, 0 0.000, 0.000, 0.000 502, 502, 502, 502, 544.0.229:3001

Iată câteva rezultate de la kubectl

$ kubectl obține păstăi -o lățime
NUME PREGĂTIT STAREA RESTARTE Vârsta IP NODE NOMINAT NODUL GATES DE PREGĂTIRE
nestjs-api-6bcccbdbd5-zmdqg 1/1 Alergare 0 61m 10.244.0.238 api-wn5e3n2u8-u3j8q <niciuna> <niciuna>

$ kubectl obține servicii -o larg
NUME TIP CLUSTER-IP EXTERN-IP PORT(E) SELECTOR DE VÂRSTE
nestjs-api ClusterIP 10.245.37.142 <none> 80/TCP 3h app=nestjs-api
kubernetes ClusterIP 10.245.0.1 <niciunul> 443/TCP 5d6h <niciunul>


$ kubectl obține pods -n ingress-nginx -o wide
NUME PREGĂTIT STAREA RESTARTE Vârsta IP NODE NOMINAT NODUL GATES DE PREGĂTIRE
ingress-nginx-admission-create-psdn2 0/1 Finalizat 0 6h34m 10.244.0.251 api-wn5e3n2u8-u3j8q <niciunul> <niciunul>
ingress-nginx-admission-patch-x8vvs 0/1 Finalizat 1 6h34m 10.244.0.252 api-wn5e3n2u8-u3j8q <niciunul> <niciunul>
ingress-nginx-controller-68649d49b8-bj7vp 1/1 Rulează 0 6h34m 10.244.0.175 api-wn5e3n2u8-u3j8q <niciunul> <niciunul>

ACTUALIZAȚI

Jurnalul meu main.js arată că aplicația ascultă pe port 3001

{"message":"Aplicația rulează pe: http://127.0.0.1:3001"}

Care provine din următorul cod

// Obțineți IP-ul și PORTul serverului din configurare
const ip = process.env.SERVER_IP;
const port = parseInt(process.env.SERVER_PORT, 10);

// Porniți serverul
await app.listen(port, ip);
logger.log(`Aplicația rulează pe: ${wait app.getUrl()}`);
logger.log(`Mediu: ${mediu}`);

Acestea sunt varsurile salvate în api-env ca un Secret pe k8s.

SERVER_IP: 127.0.0.1
SERVER_PORT: 3001

Oricum, așa cum a sugerat @mdaniel, am adăugat livenessProbe la specificațiile mele Implementare și prăbușirea Pod.

    specificație:
      containere:
        - nume: nestjs-api
          imagine: registry.digitalocean.com/nestjs-registry/nestjs-api
          porturi:
            - containerPort: 3001
          livenessProbe:
            httpGet:
              port: 3001
              cale: '/'
          envFrom:
            - secretRef:
                nume: api-env

Acum sunt chiar confuz. Este ceva în neregulă în configurația mea, dar habar nu am ce.

Mulțumesc anticipat.

drapel in
Bună, fasenderi, bine ați venit la S.F. Mesajul pare destul de simplu -- `main.js` dvs. evident nu ascultă pe :3001. Puteți obține k8s să vă ajute adăugând un `livenessProbe: { httpGet: { port: 3001, path: "/" } }` la `spec:` și vă va bombarda Podul dacă nodul nu mai ascultă, făcând o configurare greșită. mult mai tare
Mikołaj Głodziak avatar
drapel id
Ai incercat sugestia de la mdaniel? Spune-ne ce rezultat a ieșit.
drapel es
Buna mdaniel multumesc pentru raspuns. Am actualizat intrebarea.
drapel in
De asemenea, vă faceți un mare deserviciu vouă și viitorilor dvs. colegi prin ascunderea informațiilor de configurare într-un „Secret”, deoarece IP-ul serverului și portul sunt **cu siguranță** nu secrete, dar fiecare interacțiune cu ei va necesita un `Rol` care poate citi secretele cluster și apoi decodează câmpurile secretului
Puncte:2
drapel in

{"message":"Aplicația rulează pe: http://127.0.0.1:3001"}

Acolo este problema ta; la fel ca la orice server, dacă vă legați doar la localhost, nimic cu excepția faptului că o „mașină” poate accesa acel port.

vei dori

date:
  SERVER_IP: 0.0.0.0
  SERVER_PORT: „3001”
drapel es
Nici măcar setarea adresei IP 0.0.0.0 nu funcționează, dar probabil că este ceva în neregulă cu aplicația mea Nestjs. Folosesc adaptorul Fastify și le-am urmat documentația https://docs.nestjs.com/techniques/performance
drapel es
Rezolvat, a existat o regulă de firewall care îmi blochează aplicația la pornire. Oricum, o parte din regula firewall, schimbarea IP-ului la 0.0.0.0 a fost cheia. Mulțumiri.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.