此问题与问题类似,但更多是围绕规则中可以配置的路径。
入口应该能够同时处理内部服务和外部服务。外部服务的URL应该类似于超文本传输协议://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
服务和endpoint定义
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,其中包含我发送给它的所有头,最重要的是,包含它接收的路径的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/(.*)
除了endpointIP之外,服务和endpoint定义与您的定义保持一致。这里我使用了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"
}
如您所见,我正在发送路径请求,echo服务器正在接收路径请求。
在写这个答案时我注意到的一件事是(也许只是复制粘贴错误,但是)您在注释"
中的引用与"
不同,这可能导致nginx没有按应有的方式处理注释。出于某种原因,当我复制粘贴您的yaml时,它正在工作,但在没有您的注释的情况下它确实如此,所以这可能是我之前没有注意到它的原因。
假设我有一个不在Kubernetes上托管的服务。我还在kubernetes集群上设置了入口控制器和证书管理器。 因为使用kubernetes入口来控制对服务的访问非常简单,所以我想要一个指向非kubernetes服务的kubernetes入口。 例如,我有一个托管在<代码>https://10.0.40.1:5678(需要ssl,但需要自签名证书),并希望访问服务。实例com。
kubernetes-dashboard的yaml文件如下所示:apiversion:networking.k8s.io/v1 kind:Ingress metadata:name:dashboard-Ingress namespace:kubernetes-dashboard spec:tls:-hosts:-dashboard.com secretname:kubernetes-dashboa
我正在尝试在kubernetes上部署nginx,kubernetes版本是V1.5.2,我已经部署了3个副本的nginx,下面是YAML文件, 现在我要在节点的端口30062上公开它的端口80,为此我在下面创建了一个服务,
https://kubernetes.io/docs/concepts/services-networking/Ingress/中的入口示例显示,为了指定bancked入口,我们必须指定servicePort和serviceName,例如: 我希望创建具有随机端口的服务,并避免在入口定义中指定它们。有没有ServicePort的替代方案?也许使用服务中分配的端口名称或targetPort?
我正在尝试在minikube(Windows-10)上部署简单的spring boot REST服务。下面是我的配置 Docker文件 docker image运行良好,我能够运行该应用程序。 部署 服务 我无法使用< code > service-IP:node port/Uri < br > http://127 . 0 . 0 . 1:30008/hello访问restendpoint ht
我正在尝试用MiniKube在azure VM上从外部运行和访问Hello节点服务。 minikube启动--Driver=VirtualBox 已创建部署 kubectl创建部署hello-node--image=k8s.gcr.io/echoServer 公开部署 kubectl公开部署hello-node--type=loadbalancer--port=8080 假设kubectl get