×

endpointPublishingStrategy 用于将 Ingress 控制器端点发布到其他网络,启用负载均衡器集成,并提供对其他系统的访问。

在 Red Hat OpenStack Platform (RHOSP) 上,只有在配置云提供商以创建运行状况监控器时,才支持LoadBalancerService 端点发布策略。对于 RHOSP 16.2,只有在使用 Amphora Octavia 提供商时才有可能使用此策略。

有关更多信息,请参阅 RHOSP 安装文档的“设置 RHOSP 云控制器管理器选项”部分。

Ingress 控制器端点发布策略

NodePortService 端点发布策略

NodePortService 端点发布策略使用 Kubernetes NodePort 服务发布 Ingress 控制器。

在此配置中,Ingress 控制器部署使用容器网络。创建NodePortService 来发布部署。特定的节点端口由 OpenShift Container Platform 动态分配;但是,为了支持静态端口分配,您对托管NodePortService 的节点端口字段所做的更改将被保留。

OpenShift Container Platform Ingress NodePort endpoint publishing strategy
图 1. NodePortService 图表

上图显示了与 OpenShift Container Platform Ingress NodePort 端点发布策略相关的以下概念

  • 集群中的所有可用节点都具有其自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一 NodePort。

  • 例如,当客户端连接到已关闭的节点时,例如通过连接图形中的10.0.128.4 IP 地址,节点端口会将客户端直接连接到正在运行该服务的可用节点。在这种情况下,不需要负载均衡。如图所示,10.0.128.4 地址已关闭,必须改用其他 IP 地址。

Ingress 运算符忽略对服务.spec.ports[].nodePort 字段的任何更新。

默认情况下,端口会自动分配,您可以访问集成端口分配。但是,有时需要静态端口分配才能与现有基础设施集成,而现有基础设施可能不容易根据动态端口进行重新配置。为了实现与静态节点端口的集成,您可以直接更新托管服务资源。

HostNetwork 端点发布策略

HostNetwork 端点发布策略会在部署 Ingress Controller 的节点端口上发布 Ingress Controller。

使用HostNetwork 端点发布策略的 Ingress Controller 每个节点只能有一个 Pod 副本。如果您想要 *n* 个副本,则必须至少使用 *n* 个节点来调度这些副本。因为每个 Pod 副本都在其调度的节点主机上请求端口80443,所以如果同一节点上的另一个 Pod 正在使用这些端口,则无法将副本调度到该节点。

HostNetwork 对象具有一个hostNetwork字段,其中包含以下可选绑定端口的默认值:httpPort: 80httpsPort: 443statsPort: 1936。通过为您的网络指定不同的绑定端口,您可以为HostNetwork策略在同一节点上部署多个 Ingress Controller。

示例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
  name: internal
  namespace: openshift-ingress-operator
spec:
  domain: example.com
  endpointPublishingStrategy:
    type: HostNetwork
    hostNetwork:
      httpPort: 80
      httpsPort: 443
      statsPort: 1936

将 Ingress Controller 端点发布范围配置为内部

当集群管理员安装新集群时,如果没有指定集群是私有的,则默认的 Ingress Controller 会被创建,其scope设置为External。集群管理员可以将External范围的 Ingress Controller 更改为Internal

先决条件
  • 您已安装oc CLI。

步骤
  • 要将External范围的 Ingress Controller 更改为Internal,请输入以下命令

    $ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"Internal"}}}}'
  • 要检查 Ingress Controller 的状态,请输入以下命令

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • Progressing状态条件指示您是否必须采取进一步措施。例如,状态条件可以指示您需要通过输入以下命令删除服务

      $ oc -n openshift-ingress delete services/router-default

      如果您删除了服务,Ingress Operator 会将其重新创建为Internal

将 Ingress Controller 端点发布范围配置为外部

当集群管理员安装新集群时,如果没有指定集群是私有的,则默认的 Ingress Controller 会被创建,其scope设置为External

Ingress Controller 的范围可以在安装期间或之后配置为Internal,集群管理员可以将Internal的 Ingress Controller 更改为External

在某些平台上,需要删除并重新创建服务。

更改范围可能会导致 Ingress 流量中断,可能持续几分钟。这适用于需要删除并重新创建服务的平台,因为此过程可能导致 OpenShift Container Platform 取消预配现有服务负载均衡器,预配新的负载均衡器并更新 DNS。

先决条件
  • 您已安装oc CLI。

步骤
  • 要将Internal范围的 Ingress Controller 更改为External,请输入以下命令

    $ oc -n openshift-ingress-operator patch ingresscontrollers/private --type=merge --patch='{"spec":{"endpointPublishingStrategy":{"type":"LoadBalancerService","loadBalancer":{"scope":"External"}}}}'
  • 要检查 Ingress Controller 的状态,请输入以下命令

    $ oc -n openshift-ingress-operator get ingresscontrollers/default -o yaml
    • Progressing状态条件指示您是否必须采取进一步措施。例如,状态条件可以指示您需要通过输入以下命令删除服务

      $ oc -n openshift-ingress delete services/router-default

      如果您删除了服务,Ingress Operator 会将其重新创建为External

向 Ingress Controller 添加单个 NodePort 服务

无需为每个项目创建NodePort类型的Service,您可以创建自定义 Ingress Controller 来使用NodePortService端点发布策略。为了避免端口冲突,当您想通过 Ingress 分片将一组路由应用于可能已经拥有HostNetwork Ingress Controller 的节点时,请考虑为您的 Ingress Controller 使用此配置。

在为每个项目设置NodePort类型的Service之前,请阅读以下注意事项

  • 您必须为 Nodeport Ingress Controller 域名创建通配符 DNS 记录。可以通过工作节点的地址访问 Nodeport Ingress Controller 路由。有关路由所需 DNS 记录的更多信息,请参见“用户预配的 DNS 要求”。

  • 您必须为您的服务公开一个路由,并为您的自定义 Ingress Controller 域名指定--hostname参数。

  • 您必须将分配给NodePort类型Service的端口附加到路由中,以便您可以访问应用程序 Pod。

先决条件
  • 您已安装 OpenShift CLI (oc)。

  • 已以具有cluster-admin权限的用户身份登录。

  • 您已创建通配符 DNS 记录。

步骤
  1. 为 Ingress Controller 创建自定义资源 (CR) 文件

    定义IngressController对象信息的 CR 文件示例
    apiVersion: v1
    items:
    - apiVersion: operator.openshift.io/v1
      kind: IngressController
      metadata:
        name: <custom_ic_name> (1)
        namespace: openshift-ingress-operator
      spec:
        replicas: 1
        domain: <custom_ic_domain_name> (2)
        nodePlacement:
          nodeSelector:
            matchLabels:
              <key>: <value> (3)
        namespaceSelector:
         matchLabels:
           <key>: <value> (4)
        endpointPublishingStrategy:
          type: NodePortService
    # ...
    1 IngressController CR 指定自定义name
    2 Ingress Controller 服务的 DNS 名称。例如,默认的 ingresscontroller 域名是apps.ipi-cluster.example.com,因此您应将<custom_ic_domain_name>指定为nodeportsvc.ipi-cluster.example.com
    3 指定包含自定义 Ingress Controller 的节点的标签。
    4 指定一组命名空间的标签。用键值对映射替换<key>:<value>,其中<key>是新标签的唯一名称,<value>是其值。例如:ingresscontroller: custom-ic
  2. 使用oc label node命令向节点添加标签

    $ oc label node <node_name> <key>=<value> (1)
    1 其中<value>必须与IngressController CR 的nodePlacement部分中指定的键值对匹配。
  3. 创建IngressController对象

    $ oc create -f <ingress_controller_cr>.yaml
  4. 查找为IngressController CR 创建的服务的端口

    $ oc get svc -n openshift-ingress
    显示router-nodeport-custom-ic3服务的端口80:32432/TCP的示例输出
    NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                     AGE
    router-internal-default      ClusterIP   172.30.195.74    <none>        80/TCP,443/TCP,1936/TCP                     223d
    router-nodeport-custom-ic3   NodePort    172.30.109.219   <none>        80:32432/TCP,443:31366/TCP,1936:30499/TCP   155m
  5. 要创建一个新项目,请输入以下命令

    $ oc new-project <project_name>
  6. 要标记新的命名空间,请输入以下命令

    $ oc label namespace <project_name> <key>=<value> (1)
    1 其中<key>=<value>必须与 Ingress Controller CR 的namespaceSelector部分中的值匹配。
  7. 在您的集群中创建一个新的应用程序

    $ oc new-app --image=<image_name> (1)
    1 <image_name>的一个示例是quay.io/openshifttest/hello-openshift:multiarch
  8. 为服务创建一个Route对象,以便 Pod 可以使用该服务将应用程序暴露在集群外部。

    $ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name> (1)

    您必须在--hostname参数中指定自定义 Ingress Controller 的域名。如果您不这样做,Ingress Operator 将使用默认的 Ingress Controller 为集群服务所有路由。

  9. 检查路由是否具有已接收状态,以及是否包含自定义 Ingress 控制器元数据。

    $ oc get route/hello-openshift -o json | jq '.status.ingress'
    示例输出
    # ...
    {
      "conditions": [
        {
          "lastTransitionTime": "2024-05-17T18:25:41Z",
          "status": "True",
          "type": "Admitted"
        }
      ],
      [
        {
          "host": "hello-openshift.nodeportsvc.ipi-cluster.example.com",
          "routerCanonicalHostname": "router-nodeportsvc.nodeportsvc.ipi-cluster.example.com",
          "routerName": "nodeportsvc", "wildcardPolicy": "None"
        }
      ],
    }
  10. 更新默认IngressController CR,以防止默认 Ingress 控制器管理NodePort类型的Service。默认 Ingress 控制器将继续监控集群中的所有其他流量。

    $ oc patch --type=merge -n openshift-ingress-operator ingresscontroller/default --patch '{"spec":{"namespaceSelector":{"matchExpressions":[{"key":"<key>","operator":"NotIn","values":["<value>]}]}}}'
验证
  1. 通过输入以下命令,验证 DNS 条目是否可以在集群内部和外部进行路由。该命令输出接收之前步骤中运行oc label node命令所赋予标签的节点的 IP 地址。

    $ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
  2. 要验证您的集群是否使用来自外部 DNS 服务器的 IP 地址进行 DNS 解析,请输入以下命令检查集群连接。

    $ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port> (1)
    1 其中<port>NodePort类型Service的节点端口。根据oc get svc -n openshift-ingress命令的示例输出,80:32432/TCP HTTP 路由表示32432是节点端口。
    输出示例
    Hello OpenShift!