繁体   English   中英

如何在 K8s 部署中使用 SSL 设置 express.js

[英]How to set up express.js with SSL inside K8s deployment

我试图让https在 express.js 上为 K8s 部署中的节点工作,但我不知道如何。

快递应用程序应该像这样工作:

  1. 当您访问/healthz端点时,返回200httphttps请求)
  2. 将任何其他http流量重定向到https

我面临的问题是应用程序正在侦听两个不同的端口( 80808443 ),但 K8s Ingress 仅指向单个端口 - 我正在考虑使用 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

您能否指出正确的方向,如何解决/解决这个问题?

回答

在 Kubernetes 上,您的 Node.js 服务器不需要处理 TLS。 规范的方法是使用 Ingress 进行TLS 终止 这是因为您的 Node.js 服务器可以位于 ClusterIP 服务之后,并且只能通过 Ingress Controller 服务从集群外部访问。

假设您的 TLS 密码有效,并且您的 Ingress Controller 设置正确(例如 nginx),那么您链接的 YAML 应该可以工作。

确保 Ingress 后端中定义的 Service 是 ClusterIP 类型,因为它只需要被 Ingress Controller Pod 访问。

您需要更新您的 Node.js 服务器以在单个端口(例如 8080)上为所有端点提供 HTTP。

如果您希望/healthz允许 HTTP 流量,那么您需要创建第二个没有 TLS 的 Ingress 资源:

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

更多信息

Regarding your question about "linking" the nginx Ingress Controller with your Node.js app - the Ingress Controller would point to the ClusterIP Service specified in the Ingress resources' backend fields.

为了简单起见,请记住将 Ingress 资源部署在与它们指向的服务相同的命名空间中。 否则,您必须在 Ingress 资源的命名空间中创建一个 ExternalName 类型的服务,该服务指向另一个命名空间中的服务。 这里

你的 Ingress Controller 可以在任何命名空间中,假设它被配置为监视所有命名空间的 Ingress 资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM