28.3. 使用 Ingress Controller 配置集群入口流量

OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用了 Ingress Controller。

28.3.1. 使用 Ingress Controller 和路由

Ingress Operator 管理 Ingress Controller 和通配符 DNS。

使用 Ingress Controller 是允许从外部访问 OpenShift Container Platform 集群的最常用方法。

Ingress Controller 配置为接受外部请求并根据配置的路由进行代理。这仅限于 HTTP、使用 SNI 的 HTTPS 以及使用 SNI 的 TLS,对于通过使用 SNI 的 TLS 工作的 Web 应用程序和服务而言已经足够。

与管理员合作将 Ingress Controller 配置为接受外部请求并根据配置的路由进行代理。

管理员可以创建通配符 DNS 条目,再设置 Ingress Controller。然后,您可以处理边缘 Ingress Controller,无需与管理员联系。

默认情况下,集群中的每个 Ingress Controller 都可以接受集群中任何项目中创建的所有路由。

Ingress Controller:

  • 默认有两个副本;即,它应该在两个 worker 节点上运行。
  • 可以纵向扩张,以在更多节点上具有更多副本。
注意

这部分中的流程需要由集群管理员执行先决条件。

28.3.2. 先决条件

在开始以下流程前,管理员必须:

  • 设置集群联网环境的外部端口,使请求能够到达集群。
  • 确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:

    $ oc adm policy add-cluster-role-to-user cluster-admin username
  • 有一个 OpenShift Container Platform 集群,其至少有一个 master 和至少一个节点,并且集群外有一个对集群具有网络访问权限的系统。此流程假设外部系统与集群位于同一个子网。不同子网上外部系统所需要的额外联网不在本主题的讨论范围内。

28.3.3. 创建项目和服务

如果您要公开的项目和服务尚不存在,请首先创建项目,再创建服务。

如果项目和服务都已存在,跳到公开服务以创建路由这一步。

先决条件

  • 按照 oc CLI 并以一个集群管理员身份登陆。

流程

  1. 运行 oc new-project 命令为您的服务创建一个新项目:

    $ oc new-project myproject
  2. 使用 oc new-app 命令来创建服务:

    $ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
  3. 要验证该服务是否已创建,请运行以下命令:

    $ oc get svc -n myproject

    输出示例

    NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    nodejs-ex   ClusterIP   172.30.197.157   <none>        8080/TCP   70s

    默认情况下,新服务没有外部 IP 地址。

28.3.4. 通过创建路由公开服务

您可以使用 oc expose 命令,将服务公开为路由。

流程

公开服务:

  1. 登录 OpenShift Container Platform。
  2. 登录您想公开的服务所在的项目:

    $ oc project myproject
  3. 运行 oc expose service 命令以公开路由:

    $ oc expose service nodejs-ex

    输出示例

    route.route.openshift.io/nodejs-ex exposed

  4. 要验证该服务是否已公开,您可以使用 cURL 等工具来确保该服务可从集群外部访问。

    1. 使用 oc get route 命令查找路由的主机名:

      $ oc get route

      输出示例

      NAME        HOST/PORT                        PATH   SERVICES    PORT       TERMINATION   WILDCARD
      nodejs-ex   nodejs-ex-myproject.example.com         nodejs-ex   8080-tcp                 None

    2. 使用 cURL 检查主机是否响应 GET 请求:

      $ curl --head nodejs-ex-myproject.example.com

      输出示例

      HTTP/1.1 200 OK
      ...

28.3.5. 通过路由标签(label)配置 Ingress Controller 分片

使用路由标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由路由选择器选择的任意命名空间中的所有路由。

图 28.1. 使用路由标签进行 Ingress 分片

显示带有不同路由选择器的多个 Ingress Controller 的图,它包括了与给定路由选择器匹配的标签,而不考虑路由所属的命名空间

在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。

流程

  1. 编辑 router-internal.yaml 文件:

    # cat router-internal.yaml
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: sharded
      namespace: openshift-ingress-operator
    spec:
      domain: <apps-sharded.basedomain.example.net> 1
      nodePlacement:
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
      routeSelector:
        matchLabels:
          type: sharded
    1
    指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
  2. 应用 Ingress Controller router-internal.yaml 文件:

    # oc apply -f router-internal.yaml

    Ingress Controller 选择具有 type: sharded 标签的任意命名空间中的路由。

  3. 使用 router-internal.yaml 中配置的域创建新路由:

    $ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net

28.3.6. 使用命名空间标签配置 Ingress Controller 分片

使用命名空间标签进行 Ingress Controller 分片,意味着 Ingress Controller 提供由命名空间选择器选择的任意命名空间中的所有路由。

图 28.2. 使用命名空间标签进行 Ingress 分片

显示多个具有不同命名空间选择器服务路由的 Ingress Controller,这些路由属于命名空间,包含与给定命名空间选择器匹配的标签

在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。

流程

  1. 编辑 router-internal.yaml 文件:

    # cat router-internal.yaml

    输出示例

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: sharded
      namespace: openshift-ingress-operator
    spec:
      domain: <apps-sharded.basedomain.example.net> 1
      nodePlacement:
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
      namespaceSelector:
        matchLabels:
          type: sharded

    1
    指定 Ingress Controller 使用的域。此域必须与默认 Ingress Controller 域不同。
  2. 应用 Ingress Controller router-internal.yaml 文件:

    # oc apply -f router-internal.yaml

    Ingress Controller 选择由命名空间选择器选择的具有 type: sharded 标签的任意命名空间中的路由。

  3. 使用 router-internal.yaml 中配置的域创建新路由:

    $ oc expose svc <service-name> --hostname <route-name>.apps-sharded.basedomain.example.net

28.3.7. 为 Ingress Controller 分片创建路由

通过使用路由,您可以通过 URL 托管应用程序。在这种情况下,主机名没有被设置,路由会使用子域。当您指定子域时,会自动使用公开路由的 Ingress Controller 域。对于由多个 Ingress Controller 公开路由的情况,路由由多个 URL 托管。

以下流程描述了如何为 Ingress Controller 分片创建路由,使用 hello-openshift 应用程序作为示例。

在一组 Ingress Controller 之间平衡传入的流量负载时,以及在将流量隔离到特定 Ingress Controller 时,Ingress Controller 分片会很有用处。例如,A 公司的流量使用一个 Ingress Controller,B 公司的流量则使用另外一个 Ingress Controller。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您以项目管理员身份登录。
  • 您有一个 web 应用来公开端口,以及侦听端口流量的 HTTP 或 TLS 端点。
  • 您已为分片配置了 Ingress Controller。

流程

  1. 运行以下命令,创建一个名为 hello-openshift 的项目:

    $ oc new-project hello-openshift
  2. 运行以下命令,在项目中创建 pod:

    $ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-openshift/hello-pod.json
  3. 运行以下命令,创建名为 hello-openshift 的服务:

    $ oc expose pod/hello-openshift
  4. 创建名为 hello-openshift-route.yaml 的路由定义:

    为分片创建的路由的 YAML 定义:

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded 1
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift 2
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift

    1
    标签键及其对应标签值必须与 Ingress Controller 中指定的标签值匹配。在本例中,Ingress Controller 具有标签键和值 type: sharded
    2
    路由将使用 subdomain 字段的值公开。指定 subdomain 字段时,您必须保留主机名未设置。如果您同时指定了 hostsubdomain 字段,则路由将使用 host 字段的值,并忽略 subdomain 字段。
  5. 通过运行以下命令,使用 hello-openshift-route.yaml 创建到 hello-openshift 应用程序的路由:

    $ oc -n hello-openshift create -f hello-openshift-route.yaml

验证

  • 使用以下命令获取路由的状态:

    $ oc -n hello-openshift get routes/hello-openshift-edge -o yaml

    生成的 Route 资源应类似以下示例:

    输出示例

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      labels:
        type: sharded
      name: hello-openshift-edge
      namespace: hello-openshift
    spec:
      subdomain: hello-openshift
      tls:
        termination: edge
      to:
        kind: Service
        name: hello-openshift
    status:
      ingress:
      - host: hello-openshift.<apps-sharded.basedomain.example.net> 1
        routerCanonicalHostname: router-sharded.<apps-sharded.basedomain.example.net> 2
        routerName: sharded 3

    1
    Ingress Controller 或路由器的主机名用于公开路由。host 字段的值由 Ingress Controller 自动决定,并使用它的域。在本例中,Ingress Controller 的域为 <apps-sharded.basedomain.example.net>
    2
    Ingress Controller 的主机名。
    3
    Ingress Controller 的名称。在本例中,Ingress Controller 的名称为 sharded

28.3.8. 其他资源

Ingress Operator 管理通配符 DNS。如需更多信息,请参阅以下: