向 Openshift 中的 pode 发送 REST 消息
send REST message to pode in Openshift
我有一个 openshift 命名空间 (SomeNamespace
),在那个命名空间中我有几个 pods.
我有一个与该命名空间关联的路由 (SomeRoute
)。
在 pods 之一中,我有 spring 申请。它有 REST 控制器。
我想向那个 REST 控制器发送消息,我该怎么做?
我有一条路线 URL:https://some.namespace.company.name
。接下来我应该找到什么?
我试图向 https://some.namespace.company.name/rest/api/route
发送请求,但没有成功。我想,我必须以某种方式在我的 URL 中指定 pod,这样路由会将请求重定向到具体的 pod,但我不知道该怎么做。
您不需要在路由中指定 pod。
链条是这样的:
Route
公开 Service
的给定端口
Service
通过其 .spec.selector
字段选择一些 pod 将流量路由到
您需要检查您的 Service
和 Route
定义。
示例服务和路线(仅包括资源的相关部分):
Service
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
<label-key>: <label-value>
其中 label-key
和 label-value
是任何标签 key-value 组合,用于选择您的 pod 与 http 应用程序。
Route
spec:
port:
targetPort: 8080-tcp <port name of the service>
to:
kind: Service
name: <service name>
当您的应用在 :8080/rest/api
上公开某些端点时,您可以使用 <route-url>/rest/api
调用它
您可以尝试使用一些示例应用程序(一些我在 github 上随机发现的,以验证您的集群上的一切正常工作):
使用来自 github 存储库的 s2i build 创建一个新应用程序:oc new-app registry.redhat.io/openjdk/openjdk-11-rhel7~https://github.com/redhat-cop/spring-rest
等到 s2i 构建完成并启动 pod
通过路由公开服务:oc expose svc/spring-rest
抓取路线url:oc get route spring-rest -o jsonpath='{.spec.host}'
调用 api: curl -k <route-url>/v1/greeting
响应应该是这样的:{"id":3,"content":"Hello, World!"}
路由是一种OpenShift-specific在集群外暴露服务的方式。
但是,如果您正在开发将部署到 OpenShift 和 Kubernetes 上的应用程序,那么您应该使用 Kubernetes Ingress 对象。
使用 Ingress 意味着您的应用程序的清单在不同的 Kubernetes 集群之间更具可移植性。
- An Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting.
- Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster.
- Traffic routing is controlled by rules defined on the Ingress resource.
因此,如果您想访问您的 REST 控制器:
- 来自 k8s 集群。创建一个 k8s Service 以将一组 Pods 上的应用程序 运行 公开为网络服务:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: your-namespace
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
此规范创建了一个名为“my-service”的新服务对象,它以带有 app=MyApp
标签的任何 Pod 上的 TCP 端口 8080 为目标。
您可以使用此 URL:
访问 REST 控制器
http://my-service
- 外部。创建一个Ingress resource来配置externally-reachableURLs(k8s服务'my-service'应该存在):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-name
namespace: your-namespace
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: my-service
port:
number: 80
您可以使用此 URL:
访问 REST 控制器
http://foo.bar.com
我有一个 openshift 命名空间 (SomeNamespace
),在那个命名空间中我有几个 pods.
我有一个与该命名空间关联的路由 (SomeRoute
)。
在 pods 之一中,我有 spring 申请。它有 REST 控制器。
我想向那个 REST 控制器发送消息,我该怎么做?
我有一条路线 URL:https://some.namespace.company.name
。接下来我应该找到什么?
我试图向 https://some.namespace.company.name/rest/api/route
发送请求,但没有成功。我想,我必须以某种方式在我的 URL 中指定 pod,这样路由会将请求重定向到具体的 pod,但我不知道该怎么做。
您不需要在路由中指定 pod。
链条是这样的:
Route
公开Service
的给定端口
Service
通过其.spec.selector
字段选择一些 pod 将流量路由到
您需要检查您的 Service
和 Route
定义。
示例服务和路线(仅包括资源的相关部分):
Service
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
<label-key>: <label-value>
其中 label-key
和 label-value
是任何标签 key-value 组合,用于选择您的 pod 与 http 应用程序。
Route
spec:
port:
targetPort: 8080-tcp <port name of the service>
to:
kind: Service
name: <service name>
当您的应用在 :8080/rest/api
上公开某些端点时,您可以使用 <route-url>/rest/api
您可以尝试使用一些示例应用程序(一些我在 github 上随机发现的,以验证您的集群上的一切正常工作):
使用来自 github 存储库的 s2i build 创建一个新应用程序:
oc new-app registry.redhat.io/openjdk/openjdk-11-rhel7~https://github.com/redhat-cop/spring-rest
等到 s2i 构建完成并启动 pod
通过路由公开服务:
oc expose svc/spring-rest
抓取路线url:
oc get route spring-rest -o jsonpath='{.spec.host}'
调用 api:
curl -k <route-url>/v1/greeting
响应应该是这样的:
{"id":3,"content":"Hello, World!"}
路由是一种OpenShift-specific在集群外暴露服务的方式。 但是,如果您正在开发将部署到 OpenShift 和 Kubernetes 上的应用程序,那么您应该使用 Kubernetes Ingress 对象。
使用 Ingress 意味着您的应用程序的清单在不同的 Kubernetes 集群之间更具可移植性。
- An Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting.
- Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster.
- Traffic routing is controlled by rules defined on the Ingress resource.
因此,如果您想访问您的 REST 控制器:
- 来自 k8s 集群。创建一个 k8s Service 以将一组 Pods 上的应用程序 运行 公开为网络服务:
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: your-namespace
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
此规范创建了一个名为“my-service”的新服务对象,它以带有 app=MyApp
标签的任何 Pod 上的 TCP 端口 8080 为目标。
您可以使用此 URL:
http://my-service
- 外部。创建一个Ingress resource来配置externally-reachableURLs(k8s服务'my-service'应该存在):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-name
namespace: your-namespace
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: my-service
port:
number: 80
您可以使用此 URL:
访问 REST 控制器http://foo.bar.com