这个问题与question类似,但是更多地是围绕可配置规则的路径。
入口应能够处理内部服务和外部服务。外部服务的网址应类似于http://host_name:80/es。当用户点击该网址时,应将其重定向到外部服务。
服务定义和入口规则如下配置,但导致404。 我要去哪里错了?
进入规则
pack2
服务和端点定义
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
当我尝试使用URL http://host_name:80和以下入口规则时,它可以工作。请注意入口规则中路径的不同。
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
答案 0 :(得分:1)
有一项服务可以将我的请求回显给我:https://postman-echo.com/,稍后将变得有用。 这是它的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
的请求,而回显服务器正在接收/get
。
我在写此答案时注意到的一件事是(也许只是复制粘贴错误,但是)您在注释”
中的引号与"
不同,这可能导致nginx不是适当地处理注释。在我的情况下,由于某种原因,当我复制粘贴您的yaml时,它可以正常工作,但是没有您的注释就可以了,这可能就是我较早没有注意到它的原因。