首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes外部服务的入口规则

Kubernetes外部服务的入口规则
EN

Stack Overflow用户
提问于 2020-05-12 11:35:48
回答 1查看 3.2K关注 0票数 1

这个问题类似于question,但更多的是围绕可以配置的规则中的路径。

入口应该能够同时处理内部服务和外部服务。外部服务的Url应该类似于http://host_name:80/es。当用户点击这个url时,应该将其重定向到外部服务。

服务定义和入口规则配置如下,但它导致404。我哪里出问题了?

入侵规则

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: external-service
  annotations:
    kubernetes.io/ingress.class: “nginx”
    nginx.ingress.kubernetes.io/ingress.class: “nginx”
    nginx.ingress.kubernetes.io/ssl-redirect: “false”
spec:
  rules:
  - host:
    http:
      paths:
      - backend:
          serviceName: external-ip
          servicePort: 80
        path: /es

服务和端点定义

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: external-ip
spec:
  ports:
  - name: app
    port: 80
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-ip
subsets:
- addresses:
  - ip: <ip to external service>
  ports:
  - name: app
    port: 80
    protocol: TCP

当我尝试使用URL http://host_name:80和下面的入口规则时,它就起作用了。请注意入口规则中路径的不同。

代码语言:javascript
复制
apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: external-service
      annotations:
        kubernetes.io/ingress.class: “nginx”
        nginx.ingress.kubernetes.io/ingress.class: “nginx”
        nginx.ingress.kubernetes.io/ssl-redirect: “false”
    spec:
      rules:
      - host:
        http:
          paths:
          - backend:
              serviceName: external-ip
              servicePort: 80
            path: /
EN

回答 1

Stack Overflow用户

发布于 2020-05-14 07:33:37

有一个服务可以将我的请求反馈给我:https://postman-echo.com/,它稍后会很有用。下面是它的ip,它将模拟您的外部服务:

代码语言:javascript
复制
$ dig postman-echo.com +short
107.23.20.188

它的工作如下:

代码语言:javascript
复制
$ curl 107.23.20.188/get | jq
{
  "args": {},
  "headers": {
    "x-forwarded-proto": "http",
    "x-forwarded-port": "80",
    "host": "107.23.20.188",
    "x-amzn-trace-id": "Root=1-5ebced9c-941e363cc28bf3529b8e7246",
    "user-agent": "curl/7.52.1",
    "accept": "*/*"
  },
  "url": "http://107.23.20.188/get"
}

因此,正如您所看到的,它向我发送了一个包含我发送给它的所有头的json,最重要的是- url和它接收到的路径。

这是我用的入口yaml:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: external-service
  annotations:
    #kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host:
    http:
      paths:
      - backend:
          serviceName: external-ip
          servicePort: 80
        path: /es/(.*)

服务和端点定义与您的相同,端点IP除外。这里我使用了107.23.20.188 (邮递员-回显IP)。

现在让我们尝试通过nginx发送一些请求,但是首先让我们检查一下什么是入口ip:

代码语言:javascript
复制
$ kubectl get ingress
NAME               HOSTS   ADDRESS         PORTS   AGE
external-service   *       192.168.39.96   80      20h

ip是192.168.39.96和它的私有IP,因为我是在minikube上运行它,但这不重要。

代码语言:javascript
复制
$ curl -s 192.168.39.96/es/get
{
  "args": {},
  "headers": {
    "x-forwarded-proto": "http",
    "x-forwarded-port": "80",
    "host": "192.168.39.96",
    "x-amzn-trace-id": "Root=1-5ebcf259-6331e8c709656623f1a94ed4",
    "x-request-id": "d1545d1e8764da3cf57abb143faac4fb",
    "x-forwarded-host": "192.168.39.96",
    "x-original-uri": "/es/get",
    "x-scheme": "http",
    "user-agent": "curl/7.52.1",
    "accept": "*/*"
  },
  "url": "http://192.168.39.96/get"
}

因此,正如您所看到的,我正在发送路径/es/get的请求,而回送服务器正在接收/get

在编写这个答案时,我注意到一件事:(可能只是复制粘贴错误,但是)注释中的引号与"不同,这可能导致nginx没有按应有的方式处理注释。当我复制粘贴你的yaml时,它是工作的,但是它没有你的注释,所以这可能是我之前没有注意到它的原因。

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

https://stackoverflow.com/questions/61750709

复制
相关文章

相似问题

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