使用 openshift 外部服务定位外部 REST API
Targetting external REST API using openshift external service
我希望我的应用程序托管在 Openshift 集群中以外部 REST API 为目标,而无需在客户端应用程序中进行硬编码 IP/PORT,并且能够更改 IP/PORT 而无需重新提交应用程序。
我设法通过 ConfigMap 做到了,但我发现也可以通过服务 in OpenShift doc。
但是我没能理解它是如何工作的。我做了以下事情:
创建服务
sylvain@HP:~$ oc export svc example-external-service
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: example-external-service
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
创建端点
sylvain@HP:~$ oc export endpoints example-external-service
apiVersion: v1
kind: Endpoints
metadata:
creationTimestamp: null
name: example-external-service
subsets:
- addresses:
- ip: 216.58.198.195
ports:
- name: "80"
port: 80
protocol: TCP
从我的应用所在的 POD 对我的服务进行卷曲 运行
sylvain@HP:~$ oc get pods
NAME READY STATUS RESTARTS AGE
nodejs-example-1-qnq46 1/1 Running 0 36m
sylvain@HP:~$ oc rsh nodejs-example-1-qnq46
sh-4.2$ env | grep "EXAMPLE_EXTERNAL"
EXAMPLE_EXTERNAL_SERVICE_SERVICE_PORT_HTTP=80
EXAMPLE_EXTERNAL_SERVICE_SERVICE_PORT=80
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_PORT=80
EXAMPLE_EXTERNAL_SERVICE_SERVICE_HOST=172.30.51.168
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_ADDR=172.30.51.168
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_PROTO=tcp
EXAMPLE_EXTERNAL_SERVICE_PORT=tcp://172.30.51.168:80
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP=tcp://172.30.51.168:80
sh-4.2$ curl 172.30.51.168
curl: (7) Failed connect to 172.30.51.168:80; No route to host
sh-4.2$ curl 216.58.198.195
<HTML><HEAD><meta http-equiv="content-type" content="text/html; charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
sh-4.2$
在第一个 curl 中使用端点中定义的地址是有效的,但是使用环境变量中的地址:
EXAMPLE_EXTERNAL_SERVICE_SERVICE_HOST=172.30.51.168
失败,所以路由没有正确完成。
我做错了什么?我错过了什么?
干杯
在您的端点配置中,将端口 80 ("80"
) 的名称更改为 http
。需要和服务配置中的一致。
我希望我的应用程序托管在 Openshift 集群中以外部 REST API 为目标,而无需在客户端应用程序中进行硬编码 IP/PORT,并且能够更改 IP/PORT 而无需重新提交应用程序。
我设法通过 ConfigMap 做到了,但我发现也可以通过服务 in OpenShift doc。
但是我没能理解它是如何工作的。我做了以下事情:
创建服务
sylvain@HP:~$ oc export svc example-external-service
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: example-external-service
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
创建端点
sylvain@HP:~$ oc export endpoints example-external-service
apiVersion: v1
kind: Endpoints
metadata:
creationTimestamp: null
name: example-external-service
subsets:
- addresses:
- ip: 216.58.198.195
ports:
- name: "80"
port: 80
protocol: TCP
从我的应用所在的 POD 对我的服务进行卷曲 运行
sylvain@HP:~$ oc get pods
NAME READY STATUS RESTARTS AGE
nodejs-example-1-qnq46 1/1 Running 0 36m
sylvain@HP:~$ oc rsh nodejs-example-1-qnq46
sh-4.2$ env | grep "EXAMPLE_EXTERNAL"
EXAMPLE_EXTERNAL_SERVICE_SERVICE_PORT_HTTP=80
EXAMPLE_EXTERNAL_SERVICE_SERVICE_PORT=80
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_PORT=80
EXAMPLE_EXTERNAL_SERVICE_SERVICE_HOST=172.30.51.168
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_ADDR=172.30.51.168
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP_PROTO=tcp
EXAMPLE_EXTERNAL_SERVICE_PORT=tcp://172.30.51.168:80
EXAMPLE_EXTERNAL_SERVICE_PORT_80_TCP=tcp://172.30.51.168:80
sh-4.2$ curl 172.30.51.168
curl: (7) Failed connect to 172.30.51.168:80; No route to host
sh-4.2$ curl 216.58.198.195
<HTML><HEAD><meta http-equiv="content-type" content="text/html; charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
sh-4.2$
在第一个 curl 中使用端点中定义的地址是有效的,但是使用环境变量中的地址:
EXAMPLE_EXTERNAL_SERVICE_SERVICE_HOST=172.30.51.168
失败,所以路由没有正确完成。
我做错了什么?我错过了什么?
干杯
在您的端点配置中,将端口 80 ("80"
) 的名称更改为 http
。需要和服务配置中的一致。