由于您已经使用自己的答案来补充问题,因此我将回答您提出的所有问题,同时提供分而治之的策略来排除 kubernetes 网络故障。
最后我会给你一些nginx和IP的答案
这是对的
- host: test3.projectname.org
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-kubernetes-first
port:
number: 80
使用 Ingress 分解故障排除
- DNS
- Ingress
- Service
- Pod
- 证书
1.DNS
您可以使用命令 dig 来查询 DNS
dig google.com
![dig result](https://i.stack.imgur.com/hBwrC.png)
- Ingress
入口控制器不查找 IP,它只查找标头
您可以使用任何可以更改标头的工具强制主机,例如curl
curl --header 'Host: test3.projectname.com' http://123.123.123.123
(您的公共IP)
- Service
您可以通过创建 ubuntu/centos pod 来确保您的服务正在运行,使用kubectl exec -it podname -- bash
并尝试在集群内卷曲您的服务表单
- Pod
你得到这个
192.168.14.57 - - [14/Nov/2021:12:02:58 +0000] "GET /test2 HTTP/2.0" 404 144
"-" "<browser's user-agent header value>" 448 0.002
这部分GET /test2
意味着请求从 DNS 获取地址,从互联网一路发送,找到您的集群,找到您的入口控制器,通过服务并到达您的 pod。恭喜!你的入口正在工作!
但是为什么会返回404呢?
传递到服务以及从服务到 pod 的路径是 /test2
你有 nginx 可以提供的名为 test2 的文件吗?你的 nginx 中是否有一个带有 test2 前缀的上游配置?
这就是为什么,您从 nginx 而不是从入口控制器获得 404。
这些 IP 是内部的,请记住,互联网流量在集群边界结束,现在您位于内部网络中。这是正在发生的事情的粗略草图
假设您正在从笔记本电脑访问它。您的笔记本电脑的 IP 为 192.168.123.123,但您的家庭地址为 7.8.9.1,因此当您的请求到达集群时,集群会看到 7.8.9.1 请求 test3.projectname.com。
集群寻找入口控制器,入口控制器找到合适的配置并将请求传递给服务,服务再将请求传递给 Pod。
So,
your router can see your private IP (192.168.123.123)
Your cluster(ingress) can see your router's IP (7.8.9.1)
Your service can see the ingress's IP (192.168.?.?)
Your pod can see the service's IP (192.168.14.57)
这是一个传递的游戏。
如果您想在 nginx 日志中查看公共 IP,则需要对其进行自定义以获取 X-Real-IP 标头,该标头通常是负载均衡器/入口/大使/代理放置实际请求者公共 IP 的位置。