我遵循以下说明https://learn.microsoft.com/en-us/azure/aks/ingress-basic再次在Windows 10上使用Docker for Desktop/Kubernetes。该教程非常有效,现在我想通过添加我的C#/ASP.NETCore3 MVC WebApp KubernetsHelloWorldASPNET来增强它(可在docker hub上获得)。这基本上是Visual Studio 2019为C#ASP.NET/MVC核心Web应用程序创建的模板。
这是你好消息
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-world-ingress
namespace: ingress-basic
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- backend:
serviceName: aks-helloworld-one
servicePort: 80
path: /hello-world-one(/|$)(.*)
- backend:
serviceName: aks-helloworld-two
servicePort: 80
path: /hello-world-two(/|$)(.*)
- backend:
serviceName: kuberneteshelloaspnet
servicePort: 80
path: /kuberneteshelloaspnet(/|$)(.*)
- backend:
serviceName: todolistclient
servicePort: 80
path: /todolistclient(/|$)(.*)
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-world-ingress-static
namespace: ingress-basic
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /static/$2
spec:
rules:
- http:
paths:
- backend:
serviceName: aks-helloworld-one
servicePort: 80
path: /static(/|$)(.*)
这是与上面的ingress教程一起使用的,因为我可以从浏览器中看到KubernetsHelloWorldASPNET的网页(http://localhost/kuberneteshelloaspnet)通过入口。但是,它的格式不正确。我认为问题在于ingress不允许浏览器获取Visual Studio生成的CSS和其他静态文件。
如何使用CSS使我的HelloWorld小程序正确显示?
当直接使用Visual Studio运行时,网页看起来很好(没有docker,没有kubernetes,没有ingress)。
2020年9月9日星期四更新
根据Matt的评论,我在浏览器中使用了开发人员工具,并确认我在bootstrap.min.css、boostrap.bundle.min.js、site.js、jquery.min.js中收到了404个错误。
我在这里找到了一个类似的帖子。然而,该解决方案似乎排除了让ingress容纳多个网站的可能性,每个网站都有自己的CSS和JS目录。他们正在为路径创建规则/css"以及"/js";这让我觉得所有的应用程序都必须共享相同的css和js目录?
我正在按照教程创建一个有通配符的路径。所以我有
path: /kuberneteshelloaspnet(/|$)(.*)
这应该适应(在我的例子中,使用docker for desktop kubernetes)http://localhost/kuberneteshelloaspnet/lib/jquery/dist/jquery.min.js——对吗?好吧,它似乎不起作用!
现在,Chrome中的开发工具网络显示似乎表明js和css文件只有一个文件名,没有路径。但是当点击";检查";我看到了HTML,HTML引用了子目录;lib";以及";css"这与Visual Studio生成的项目目录一致。
很明显,我的入口规则允许访问位于http://localhost:80/kuberneteshelloaspnet但不允许访问http://localhost:80/kuberneteshelloaspnet/lib/jquery/dist/jquery.min.js(例如)。
如何修改入口规则以适应这些静态文件的子目录?
2020年9月12日星期六更新:进展
这个版本的hello-world-ingress.yaml适用于一个web应用程序:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-world-ingress
namespace: ingress-basic
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- backend:
serviceName: kuberneteshelloaspnet
servicePort: 80
path: /
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-world-ingress-static
namespace: ingress-basic
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- backend:
serviceName: kuberneteshelloaspnet
servicePort: 80
path: /lib(/|$)(.*)
这只是一个猜测,我不知道为什么它有效。这个网页似乎能正常工作,因为它的格式正确,而且我在chrome开发者工具面板中没有看到任何404错误。
- 请帮助我理解这个helloworld-ingress.yaml文件的内容。我本来希望看到
kind: service
和后来的kind: deployment
,但我只看到了kind: Ingress
两次。此文件是定义服务还是定义部署,还是同时定义两者 - 有没有可能增强我的解决方案,让我托管多个网站,每个网站都有一个单独的路径,每个网站有单独的子路径,如
/js
、/css
和/lib
,这样每个网站都可以有自己的jquery.min.js副本,因为它们需要不同版本的jquery - 除此之外,我删除了重写规则。我想什么时候使用重写规则?重写规则可以帮助我适应多个网站吗
2020年9月18日星期五:进展我可能在这个博客中找到了使用函数UsePathBase的解决方案。这个博客中描述的症状与我的相匹配。然而,正如我在这里所描述的,我无法做到这一点!调用函数UseBasePath似乎没有任何影响。
感谢
齐格弗里德
我一直在使用演示重写规则的Microsoft Ingress示例。
使用重写规则的问题是,它不能容纳多个具有不同静态文件副本的web应用程序,如jquery.min.js.
C#/VB.NET ASP.NET Core程序员的解决方案是使用UseBasePath。
我希望上面的教程/例子能解释这些不同的选择及其危险和优点。显然,UseBasePath无法与java或python网络应用程序配合使用(尽管可能有对应的应用程序)。
我没有意识到,由于重写规则首先执行以删除路径的根段,因此UseBasePath没有什么可删除的,而且它似乎没有任何影响。
解决方案是在添加对UseBasePath的调用后删除重写规则。
在chrome中检查缺少什么路径。在chrome开发者模式下点击URL(按F12),然后你就会找到。添加该路径&这将得到解决。我也面临同样的问题。