gpt4 book ai didi

外部服务的 Kubernetes 入口规则

转载 作者:行者123 更新时间:2023-12-02 12:11:59 25 4
gpt4 key购买 nike

这个问题类似于 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: /

最佳答案

有一项服务可以将我的请求回显给我: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,其中包含我发送给它的所有 header ,最重要的是 - 带有它接收到的路径的 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(postman-echo IP)。

现在让我们尝试通过 nginx 发送一些请求,但首先让我们检查一下入口 ip:
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
external-service * 192.168.39.96 80 20h

ip是 192.168.39.96以及它的私有(private) 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 时,我的情况是它正在工作,但它没有你的注释,所以这可能是我之前没有注意到它的原因。

关于外部服务的 Kubernetes 入口规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61750709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com