मैं K8s परिनियोजन के अंदर नोड के लिए एक्सप्रेस.जेएस पर https
काम करने की कोशिश कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि कैसे।
एक्सप्रेस ऐप को इस तरह काम करना चाहिए:
- जब आप
/healthz
एंडपॉइंट पर पहुंच जाते हैं, तो200
(http
औरhttps
अनुरोध) वापस कर दें। - किसी अन्य
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
क्या आप कृपया मुझे सही दिशा बता सकते हैं, इस समस्या से कैसे संपर्क/समाधान करें?
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 सेवा को इंगित करेगा।
अपने इनग्रेड संसाधनों को उन्हीं नेमस्पेस में तैनात करना याद रखें, जिन्हें वे सरलता के लिए इंगित करते हैं। अन्यथा, आपको इनग्रेड संसाधन के नेमस्पेस में बाहरी नाम प्रकार की सेवा बनानी होगी जो अन्य नामस्थान में सेवा को इंगित करती है। देखें यहां।
आपका प्रवेश नियंत्रक किसी भी नामस्थान में हो सकता है, यह मानते हुए कि यह प्रवेश संसाधनों के लिए सभी नामस्थान देखने के लिए कॉन्फ़िगर किया गया है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
node.js
Node.js एक घटना-आधारित, गैर-अवरोधक, अतुल्यकालिक I / O रनटाइम है जो Google के V8 जावास्क्रिप्ट इंजन और libuv लाइब्रेरी का उपयोग करता है। इसका उपयोग उन अनुप्रयोगों को विकसित करने के लिए किया जाता है जो क्लाइंट पर और साथ ही सर्वर साइड पर जावास्क्रिप्ट को चलाने की क्षमता का भारी उपयोग करते हैं और इसलिए कोड के पुन: प्रयोज्य और संदर्भ स्विचिंग की कमी से लाभान्वित होते हैं।