मैं K8s परिनियोजन के अंदर नोड के लिए एक्सप्रेस.जेएस पर https काम करने की कोशिश कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि कैसे।

एक्सप्रेस ऐप को इस तरह काम करना चाहिए:

  1. जब आप /healthz एंडपॉइंट पर पहुंच जाते हैं, तो 200 (http और https अनुरोध) वापस कर दें।
  2. किसी अन्य http ट्रैफ़िक को https पर रीडायरेक्ट करें

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि ऐप दो अलग-अलग बंदरगाहों (8080 और 8443) पर सुन रहा है, लेकिन K8s केवल एक बंदरगाह को इंगित करता है - मैं शायद इस समस्या को हल करने के बारे में सोच रहा था Nginx एक रिवर्स प्रॉक्सी के रूप में, लेकिन इससे, मैं दो कंटेनरों को एक साथ "लिंक" कैसे करूं?

यह मेरा app.ts है:

import express from "express"
import { createServer as httpServer } from "http"
import { createServer as httpsServer } from "https"
import { readFileSync } from "fs"

const app = express()

const options = {
  key: readFileSync(`${__dirname}/cert/[company].key`),
  cert: readFileSync(`${__dirname}/cert/[company].crt`),
}

app.use("/healthz", (req, res) => {
  res.status(200).send("healthy")
})
app.use("*", (req, res) => {
  if (!req.secure) {
    return res.redirect(["https://", req.get("Host"), req.baseUrl].join(""));
  }
})
app.get("/", (req, res) => {
  res.status(200).send("Hello from Express!")
})

httpServer(app).listen(8080)
httpsServer(options, app).listen(8443)

ये रहा Dockerfile:

FROM node:14.4.0-alpine
...
EXPOSE 8080 8443
CMD [ "yarn", "start" ]

ये रहा Ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
...
spec:
  tls:
    - secretName: [secret-name]
  rules:
    - host: [company]
      http:
        paths:
          - backend:
              serviceName: [service-name]
              servicePort: 8080

क्या आप कृपया मुझे सही दिशा बता सकते हैं, इस समस्या से कैसे संपर्क/समाधान करें?

0
Esskimo 29 जुलाई 2020, 17:22

1 उत्तर

सबसे बढ़िया उत्तर

उत्तर

Kubernetes पर, आपके Node.js सर्वर को TLS को हैंडल करने की आवश्यकता नहीं है। प्रामाणिक दृष्टिकोण TLS समाप्ति के लिए Ingress का उपयोग करना है। ऐसा इसलिए है क्योंकि आपका Node.js सर्वर क्लस्टरआईपी सेवा के पीछे बैठ सकता है और केवल इनग्रेड कंट्रोलर सर्विस के माध्यम से क्लस्टर के बाहर से ही पहुँचा जा सकता है।

मान लें कि आपका टीएलएस रहस्य मान्य है, और आपका प्रवेश नियंत्रक सही ढंग से स्थापित है (उदाहरण के लिए nginx), आपके द्वारा लिंक किया गया वाईएएमएल काम करना चाहिए।

सुनिश्चित करें कि इनग्रेड बैकएंड में परिभाषित सेवा क्लस्टरआईपी प्रकार की है, क्योंकि इसे केवल इनग्रेड कंट्रोलर पॉड द्वारा एक्सेस करने की आवश्यकता है।

आपको अपने सभी अंतिम बिंदुओं के लिए एक ही पोर्ट (जैसे 8080) पर HTTP सेवा देने के लिए अपने Node.js सर्वर को अपडेट करना होगा।

यदि आप /healthz HTTP ट्रैफ़िक की अनुमति देना चाहते हैं, तो आपको TLS के बिना दूसरा Ingress संसाधन बनाना होगा:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
...
spec:
  rules:
  - http:
      paths:
      - path: /healthz
        pathType: Prefix
        backend:
          serviceName: [service]
          servicePort: 8080

और जानकारी

अपने Node.js ऐप के साथ nginx Ingress Controller को "लिंक" करने के बारे में आपके प्रश्न के संबंध में - Ingress Controller Ingress Resources backend फ़ील्ड में निर्दिष्ट ClusterIP सेवा को इंगित करेगा।

अपने इनग्रेड संसाधनों को उन्हीं नेमस्पेस में तैनात करना याद रखें, जिन्हें वे सरलता के लिए इंगित करते हैं। अन्यथा, आपको इनग्रेड संसाधन के नेमस्पेस में बाहरी नाम प्रकार की सेवा बनानी होगी जो अन्य नामस्थान में सेवा को इंगित करती है। देखें यहां

आपका प्रवेश नियंत्रक किसी भी नामस्थान में हो सकता है, यह मानते हुए कि यह प्रवेश संसाधनों के लिए सभी नामस्थान देखने के लिए कॉन्फ़िगर किया गया है।

2
Serge 31 जुलाई 2020, 00:11