endpointPublishingStrategy
用于将 Ingress 控制器端点发布到其他网络,启用负载均衡器集成,并提供对其他系统的访问。
在 Red Hat OpenStack Platform (RHOSP) 上,只有在配置云提供商以创建运行状况监控器时,才支持 有关更多信息,请参阅 RHOSP 安装文档的“设置 RHOSP 云控制器管理器选项”部分。 |
NodePortService
端点发布策略
NodePortService
端点发布策略使用 Kubernetes NodePort 服务发布 Ingress 控制器。
在此配置中,Ingress 控制器部署使用容器网络。创建NodePortService
来发布部署。特定的节点端口由 OpenShift Container Platform 动态分配;但是,为了支持静态端口分配,您对托管NodePortService
的节点端口字段所做的更改将被保留。
上图显示了与 OpenShift Container Platform Ingress NodePort 端点发布策略相关的以下概念
集群中的所有可用节点都具有其自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一 NodePort。
例如,当客户端连接到已关闭的节点时,例如通过连接图形中的10.0.128.4
IP 地址,节点端口会将客户端直接连接到正在运行该服务的可用节点。在这种情况下,不需要负载均衡。如图所示,10.0.128.4
地址已关闭,必须改用其他 IP 地址。
Ingress 运算符忽略对服务 默认情况下,端口会自动分配,您可以访问集成端口分配。但是,有时需要静态端口分配才能与现有基础设施集成,而现有基础设施可能不容易根据动态端口进行重新配置。为了实现与静态节点端口的集成,您可以直接更新托管服务资源。 |
更多信息,请参见Kubernetes 服务文档关于NodePort
的说明。
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。
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 会被创建,其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 会被创建,其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
。
无需为每个项目创建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 记录。
为 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 。 |
使用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)
您必须在 |
检查路由是否具有已接收
状态,以及是否包含自定义 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"
}
],
}
更新默认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>]}]}}}'
通过输入以下命令,验证 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)
1 | 其中<port> 是NodePort 类型Service 的节点端口。根据oc get svc -n openshift-ingress 命令的示例输出,80:32432/TCP HTTP 路由表示32432 是节点端口。 |
Hello OpenShift!