Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes外部服务入口规则_Kubernetes_External_Nginx Ingress - Fatal编程技术网

Kubernetes外部服务入口规则

Kubernetes外部服务入口规则,kubernetes,external,nginx-ingress,Kubernetes,External,Nginx Ingress,此问题类似于,但更多的是围绕规则中可配置的路径 入口应能够处理内部服务和外部服务。外部服务的Url应该类似于。当用户点击此url时,应将其重定向到外部服务 服务定义和入口规则配置如下,但它导致404。 我哪里做错了 入口规则 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: external-service annotations: kubernetes.io/ingress.class: “nginx”

此问题类似于,但更多的是围绕规则中可配置的路径

入口应能够处理内部服务和外部服务。外部服务的Url应该类似于。当用户点击此url时,应将其重定向到外部服务

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

入口规则

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
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
服务和端点定义

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
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

有一个服务可以将我的请求回显给我:,以后会有用的。 这是它的ip,它将模拟您的外部服务:

$ dig postman-echo.com +short
107.23.20.188
其工作原理如下:

$ 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:

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:

$ kubectl get ingress
NAME               HOSTS   ADDRESS         PORTS   AGE
external-service   *       192.168.39.96   80      20h
ip是
192.168.39.96
和它的私有ip,因为我在minikube上运行它,但这不重要

$ 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
的请求,而echo服务器正在接收路径
/get



我在写这个答案时注意到的一点是(可能只是复制粘贴错误),注释中的引号与注释中的引号不同“这可能会导致nginx没有按其应有的方式处理注释。当我复制粘贴你的yaml时,出于某种原因,我的情况是正常的,但它没有你的注释,所以这可能是我之前没有注意到它的原因。

请尝试不使用
kubernetes.io/ingres.class
注释?如果问题解决了,请告诉我it@HelloWorld它不起作用您使用的是什么nginx和k8s版本(在我的k8s中,它似乎起作用)?另外,请解释您是如何部署nginx的,因为我想尝试复制它。您提到的外部服务是否有
/es
路径?请按照nginx文档中的指定使用。