这个问题类似于question,但更多的是围绕可以配置的规则中的路径。
入口应该能够同时处理内部服务和外部服务。外部服务的Url应该类似于http://host_name:80/es。当用户点击这个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当我尝试使用URL http://host_name:80和下面的入口规则时,它就起作用了。请注意入口规则中路径的不同。
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: /发布于 2020-05-14 07:33:37
有一个服务可以将我的请求反馈给我: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 20hip是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时,它是工作的,但是它没有你的注释,所以这可能是我之前没有注意到它的原因。
https://stackoverflow.com/questions/61750709
复制相似问题