nginx - kubernetes nginx ingress 是如何在没有特定配置的情况下选择合适的 pod 来平衡的?
问题描述
建筑学
- 我在 Google Kubernetes Engine (GKE) 的多节点集群中有一个命名空间,我们称之为
project-namespace
- 其中
project-namespace
有一个前端应用程序(复制)和一些后端应用程序(每个都复制)- 前端:
fe1
->fe1-r1
,fe1-r2
,fe1-r3
- 后端1:-
be1
>be1-r1
,,,be1-r2
be1-r3
- 后端2:-
be2
>be2-r1
,,,be2-r2
be2-r3
- 后端N:
...
- 前端:
be1
是一个例外,它需要从外部访问,所以我通过谷歌云默认负载均衡器公开它:GKE-BL-be1
->be1-r1
,be1-r2
,be1-r3
- 所有其他应用程序,包括
fe1
由ClusterIP
服务支持
客观的
我暴露了fe1
通过 nginx 入口而不是 GKE 默认入口
我做了什么
- 我在 nginx-ingress 的“入门”文档中下载了这个操作符文件:
curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.43.0/deploy/static/provider/cloud/deploy.yaml \
> ingress.yaml
- 我替换了运营商使用的命名空间
sed -i 's/namespace: ingress-nginx/namespace: project-namespace/g'
- 我部署了操作员文件
kubectl apply -f ingress.yaml
- 这创建了所有资源和 nginx 入口负载均衡器,使集群外部的端口 80 和 443 可用,而我的其他应用程序 pod 没有使用 k8s 标签。
发生了什么
从浏览器我可以fe1
使用 nginx 入口的外部 ip 访问,并且从fe1
pod 日志中我看到这些请求实际上是由这些 pod 提供的。我将 Pod 缩小到 0 个副本,fe1
并且没有人再响应我的浏览器请求。
所以实际上目标已经实现,但我无法控制它,我没有在 nginx 入口中配置任何东西,我只使用了操作员文件。此外,gui 仅通过暴露ClusterIP
,我没有在 nginx 入口和fe1
ClusterIP
.
为什么这行得通?我缺少哪个配置?
编辑:
经过一些故障排除后,我发现在“入口”部分我已经部署了一个指向 gui pod 的 GKE 入口,问题是 nginx 入口服务与 GKE 入口使用相同的 IP 地址,所以实际上我的浏览器正在发送请求到旧入口。现在我的疑问是:新的 nginx 入口控制器怎么可能采用与 GKE 旧控制器相同的 ip?
解决方案
为了在 Google Kubernetes Engine 上部署 NGINX 入口控制器,您可能会发现以下链接很有用。请记住这一点:
默认配置监视来自所有命名空间的 Ingress 对象。要更改此行为,请使用标志
--watch-namespace
将范围限制为特定命名空间。
推荐阅读
- fastlane - bitrise 在 Applications/Xcode-beta.app/Contents/Developer 找不到传输器
- node.js - Puppeteer 从 elementHandle 获取元素导致协议错误
- spring - 如何在spring boot中配置多个身份验证提供?
- javascript - 带有滞后的移动按钮控件的 JavaScript 游戏
- android - TabLayout 根本没有填充 ViewPager
- php - 未找到 Laravel 存储请求(使用 axios)
- sql - SQL Server drop query request
- c# - 捕获“指定的演员表无效。” 在 C# ASP.net MVC 中接收数据时出错?
- c++ - 编写另一个以 LPCTSTR 开头的文本行的最佳方法是什么?
- django - Heroku 应用程序在 gitlab-ci 推送和发布后崩溃