Kubernetes 如果使用K8s入口部署web应用程序,则JS 404错误
我正在尝试官方的例子 一切都很好,但是当我为它部署一个Kubernetes 如果使用K8s入口部署web应用程序,则JS 404错误,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我正在尝试官方的例子 一切都很好,但是当我为它部署一个ingres时,我可以在chrome网络调试中看到下一个(这里,31083是节点端口): ingress.yaml: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gb-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http
ingres
时,我可以在chrome网络调试中看到下一个(这里,31083是节点端口):
ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gb-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /gb
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
<html ng-app="guestbook">
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<title>Guestbook</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
<script src="controllers.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.0/ui-bootstrap-tpls.js"></script>
</head>
<body ng-controller="guestbookCtrl">
<div style="width: 50%; margin-left: 20px">
<h2>Guestbook</h2>
<form>
<fieldset>
<input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br>
<button type="button" class="btn btn-primary" ng-click="controller.onguestbook()">Submit</button>
</fieldset>
</form>
<div>
<div ng-repeat="msg in messages track by $index">
{{msg}}
</div>
</div>
</div>
</body>
</html>
入口nginx:(使用一个)
我从chrome获得的K8s留言簿索引页的源代码:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gb-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /gb
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
<html ng-app="guestbook">
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<title>Guestbook</title>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
<script src="controllers.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.0/ui-bootstrap-tpls.js"></script>
</head>
<body ng-controller="guestbookCtrl">
<div style="width: 50%; margin-left: 20px">
<h2>Guestbook</h2>
<form>
<fieldset>
<input ng-model="msg" placeholder="Messages" class="form-control" type="text" name="input"><br>
<button type="button" class="btn btn-primary" ng-click="controller.onguestbook()">Submit</button>
</fieldset>
</form>
<div>
<div ng-repeat="msg in messages track by $index">
{{msg}}
</div>
</div>
</div>
</body>
</html>
留言簿
留言簿
提交
{{msg}}
我知道我的入口
只需指定/gb
前缀,所以http://10.192.244.109:31083/controllers.js
无法路由到正确的服务,但如何才能使其正常工作
我想也许可以为
js
rewrite添加另一个入口规则,但是如果我有多个应用程序呢?有什么建议吗?您应该能够使用正确的路径执行此操作模式:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gb-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /gb(/|$)(.*)
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
这将以以下方式重写请求:
- /gb->/
- /gb/controller.js->/controller.js
- /gb/foo->/foo
http://10.192.244.109:31083/controllers.js
对于后端,您的/gb/controller.js
看起来没有机会生效?您的更改只会使http://10.192.244.109:31083/gb/controllers.js
如果我手动将此url粘贴到浏览器,则确定访问。但是留言簿索引页确实发送http://10.192.244.109:31083/controllers.js
到后端,url中没有gb
,因此看起来您的修复程序没有工作的机会。只是为了正确理解您:controller.js是从服务“frontend”提供的还是从其他服务提供的?如果文件是从与索引页相同的服务(前端服务)提供的,那么您希望在/gb/
下提供索引以及/
下提供所有其他内容的原因是什么?请参阅和。是的,文件来自同一个POD,同一个服务,事实上在docker容器中,我可以在同一个文件夹中看到它们:root@frontend-868556665f-g94bm:/var/www/html#ls controllers.js guestbook.php index.html
。这不是我想要它在“/”前缀中,所有代码都是k8s官方示例,我只是不能让它与ingress nginx一起工作…如果我可以让浏览器访问http://10.192.244.109:31083/gb/controllers.js
非http://10.192.244.109:31083/controllers.js
,则一切正常。但我不知道怎么。。。它在index.html
中定义为下一个
,我也看到了,答案提到我们需要在
中删除/
,但这里它已经不是/controllers.js
。我想这是一个简单的常见问题,但我很惊讶我没有找到任何好的答案通过谷歌,仍然在谷歌