Kubernetes外部服务入口规则
此问题类似于,但更多的是围绕规则中可配置的路径 入口应能够处理内部服务和外部服务。外部服务的Url应该类似于。当用户点击此url时,应将其重定向到外部服务 服务定义和入口规则配置如下,但它导致404。 我哪里做错了 入口规则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”
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文档中的指定使用。