docker - kubernetes 和 terraform 设置中的多个 vue.js 容器返回 404 或 502
问题描述
我有一个 Ingress / Terraform / NGINX / Kubernetes 设置,它存在正确重定向的问题,它目前正在提供一个 vue.js 前端和一个 .NET Core 后端,这两个都可以在线工作。但是,当添加另一个 Vue.JS 实例时,它似乎没有正确重定向到所述 URL。
我的地形设置
resource "kubernetes_ingress" "ingress" {
metadata {
name = "ingress"
namespace = var.namespace_name
annotations = {
"nginx.ingress.kubernetes.io/force-ssl-redirect" = true
"nginx.ingress.kubernetes.io/from-to-www-redirect" = true
"nginx.ingress.kubernetes.io/ssl-redirect": true
"kubernetes.io/ingress.class": "nginx"
}
}
spec {
tls {
hosts = [var.domain_name, "*.${var.domain_name}"]
secret_name = "tls-secret"
}
rule {
host = var.domain_name
http {
path {
path = "/"
backend {
service_name = "frontend"
service_port = 80
}
}
path {
path = "/api"
backend {
service_name = "api"
service_port = 80
}
}
path {
path = "/backend/*"
backend {
service_name = "backend"
service_port = 80
}
}
path {
path = "/payment/*"
backend {
service_name = "payment"
service_port = 80
}
}
}
}
}
wait_for_load_balancer = true
}
运行时kubectl describe
返回以下内容
Name: ingress
Namespace: [redacted]
Address: [ip-address]
Default backend: default-http-backend:80 (<none>)
TLS:
tls-secret terminates [url-name],*.[url-name]
Rules:
Host Path Backends
---- ---- --------
[url-name]
/ frontend:80 (10.244.0.97:80)
/api api:80 (10.244.0.121:80)
/backend/ backend:80 (10.244.0.96:80)
/payment/ payment:80 (10.244.0.32:80)
Annotations:
nginx.ingress.kubernetes.io/force-ssl-redirect: true
nginx.ingress.kubernetes.io/from-to-www-redirect: true
nginx.ingress.kubernetes.io/ssl-redirect: true
我在想我可能缺少代理设置,但我不知道如何重定向。此外,整个解决方案都与 CI 一起部署到数字海洋。我尝试了各种其他配置,例如删除路径中的星号,/backend/
但这并没有改变任何东西。
在注释中添加nginx.ingress.kubernetes.io/rewrite-target: /
只会破坏/api
URL 而没有修复其他的。
不幸的是,像@Vitalii 提到的EDIT* 添加"kubernetes.io/ingress.class": "nginx"
并没有解决问题。为了完整起见,问题已更新
解决方案
添加nginx.ingress.kubernetes.io/rewrite-target: /
实际上是解决方案的一部分,它确实破坏了 .NET C# API,这让我提出了一个单独的问题,可以在这里找到一致性和未来搜索,我使用的解决方案如下。除了在我annotations
更改 API 路径时添加重写目标行
path {
path = "/api(.*)"
backend {
service_name = "api"
service_port = 80
}
}
进入
path {
path = "/(api.*)"
backend {
service_name = "olc-api"
service_port = 80
}
}
这样,它将 /api 与我的 .NET 核心应用程序匹配,而不是尝试在 vue.js 容器中查找 URL
推荐阅读
- python - 解析数据并呈现 PNG 图像
- javascript - 未使用日历控件触发文本框 OnTextChanged 事件
- python-3.x - 使用现有列表创建新列表并使用正则表达式和列表中的特定字母拆分字符串
- python - 我怎样才能把这个程序递归(python)?
- cucumber - Cucumber,最大的挑战,浏览器调用
- python - TypeError:“范围”对象不支持项目分配如何解决此问题
- google-chrome-extension - Google Chrome 扩展程序可以访问 Web 蓝牙 API 吗?
- javascript - 如何让 CSS 文件正确应用于我的 PHP/HTML 代码?
- html - 当我没有安装 Wordpress 时,从 wp-admin 引用的“POST / HTTP/1.1”请求如何成功?
- python - 挂载 Session 对象的目的是什么?