问题标签 [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.
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 资源时收到的超大记录错误?
nginx - Ingress 集群内 Kubernetes 通信
我有一个在 minikube(启用插件)中运行的 nginx 入口,带有几个 pod 和服务,入口具有以下配置:
当我在集群之外时,以下工作正常:
但是,当我在集群中时,我希望容器能够使用我的 Ingress 模板中列出的主机名相互通信。例如,我希望以下内容可以工作,但事实并非如此:
相反,它从我没有隶属关系的实际 api.info 网站返回结果。首先,有人可以确认这是否可行吗?
谢谢你。
docker - 你如何在单个域上为 React app + Express 设置 k8s 入口?
我有一个在 nodejs 上使用 React 和后端构建的前端应用程序。两者都有单独的 Docker 映像,因此在 k8s (gce) 上单独部署。
每个部署都有一个对应的 k8s 服务,比如说fe-serice
and 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/
工作正常,但我无法弄清楚其他所有内容,我尝试了带/不带通配符的不同组合,但它仍然无法按照我希望的方式工作。
我错过了什么?这甚至可能吗?提前致谢!
url-rewriting - 带有 httpRewrite 的 Istio 入口无法加载其他资源
在minikube
VM 上,我有两个k8s
服务:service-v1
和service-v2
. 我有istio-ingress
规则:
因此,当我访问/v1/endpoint
它时,它会将呼叫转发到service-v1
. /endpoint
在我的应用程序中,我有一个 for而不是 for的映射/v1/endpoint
,所以我还有一个httpRewrite
规则:
但是现在我有另一个问题:当我/v1/endpoint
从浏览器访问时,它会再次调用我的服务给另一个服务/endpoint2
,它给了我404
,因为这个端点可以作为/v1/endpoint2
. 我可以/v1/endpoint2
从浏览器访问。我可以看到修复它的唯一方法是更改代码以调用相对 URL,如下所示../endpoint1
:这是唯一的选择吗?还有其他选择如何解决这个问题吗?
traefik - 在将 Traefik 作为 Ingress 控制器运行时添加 HTTP 标头
我有一个在 K8S 中运行的应用程序,使用 Traefik 作为负载均衡器作为入口控制器。虽然我可以轻松设置 Traefik 进行重定向,但我需要为通过 Traefik 的所有查询添加特定的 HTTP 标头。
有没有办法用 Traefik 做到这一点?
干杯,奥利维尔
kubernetes - Kubernetes Nginx ingress.kubernetes.io/rewrite-target 问题由于应用程序中的路径
我将 nginx 与 kube-lego 一起使用,但这并不重要。
我将入口配置为监听 /app1 并将目标重写为 /。
据我了解,问题在于应用程序 UI 从 /assets/example.css 而不是 /app_1/assets/example.css 请求 css 文件,因此 UI 看起来很糟糕。
有人对此有相同的问题、提示或解决方案吗?该应用程序不受我控制。希望有机会解决这个问题。
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
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。
kubernetes - 不同 kubernetes 命名空间中的多个 Traefik 实例
我们正在尝试运行具有三个命名空间的 kubernetes 集群:
public
包含任何人都可以访问的服务internal
包含只能由员工访问的服务engineering
包含应该只对开发人员可见的服务
internal
和engineering
命名空间受到相互身份验证的保护,每个都使用不同的证书颁发机构。
我们使用 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?