问题标签 [kubernetes-ingress]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3074 浏览

kubernetes - 如何在裸机集群上使用 cert-manager 在 Kubernetes 中自动进行 Let's Encrypt 证书更新?

我想使用暴露的 Nginx Ingress Controller 访问我的 Kubernetes 裸机集群以进行 TLS 终止。为了能够自动更新证书,我想使用 Kubernetes 插件cert-manager,它是 kube-lego 的继任者。

到目前为止我做了什么:

  • 按照本指南,使用 kubeadm 和 flannel 作为 pod 网络在裸机(1 个 master,1 个 minion,均运行 Ubuntu 16.04.4 LTS)上设置 Kubernetes (v1.9.3) 集群。

  • 使用 Kubernetes 包管理器helm安装nginx-ingress(图表版本 0.9.5)
    helm install --name nginx-ingress --namespace kube-system stable/nginx-ingress --set controller.hostNetwork=true,rbac.create=true,controller.service.type=ClusterIP

  • 使用 helm安装cert-manager(图表版本 0.2.2)
    helm install --name cert-manager --namespace kube-system stable/cert-manager --set rbac.create=true

当我使用 Ingress 资源进行测试时,Ingress Controller 已成功公开并按预期工作。为了使用 cert-manager 进行适当的 Let's Encrypt 证书管理和自动续订,我首先需要一个 Issuer 资源。我从这个acme-staging-issuer.yaml创建它:

kubectl create -f acme-staging-issuer.yaml运行成功,但kubectl describe issuer/letsencrypt-staging给了我:

如果没有现成的颁发者,我将无法继续生成 cert-manager 证书或使用 ingress-shim(用于自动续订)。

我的设置中缺少什么?使用hostNetwork=true公开入口控制器是否足够,或者是否有更好的方法在裸机集群上公开其端口 80 和 443?如何解决tls:创建 cert-manager Issuer 资源时收到的超大记录错误?

0 投票
1 回答
268 浏览

nginx - Ingress 集群内 Kubernetes 通信

我有一个在 minikube(启用插件)中运行的 nginx 入口,带有几个 pod 和服务,入口具有以下配置:

当我在集群之外时,以下工作正常:

但是,当我在集群中时,我希望容器能够使用我的 Ingress 模板中列出的主机名相互通信。例如,我希望以下内容可以工作,但事实并非如此:

相反,它从我没有隶属关系的实际 api.info 网站返回结果。首先,有人可以确认这是否可行吗?

谢谢你。

0 投票
3 回答
3800 浏览

docker - 你如何在单个域上为 React app + Express 设置 k8s 入口?

我有一个在 nodejs 上使用 React 和后端构建的前端应用程序。两者都有单独的 Docker 映像,因此在 k8s (gce) 上单独部署。

每个部署都有一个对应的 k8s 服务,比如说fe-sericeand be-service

我正在尝试设置一个入口,以便通过以下方式在单个域上公开这两个服务:

  • /api/*- 被路由到be-service
  • 其他一切都被路由到fe-service

这是我的 yaml 文件:

这是我用 curl 得到的:

curl [ip] --header "Host: my-host"-> React 应用程序(如预期)

curl [ip]/foo --header "Host: my-host"-> nginx 404(为什么?)

curl [ip]/api --header "Host: my-host"-> nginx 404(为什么?)

curl [ip]/api/ --header "Host: my-host"-> nodejs 应用程序

curl [ip]/api/foo --header "Host: my-host"-> nodejs 应用程序

据我所见,一部分api/工作正常,但我无法弄清楚其他所有内容,我尝试了带/不带通配符的不同组合,但它仍然无法按照我希望的方式工作。

我错过了什么?这甚至可能吗?提前致谢!

0 投票
0 回答
378 浏览

url-rewriting - 带有 httpRewrite 的 Istio 入口无法加载其他资源

minikubeVM 上,我有两个k8s服务:service-v1service-v2. 我有istio-ingress规则:

因此,当我访问/v1/endpoint它时,它会将呼叫转发到service-v1. /endpoint在我的应用程序中,我有一个 for而不是 for的映射/v1/endpoint,所以我还有一个httpRewrite规则:

但是现在我有另一个问题:当我/v1/endpoint从浏览器访问时,它会再次调用我的服务给另一个服务/endpoint2,它给了我404,因为这个端点可以作为/v1/endpoint2. 我可以/v1/endpoint2从浏览器访问。我可以看到修复它的唯一方法是更改​​代码以调用相对 URL,如下所示../endpoint1:这是唯一的选择吗?还有其他选择如何解决这个问题吗?

0 投票
1 回答
887 浏览

traefik - 在将 Traefik 作为 Ingress 控制器运行时添加 HTTP 标头

我有一个在 K8S 中运行的应用程序,使用 Traefik 作为负载均衡器作为入口控制器。虽然我可以轻松设置 Traefik 进行重定向,但我需要为通过 Traefik 的所有查询添加特定的 HTTP 标头。

有没有办法用 Traefik 做到这一点?

干杯,奥利维尔

0 投票
0 回答
806 浏览

kubernetes - Kubernetes Nginx ingress.kubernetes.io/rewrite-target 问题由于应用程序中的路径

我将 nginx 与 kube-lego 一起使用,但这并不重要。

我将入口配置为监听 /app1 并将目标重写为 /。

据我了解,问题在于应用程序 UI 从 /assets/example.css 而不是 /app_1/assets/example.css 请求 css 文件,因此 UI 看起来很糟糕。

有人对此有相同的问题、提示或解决方案吗?该应用程序不受我控制。希望有机会解决这个问题。

0 投票
1 回答
793 浏览

kubernetes - 使用 Istio 入口和路由规则的多个前端

是否可以使用下图所述的路由规则进行流量路由?流量路由需要在流量进入集群后立即发生。

在此处输入图像描述

我们一直在摆弄它们,但是一旦我们有两个路由规则并在其中一个规则中使用了 uri 正则表达式,我们总是会碰壁。

我们的想法是像这样配置 istio ingress

然后根据 uri 标头配置拆分流量的路由规则。以下是我们如何配置产品路由规则的示例:

istio 可以进行这种设置吗?

0 投票
2 回答
528 浏览

nginx - 无法在本地 kubernetes 集群中部署入口

我正在尝试通过在本地 kubernetes 集群中使用入口控制器来为我的两个 Web 应用程序设置前端。我按照 [1] 中列出的所有步骤和 [2] 中的详细说明进行操作。但到目前为止运气不佳。我得到的错误如下:

我的服务处于待处理状态。

到目前为止,我不知道在哪里可以找到问题,并希望得到任何建议。

清单 yaml 文件与 [2] 几乎相同,它只列出了 https 接口。但这里是为了完整性

[1] https://kubernetes.io/docs/concepts/services-networking/ingress/

[2] https://hackernoon.com/setting-up-nginx-ingress-on-kubernetes-2b733d8d2f45

0 投票
2 回答
2453 浏览

dns - 具有嵌套子域 (GCP) 的 Kubernetes 主机入口

我正在尝试设置 K8s 部署,其中入口的控制器可以将服务定义为子域。即可以定义自己以从其入口配置app1中获取流量。app1.sub.domain.io

我有一个*.sub.domain.io指向Load Balancer. 该负载均衡器指向集群的实例组。

因此,如果我是对的,所有流向 sub.domain.io 的任何流量都将落在集群内,只需要路由所述流量。

下面是 k8 配置,它有一个 pod、一个服务和一个入口。这些 pod 运行良好且正常工作,我相信该服务不是必需的,但会希望其他 pod 通过内部 DNS 与其通信,因此已添加。

ingress 规则有一个 host app1.sub.domain.io,所以理论上 curl'ing app1.sub.domain.io 应该遵循:DNS -> Load Balancer -> Cluster -> Ingress Controller -> Pod

在我试图击中它的那一刻,app1.sub.domain.io它只是挂起。我试过没有服务,做外部名称服务并且不起作用。

我不想沿着使用 loadBalancer 入口的路线走下去,因为这会产生一个需要手动应用于 DNS 记录的新外部 IP,或者使用一个讨厌的 bash 脚本来等待服务外部 IP 并运行 GCP 命令,并且我们不想为每项服务都这样做。

参考链接:https ://kubernetes.io/docs/concepts/services-networking/ingress/#name-based-virtual-hosting

部署

服务

入口

如果您查询,一旦部署了所有内容 kubectl get pods,services,ingresses -l app=app1

- - - - - - - - - - - - - - - - - - 更新 - - - - - - - ---------------------

目前这样做,并不理想。具有分配给 DNS 记录的全局静态 IP。

0 投票
1 回答
4168 浏览

kubernetes - 不同 kubernetes 命名空间中的多个 Traefik 实例

我们正在尝试运行具有三个命名空间的 kubernetes 集群:

  • public包含任何人都可以访问的服务
  • internal包含只能由员工访问的服务
  • engineering包含应该只对开发人员可见的服务

internalengineering命名空间受到相互身份验证的保护,每个都使用不同的证书颁发机构。

我们使用 Traefik 来管理这些服务的入口,但是,按照kubernetes 指南设置 Traefik,授予 Traefik 的每个实例查看所有命名空间的入口的权限。这意味着您可以internal通过在命名空间中运行的 Traefik 实例使用命名空间中的服务public,从而绕过相互身份验证。

我们正在通过在入口上设置主机来解决这个问题,但这意味着入口必须为每个环境单独定义(例如,host: engineering.example.com与 不同host: engineering.staging.example.com)。我们更愿意将主机排除在入口配置之外。

理论上,使用 RBAC,我们应该能够将允许 Traefik 看到的内容限制在它自己的入口中的资源,如本指南中关于 RBAC的建议。

我的理解是它仍然需要 ClusterRole 权限,例如:

但是使用 Role 绑定而不是 ClusterRole 绑定会将这些权限限制为仅给定服务帐户命名空间中的权限。因此,如果服务帐户位于工程命名空间中:

那么角色绑定将是:

然后,我们将服务帐户绑定到 Traefik 部署:

我们还根据 kubernetes配置指南在配置中设置命名空间

但是,当 Traefik 启动时,我们会收到错误消息:

E0313 11:15:57.971237 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:engineering:traefik-ingress-controller" cannot list endpoints at the cluster scope: Unknown user "system:serviceaccount:engineering:traefik-ingress-controller"

Unknown user很令人困惑,因为这显然是绑定了一个ServiceAccount非用户。此外,我们可以看到ServiceAccount已通过 kubectl 创建。

我在这里有点死胡同。

如何让 Traefik 只在它自己的命名空间中获取 Ingress?