向 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 将流量路由到

您需要检查您的 ServiceRoute 定义。

示例服务和路线(仅包括资源的相关部分):

Service

spec:
  ports:
  - name: 8080-tcp
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    <label-key>: <label-value>

其中 label-keylabel-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 集群之间更具可移植性。

来自official Kubernetes docs

  • 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