首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用主机的入口规则

使用主机的入口规则
EN

Stack Overflow用户
提问于 2021-07-20 04:28:21
回答 1查看 1.7K关注 0票数 1

有人能帮我找出ingress-2入口规则的问题吗?为什么ingress-1在工作,而ingress-2不起作用。

关于我的设置的描述,我有两个部署:

第一次部署是nginx

第二次部署是httpd

这两个部署都是通过分别名为ClusterIP服务的nginx-svchttpd-svc公开的。所有的endpoints都适合于服务。但是,在设置这些服务的入口时,我无法使用host (如ingress-2中所述)设置入口。然而,当我使用ingress-1时,一切都很好。

//我的主机文件用于名称解析

代码语言:javascript
复制
grep myapp.com /etc/hosts
127.0.0.1        myapp.com

//部署细节

代码语言:javascript
复制
kubectl get deployments.apps
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           29m
httpd   3/3     3            3           29m

//服务详情

代码语言:javascript
复制
kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP   7h48m
nginx-svc    ClusterIP   10.152.183.233   <none>        80/TCP    28m
httpd-svc    ClusterIP   10.152.183.58    <none>        80/TCP    27m

//终点详情

代码语言:javascript
复制
kubectl get ep
NAME         ENDPOINTS                                      AGE
kubernetes   10.0.2.15:16443                                7h51m
nginx-svc    10.1.198.86:80,10.1.198.87:80,10.1.198.88:80   31m
httpd-svc    10.1.198.89:80,10.1.198.90:80,10.1.198.91:80   31m

尝试-1:ingress-1

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-1
spec:
  rules:
  - http:
      paths:
      - path: /nginx
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80

      - path: /httpd
        pathType: Prefix
        backend:
          service:
            name: httpd-svc
            port:
              number: 80

//示例显示,当使用ingress-1时,入口路由运行良好:

代码语言:javascript
复制
 curl myapp.com/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


 curl myapp.com/httpd
<html><body><h1>It works!</h1></body></html>

//遵循入口规则不像我预期的那样起作用

尝试-2:ingress-2

代码语言:javascript
复制
kind: Ingress
metadata:
  name: ingress-2
spec:
  rules:
  - host: "myapp.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx"
        backend:
          service:
            name: nginx-svc
            port:
              number: 80
      - pathType: Prefix
        path: "/httpd"
        backend:
          service:
            name: httpd-svc
            port:
              number: 80

//我在描述中找不到任何问题

代码语言:javascript
复制
kubectl describe  ingress ingress-2
Name:             ingress-2
Namespace:        default
Address:          127.0.0.1
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host          Path  Backends
  ----          ----  --------
  myapp.com
                /nginx   nginx-svc:80 (10.1.198.86:80,10.1.198.87:80,10.1.198.88:80)
                /httpd   httpd-svc:80 (10.1.198.89:80,10.1.198.90:80,10.1.198.91:80)
Annotations:    <none>
Events:
  Type    Reason  Age                  From                      Message
  ----    ------  ----                 ----                      -------
  Normal  Sync    9m15s (x2 over 10m)  nginx-ingress-controller  Scheduled for sync

//示例显示入口路由无法处理此入口资源

代码语言:javascript
复制
curl myapp.com/nginx
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.21.1</center>
</body>
</html>

curl myapp.com/httpd
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-20 19:27:06

两种不同

我创建了一个单节点microk8s集群下列正式文件,无法再现您描述的行为,这是正确的行为。添加了两个带有mendhak/http-https-echo映像的豆荚(强烈推荐:非常方便地排除入口或理解入口的工作原理),并为每个豆荚添加了两个服务。

两个入口规则的不同之处在于,首先在所有域(主机)上侦听入口规则:

代码语言:javascript
复制
$ mkctl get ing -o wide
NAME        CLASS    HOSTS   ADDRESS     PORTS   AGE
ingress-1   public   *       127.0.0.1   80      2m53s

$ curl -I --header "Host: myapp.com" http://127.0.0.1/httpd
HTTP/1.1 200 OK

$ curl -I --header "Host: example.com" http://127.0.0.1/httpd
HTTP/1.1 200 OK

$ curl -I --header "Host: myapp.com" http://127.0.0.1/missing_url
HTTP/1.1 404 Not Found

虽然第二个入口规则只适用于myapp.com域(主机):

代码语言:javascript
复制
$ mkctl get ing
NAME        CLASS    HOSTS       ADDRESS     PORTS   AGE
ingress-2   public   myapp.com   127.0.0.1   80      60s

$ curl -I --header "Host: myapp.com" http://127.0.0.1/httpd
HTTP/1.1 200 OK

$ curl -I --header "Host: example.com" http://127.0.0.1/httpd
HTTP/1.1 404 Not Found

到底发生了什么

你问题中的最后一个结果实际上表明,入口正如预期的那样工作。您得到的响应不是来自kubernetes ingress,而是来自集群中的荚。第一个响应是来自nginx 1.21.0404,第二个是来自apache404

之所以会发生这种情况,是因为在没有任何转换的情况下,入口从URL向具有相同path的荚发送请求。例如(我使用上面提到的图像获得的输出):

代码语言:javascript
复制
$ curl myapp.com/httpd
{
  "path": "/httpd"
...

nginxapache都在/上服务。

如何解决这个问题

Nginx有很多特性,其中一个是重写,它有助于将paths从入口转化为豆荚。

例如,如果请求转到http://myapp.com/nginx,那么它将被定向到带有/nginx路径的nginx服务,这将导致nginx抛出404,因为这个path上没有任何东西。

下面的入口规则通过将rewrite-target添加到/ (我们需要传递给nginxapache服务)来修正这个问题:

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-2
  annotations:
#    kubernetes.io/ingress.class: nginx # this should be uncommented if ingress used in "regular" cluster
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /nginx
        pathType: Prefix
        backend:
          service:
            name: service-a
            port:
              number: 80
      - path: /httpd
        pathType: Prefix
        backend:
          service:
            name: service-b
            port:
              number: 80

快速测试它的工作方式:

代码语言:javascript
复制
$ curl myapp.com/nginx
{
  "path": "/",
...

代码语言:javascript
复制
$ curl myapp.com/httpd
{
  "path": "/",
...

正如您现在看到的,path/

将图像切换到nginx,并:

代码语言:javascript
复制
$ curl myapp.com/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

有用的链接

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68449554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档