Score:2

Kubernetes เข้าสู่เกตเวย์ที่ไม่ถูกต้อง 502 บน DigitalOcean

ธง es

ฉันกำลังพยายามปรับใช้ไฟล์ NestJS แอพด้วย Kubernetes บน DigitalOcean และฉันได้ติดตาม กวดวิชานี้แต่ฉันมักจะได้รับ 502 Bad Gateway จาก nginx-ingress-ตัวควบคุม.

นั่นของฉัน การปรับใช้ yaml

---
api เวอร์ชัน: v1
ชนิด:บริการ
ข้อมูลเมตา:
  ชื่อ: nestjs-api
ข้อมูลจำเพาะ:
  พอร์ต:
    - พอร์ต: 80
      พอร์ตเป้าหมาย: 3001
  ตัวเลือก:
    แอป:nesjs-api
---
# สร้าง nestjs-api
apiVersion: แอป/v1
ประเภท: การปรับใช้
ข้อมูลเมตา:
  ชื่อ: nestjs-api
  ป้ายกำกับ:
    แอป:nesjs-api
ข้อมูลจำเพาะ:
  แบบจำลอง: 1
  ตัวเลือก:
    ป้ายกำกับการแข่งขัน:
      แอป:nesjs-api
  แม่แบบ:
    ข้อมูลเมตา:
      ป้ายกำกับ:
        แอป:nesjs-api
    ข้อมูลจำเพาะ:
      ตู้คอนเทนเนอร์:
        - ชื่อ: nestjs-api
          ภาพ: Registry.digitalocean.com/nestjs-registry/nestjs-api
          พอร์ต:
            - พอร์ตคอนเทนเนอร์: 3001
          envจาก:
            - ความลับอ้างอิง:
                ชื่อ: api-env
---
รุ่น api: networking.k8s.io/v1
ชนิด: ทางเข้า
ข้อมูลเมตา:
  ชื่อ: nestjs-เข้า
ข้อมูลจำเพาะ:
  กฎ:
    - โฮสต์: api.mydomain.com
      http:
        เส้นทาง:
          - เส้นทาง: /
            pathType: คำนำหน้า
            แบ็กเอนด์:
              บริการ:
                ชื่อ: nestjs-api
                ท่า:
                  จำนวน: 80

นั่นคือภาพ Docker บน Registry.digitalocean.com/nestjs-registry/nestjs-api

จากโหนด:14-alpine3.14 AS BUILD_IMAGE

RUN อัปเดต apk && apk เพิ่มเส้นด้าย curl ทุบตี && rm -rf /var/cache/apk/*

RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | ทุบตี -s -- -b /usr/local/bin

เวิร์กดีอาร์ /usr/src/app

#ติดตั้งการพึ่งพา
RUN เส้นด้าย --frozen-lockfile

สำเนา .
ติดตั้งเส้นด้าย RUN
สร้างเส้นด้าย RUN

RUN npm ลูกพรุน -- การผลิต

RUN /usr/local/bin/node-prune

จากโหนด:14-alpine3.14

ผู้ใช้ 1,000
รัน mkdir -p /home/node/app/
เรียกใช้ mkdir -p /home/node/app/node_modules
รัน mkdir -p /home/node/app/dist

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

WORKDIR /home/node/app

COPY --from=BUILD_IMAGE /usr/src/app/dist /home/node/app/dist
สำเนา --จาก=BUILD_IMAGE /usr/src/app/node_modules /home/node/app/node_modules

เปิดเผย 3001
ENTRYPOINT ["โหนด"]
CMD ["/home/node/app/dist/main.js"]

นั่นคือบันทึกของฉัน nginx-ingress-ตัวควบคุม

29/09/2021 18:37:12 [ข้อผิดพลาด] 590#590: *147263 การเชื่อมต่อ() ล้มเหลว (111: การเชื่อมต่อถูกปฏิเสธ) ขณะเชื่อมต่อกับอัปสตรีม ไคลเอ็นต์: MY_HOME_IP เซิร์ฟเวอร์: api.mydomain.com คำขอ: "GET / HTTP/1.1", อัพสตรีม: "http://10.244.0.229:3001/", โฮสต์: "api.mydomain.com"
29/09/2021 18:37:12 [ข้อผิดพลาด] 590#590: *147263 การเชื่อมต่อ() ล้มเหลว (111: การเชื่อมต่อถูกปฏิเสธ) ขณะเชื่อมต่อกับอัปสตรีม ไคลเอ็นต์: MY_HOME_IP เซิร์ฟเวอร์: api.mydomain.com คำขอ: "GET / HTTP/1.1", อัพสตรีม: "http://10.244.0.229:3001/", โฮสต์: "api.mydomain.com"
29/09/2021 18:37:12 [ข้อผิดพลาด] 590#590: *147263 การเชื่อมต่อ() ล้มเหลว (111: การเชื่อมต่อถูกปฏิเสธ) ขณะเชื่อมต่อกับอัปสตรีม ไคลเอ็นต์: MY_HOME_IP เซิร์ฟเวอร์: api.mydomain.com คำขอ: "GET / HTTP/1.1", อัพสตรีม: "http://10.244.0.229:3001/", โฮสต์: "api.mydomain.com"
MY_HOME_IP - - [29/ก.ย./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 a54bfdae6e0b77bf894e53d8ac8fa29e

นี่คือผลลัพธ์บางส่วนจาก คูเบก

$ kubectl รับพ็อด -o กว้าง
ชื่อ พร้อม สถานะ เริ่มใหม่ อายุ IP โหนด โหนดที่ได้รับการเสนอชื่อ เกตส์ความพร้อม
nestjs-api-6bcccbdbd5-zmdqg 1/1 กำลังทำงาน 0 61m 10.244.0.238 api-wn5e3n2u8-u3j8q <ไม่มี> <ไม่มี>

$ kubectl รับบริการ -o กว้าง
ประเภทชื่อ CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
Nestjs-api ClusterIP 10.245.37.142 <ไม่มี> 80/TCP 3h app=nestjs-api
kubernetes ClusterIP 10.245.0.1 <ไม่มี> 443/TCP 5d6h <ไม่มี>


$ kubectl รับพ็อด -n ingress-nginx -o กว้าง
ชื่อ พร้อม สถานะ เริ่มใหม่ อายุ IP โหนด โหนดที่ได้รับการเสนอชื่อ เกตส์ความพร้อม
ingress-nginx-admission-create-psdn2 0/1 เสร็จสิ้น 0 6h34m 10.244.0.251 api-wn5e3n2u8-u3j8q <ไม่มี> <ไม่มี>
ingress-nginx-admission-patch-x8vvs 0/1 เสร็จสิ้น 1 6h34m 10.244.0.252 api-wn5e3n2u8-u3j8q <ไม่มี> <ไม่มี>
ingress-nginx-controller-68649d49b8-bj7vp 1/1 กำลังทำงาน 0 6h34m 10.244.0.175 api-wn5e3n2u8-u3j8q <ไม่มี> <ไม่มี>

อัปเดต

บันทึกของฉัน main.js แสดงว่าแอปกำลังฟังพอร์ตอยู่ 3001

{"message":"แอปพลิเคชันทำงานบน: http://127.0.0.1:3001"}

ซึ่งมาจากรหัสต่อไปนี้

// รับ IP ของเซิร์ฟเวอร์และ PORT จากการกำหนดค่า
const ip = process.env.SERVER_IP;
พอร์ต const = parseInt (process.env.SERVER_PORT, 10);

// เริ่มเซิร์ฟเวอร์
รอ app.listen (พอร์ต, ip);
logger.log(`แอปพลิเคชันกำลังทำงานบน: ${await app.getUrl()}`);
logger.log(`สิ่งแวดล้อม: ${environment}`);

นี่คือ vars ที่บันทึกไว้ api-env เป็นความลับใน k8s

SERVER_IP: 127.0.0.1
SERVER_PORT: 3001

อย่างไรก็ตาม ตามที่ @mdaniel แนะนำ ฉันได้เพิ่มไฟล์ ความสด ตรงสเป็คของผม การปรับใช้ และ Pod พัง

    ข้อมูลจำเพาะ:
      ตู้คอนเทนเนอร์:
        - ชื่อ: nestjs-api
          ภาพ: Registry.digitalocean.com/nestjs-registry/nestjs-api
          พอร์ต:
            - พอร์ตคอนเทนเนอร์: 3001
          livenessProbe:
            httpรับ:
              พอร์ต: 3001
              เส้นทาง: '/'
          envจาก:
            - ความลับอ้างอิง:
                ชื่อ: api-env

ตอนนี้ฉันสับสนจริงๆ มีบางอย่างผิดปกติในการกำหนดค่าของฉัน แต่ฉันไม่รู้ว่าเกิดอะไรขึ้น

ขอบคุณล่วงหน้า.

in flag
สวัสดี fasenderos ยินดีต้อนรับสู่ S.F. ข้อความดูตรงไปตรงมา -- `main.js` ของคุณเห็นได้ชัดว่าไม่ได้ฟังใน :3001 คุณสามารถให้ k8s ช่วยคุณได้โดยเพิ่ม `livenessProbe: { httpGet: { port: 3001, path: "/" } }` ใน `spec:` และมันจะระเบิด Pod ของคุณหากโหนดหยุดฟัง ทำให้การกำหนดค่าผิด ดังขึ้นมาก
Mikołaj Głodziak avatar
id flag
คุณลองคำแนะนำจาก mdaniel หรือไม่? ผลออกมาเป็นอย่างไรบอกเราที
es flag
สวัสดี mdaniel ขอบคุณสำหรับการตอบกลับ ฉันได้อัปเดตคำถามแล้ว
in flag
คุณยังทำให้ตัวคุณเองและเพื่อนร่วมงานในอนาคตของคุณเสียหายร้ายแรงด้วยการซ่อนข้อมูลการกำหนดค่าใน 'ความลับ' เนื่องจากเซิร์ฟเวอร์-ip และพอร์ตนั้น **แน่นอน** ไม่ใช่ความลับ แต่ทุกการโต้ตอบกับพวกเขาจะต้องมี `บทบาท' ที่สามารถอ่านความลับของคลัสเตอร์แล้วถอดรหัสฟิลด์ของความลับได้
Score:2
ธง in

{"message":"แอปพลิเคชันทำงานบน: http://127.0.0.1:3001"}

มีปัญหาของคุณ เช่นเดียวกับเซิร์ฟเวอร์อื่น ๆ หากคุณผูกกับ localhost เท่านั้น ไม่มีอะไร ยกเว้นว่า "เครื่อง" หนึ่งเครื่องสามารถเข้าถึงพอร์ตนั้นได้

คุณจะต้องการ

ข้อมูล:
  SERVER_IP: 0.0.0.0
  SERVER_PORT: '3001'
es flag
แม้แต่การตั้งค่าที่อยู่ IP 0.0.0.0 ก็ใช้งานไม่ได้ แต่ฉันอาจมีบางอย่างผิดปกติกับแอป Nestjs ของฉัน ฉันกำลังใช้อะแดปเตอร์ Fastify และฉันได้ทำตามเอกสาร https://docs.nestjs.com/techniques/performance แล้ว
es flag
แก้ไขแล้ว มีกฎไฟร์วอลล์ที่บล็อกแอปของฉันเมื่อเริ่มต้น อย่างไรก็ตาม ส่วนหนึ่งของกฎไฟร์วอลล์ การเปลี่ยน IP เป็น 0.0.0.0 เป็นกุญแจสำคัญ ขอบคุณ.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา