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 端点发布策略相关的以下概念:
- 集群中的所有可用节点均有自己的外部可访问 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 副本都会通过调度的节点主机上的端口 80
和 443
进行请求,所以如果同一节点上的其他 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 记录。
流程
为 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
。
使用
oc label node
命令给节点添加标签:$ oc label node <node_name> <key>=<value> 1
- 1
- 其中
<value>
必须与IngressController
CR 的nodePlacement
部分中指定的键值对匹配。
创建
IngressController
对象:$ oc create -f <ingress_controller_cr>.yaml
查找为
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
要创建新项目,请输入以下命令:
$ oc new-project <project_name>
要标记新命名空间,请输入以下命令:
$ oc label namespace <project_name> <key>=<value> 1
- 1
- 其中
<key>=<value>
需要与 Ingress Controller CR 的namespaceSelector
部分中的值匹配。
在集群中创建新应用程序:
$ oc new-app --image=<image_name> 1
- 1
- 一个
<image_name>
的示例是quay.io/openshifttest/hello-openshift:multiarch
。
为服务创建
Route
对象,以便 pod 可以使用该服务向集群外部公开应用程序。$ oc expose svc/<service_name> --hostname=<svc_name>-<project_name>.<custom_ic_domain_name> 1
注意您必须在
--hostname
参数中指定自定义 Ingress Controller 的域名。如果没有这样做,Ingress Operator 会使用默认的 Ingress Controller 来提供集群的所有路由。检查路由是否具有
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" } ], }
更新默认的
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>]}]}}}'
验证
输入以下命令验证 DNS 条目是否可以在集群内部和外部路由。命令输出之前从运行
oc label node
命令接收标签的节点的 IP 地址。$ dig +short <svc_name>-<project_name>.<custom_ic_domain_name>
要验证集群是否使用来自外部 DNS 服务器的 IP 地址进行 DNS 解析,请输入以下命令检查集群的连接:
$ curl <svc_name>-<project_name>.<custom_ic_domain_name>:<port> 1
输出示例
Hello OpenShift!