google 云上的 Kubernetes 网络混乱
Kubernetes networking confusion on google cloud
我对 Kubernetes 还很陌生,我已经玩了几天,对它有了一些感觉。在 this guide 之后尝试在 google-云平台上设置 Nginx Ingress 控制器,我能够按照那里写的那样设置所有内容 - 没问题,我看到了 hello-app 输出。
但是,当我尝试以稍微不同的方式复制它时,我遇到了一个我无法解决的奇怪行为。我没有使用图像 --image=gcr.io/google-samples/hello-app:1.0
(如教程中所做的那样),而是想部署一个带有自定义索引页面的标准 nginx
容器,以查看我是否理解正确。据我所知,除了公开端口外,所有步骤都应该相同:虽然 hello-app
公开端口 8080
,但 nginx
容器的标准端口是 80
.所以,天真地,我认为用这个改变的命令公开(即创建服务)应该可以解决问题:
kubectl expose deployment hello-app --port=8080 --target-port=80
在 hello-app 中,我没有使用 target-port=8080
,而是使用了 target-port=80
。据我所知,所有其他事物应该保持不变,对吗?无论如何,这是行不通的,当我尝试访问该页面时,我得到一个“404 - 未找到”,尽管容器肯定是 运行 并提供索引页面(我使用端口转发从 google 云,这显然直接使页面可用于开发目的)。事实上,我也尝试了其他几种端口组合(虽然我相信上面的应该是正确的)无济于事。谁能给我解释一下为什么路由在这里不起作用?
如果你注意到入口配置里面的教程path: "/hello"
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: "34.122.88.204.nip.io"
http:
paths:
- pathType: Prefix
path: "/hello"
backend:
service:
name: hello-app
port:
number: 8080
您可能已经更新了 端口 号码和 服务 名称配置,但是如果路径 /hello
这意味着您的请求将要Nginx 容器但无法归档页面 hello.html 所以它给你 404.
You hit endpoint IP/hello (Goes to Nginx ingress controller)-->
checked for path /hello
and forwarded request to service -->
hello-app (service forwarded request to PODs) --> Nginx POD (it
doesn't have anything at path /hello
so 404)
404 由 Nginx 编写,在您的情况下,它将是 Nginx ingress controller 或者容器 (POD) 本身。
因此,请尝试在不设置 path path: "/"
的情况下进入配置并点击端点,您可能会看到 Nginx 的输出。
我对 Kubernetes 还很陌生,我已经玩了几天,对它有了一些感觉。在 this guide 之后尝试在 google-云平台上设置 Nginx Ingress 控制器,我能够按照那里写的那样设置所有内容 - 没问题,我看到了 hello-app 输出。
但是,当我尝试以稍微不同的方式复制它时,我遇到了一个我无法解决的奇怪行为。我没有使用图像 --image=gcr.io/google-samples/hello-app:1.0
(如教程中所做的那样),而是想部署一个带有自定义索引页面的标准 nginx
容器,以查看我是否理解正确。据我所知,除了公开端口外,所有步骤都应该相同:虽然 hello-app
公开端口 8080
,但 nginx
容器的标准端口是 80
.所以,天真地,我认为用这个改变的命令公开(即创建服务)应该可以解决问题:
kubectl expose deployment hello-app --port=8080 --target-port=80
在 hello-app 中,我没有使用 target-port=8080
,而是使用了 target-port=80
。据我所知,所有其他事物应该保持不变,对吗?无论如何,这是行不通的,当我尝试访问该页面时,我得到一个“404 - 未找到”,尽管容器肯定是 运行 并提供索引页面(我使用端口转发从 google 云,这显然直接使页面可用于开发目的)。事实上,我也尝试了其他几种端口组合(虽然我相信上面的应该是正确的)无济于事。谁能给我解释一下为什么路由在这里不起作用?
如果你注意到入口配置里面的教程path: "/hello"
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: "34.122.88.204.nip.io"
http:
paths:
- pathType: Prefix
path: "/hello"
backend:
service:
name: hello-app
port:
number: 8080
您可能已经更新了 端口 号码和 服务 名称配置,但是如果路径 /hello
这意味着您的请求将要Nginx 容器但无法归档页面 hello.html 所以它给你 404.
You hit endpoint IP/hello (Goes to Nginx ingress controller)--> checked for path
/hello
and forwarded request to service --> hello-app (service forwarded request to PODs) --> Nginx POD (it doesn't have anything at path/hello
so 404)
404 由 Nginx 编写,在您的情况下,它将是 Nginx ingress controller 或者容器 (POD) 本身。
因此,请尝试在不设置 path path: "/"
的情况下进入配置并点击端点,您可能会看到 Nginx 的输出。