29.4. 配置 Ingress Controller 端点发布策略


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

重要

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

如需更多信息,请参阅 RHOSP 安装文档中的"设置 RHOSP Cloud Controller Manager 选项"部分。

29.4.1. Ingress Controller 端点发布策略

NodePortService 端点发布策略

NodePortService 端点发布策略使用 Kubernetes NodePort 服务发布 Ingress Controller。

在这个配置中,Ingress Controller 部署使用容器网络。创建了一个 NodePortService 来发布部署。特定的节点端口由 OpenShift Container Platform 动态分配; 但是,为了支持静态端口分配,您会保留对受管 NodePortService 的节点端口字段的更改

图 29.3. NodePortService 图表

OpenShift Container Platform Ingress NodePort 端点发布策略

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

  • 集群中的所有可用节点均有自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一 NodePort。
  • 当客户端连接到停机的节点时,例如,通过连接图形中的 10.0.128.4 IP 地址,节点端口将客户端直接连接到运行该服务的可用节点。在这种情况下,不需要负载平衡。如图形中所显,10.0.128.4 地址已不可用,必须使用另一个 IP 地址。
注意

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

默认情况下,端口会自动分配,您可以访问集成的端口分配。但是,有时需要静态分配端口来与现有基础架构集成,这些基础架构可能无法根据动态端口进行重新配置。要实现与静态节点端口的集成,您可以直接更新受管服务资源。

如需有关 daemonset 的更多信息,请参阅关于 NodePort 的 Kubernetes 服务文档

HostNetwork 端点发布策略

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

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

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

Example

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

29.4.1.1. 将 Ingress Controller 端点发布范围配置为 Internal

当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 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

29.4.1.2. 配置 Ingress Controller 端点发布范围到外部

当集群管理员在没有指定集群为私有的情况下安装新集群时,将默认 Ingress Controller 创建,并将 scope 设置为 External

Ingress Controller 的范围可以在安装过程中或之后配置为 Internal,集群管理员可以将 内部 Ingress Controller 更改为 External

重要

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

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

先决条件

  • 已安装 oc CLI。

流程

  • 要将 内部范围的 Ingress Controller 更改为外部,请输入以下命令:

    $ 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

29.4.1.3. 在 Ingress Controller 中添加单个 NodePort 服务

您可以创建自定义 Ingress Controller 以使用 NodePortService 端点发布策略,而不是为各个项目创建 NodePort 类型 Service。要防止端口冲突,在您要通过 Ingress 分片将一组路由应用到可能具有 HostNetwork Ingress Controller 的节点时,请考虑 Ingress Controller 的此配置。

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

  • 您必须为 Nodeport Ingress Controller 域创建一个通配符 DNS 记录。Nodeport Ingress Controller 路由可以从 worker 节点的地址访问。有关路由所需的 DNS 记录的更多信息,请参阅"用户置备 DNS 要求"。
  • 您必须为您的服务公开路由,并为自定义 Ingress Controller 域指定 --hostname 参数。
  • 您必须在路由中附加分配给 NodePort 类型 Service 的端口,以便您可以访问应用容器集。

先决条件

  • 已安装 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 指定一个自定义名称
    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. 检查路由是否具有 Admitted 状态,并且包含自定义 Ingress Controller 的元数据:

    $ 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 Controller 管理 NodePort 类型 Service。默认 Ingress Controller 将继续监控所有其他集群流量。

    $ 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 1
    其中 <port> 是来自 NodePort 类型的 Service 的节点端口。根据 oc get svc -n openshift-ingress 命令的输出示例,80:32432/TCP HTTP 路由意味着 32432 是节点端口。

    输出示例

    Hello OpenShift!

29.4.2. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.