IBM Cloud Docs
配置 Ingress

配置 Ingress

了解如何配置 Ingress 设置以满足工作负载需求。

保留源 IP 地址

要保留源 IP 地址,可以为 VPC 集群启用 PROXY 协议。 此选项可用于运行 V 4.13 或更高版本的集群。

PROXY 协议提供了一种方便的方法,可以跨多层 NAT 或 TCP 代理传输连接信息,例如客户机的地址。 有关 PROXY 协议的更多信息,请参阅 HAProxy 规范

缺省情况下,Ingress 控制器接收仅包含与负载均衡器关联的源地址的连接。 您可以在 VPC 集群中启用 PROXY 协议来配置负载均衡器,以保留 Ingress 控制器接收的连接的原始客户机地址。

启用 PROXY 协议

  1. 编辑 Ingress 控制器资源。

    oc -n openshift-ingress-operator edit ingresscontroller/default
    
  2. 在 Ingress 控制器资源中,找到 spec.endpointPublishingStrategy.loadBalancer 部分并定义以下 providerParameters 值。

    endpointPublishingStrategy:
      loadBalancer:
        providerParameters:
          type: IBM
          ibm:
            protocol: PROXY
        scope: External
      type: LoadBalancerService
    
  3. 保存并应用资源。

禁用 PROXY 协议

  1. 编辑 Ingress 控制器资源。

    oc -n openshift-ingress-operator edit ingresscontroller/default
    
  2. 在 Ingress 控制器资源中,找到 spec.endpointPublishingStrategy.loadBalancer 部分并定义以下 providerParameters 值。

    endpointPublishingStrategy:
      loadBalancer:
        providerParameters:
          type: IBM
          ibm:
            protocol: TCP
        scope: External
      type: LoadBalancerService
    
  3. 保存并应用资源。

使用注释定制 Ingress 路由

如果要为应用程序定制路由规则,可以在定义的 Ingress 资源中使用 特定于路由的 HAProxy 注释

这些受支持的注释的格式为 haproxy.router.openshift.io/<annotation>router.openshift.io/<annotation>。Red Hat OpenShift 版本 4 中的 Ingress 控制器或 Ingress 资源不支持IBM Cloud Kubernetes Service 注释 (ingress.bluemix.net/<annotation>) 和 NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>)。

启用访问日志记录

HTTP 访问日志包含传入的 请求信息。HTTP 在调试复杂问题时,访问日志非常有用,但 OpenShift 路由器默认不支持访问日志。 对于 OpenShift 集群,您可以配置路由器的访问日志,这样在路由器pod中就会有一个侧车容器,运行一个 syslog 服务器,并将访问日志写入其 stdout

  1. 编辑 IngressController 配置,并将以下配置添加到 .spec

    logging:
      access:
        destination:
          type: Container
        httpCaptureHeaders:
          request:
          - maxLength: 256
            name: Host
        httpLogFormat: '{"time_date":"%t","client":"%ci","host":"%[capture.req.hdr(0)]","ssl_version":"%sslv","request_method":"%HM",
                       "request_uri":"%HU","status":%ST,"upstream_addr":"%si:%sp","request_time":%Tt,"upstream_connect_time":%Tc,
                       "upstream_header_time":%Tr,"termination_state":"%ts"}'
    

    编辑命令

    kubectl edit ingresscontroller -n openshift-ingress-operator default
    ingresscontroller.operator.openshift.io/default edited
    
  2. 检查路由器舱是否运行两个容器。

    kubectl get pod -n openshift-ingress -w
    

    示例输出

    NAME                              READY   STATUS    RESTARTS   AGE
    router-default-66945cc7c4-4xlnh   2/2     Running   0          36s
    router-default-66945cc7c4-5cxpn   2/2     Running   0          36s
    
  3. 检查访问日志。

    kubectl logs -n openshift-ingress router-default-66945cc7c4-4xlnh -c logs
    

    示例输出

    ...
    2025-01-28T12:29:07.038592+00:00 router-default-7fc484bbb8-qfm5d router-default-7fc484bbb8-qfm5d haproxy[41]:{"time_date":
    "28/Jan/2025:12:29:06.879","client":"10.5.207.79","host":"alb-autoscale-example-service-default.pvg-classic-z9g5zltmgb1ir
    -1e7743ca80a399c9cff4eaf617434c72-0000.us-south.stg.kube.appdomain.cloud","ssl_version":"TLSv1.3","request_method":
    "GET","request_uri":"/","status":200,"upstream_addr":"172.30.210.252:8080","request_time":159,"upstream_connect_time":1,
    "upstream_header_time":2,"termination_state":"--"}
    2025-01-28T12:29:09.572129+00:00 router-default-7fc484bbb8-qfm5d router-default-7fc484bbb8-qfm5d haproxy[41]: {"time_date":
    "28/Jan/2025:12:29:09.405","client":"10.5.207.79","host":"alb-autoscale-example-service-default.pvg-classic-z9g5zltmgb1ir
    -1e7743ca80a399c9cff4eaf617434c72-0000.us-south.stg.kube.appdomain.cloud","ssl_version":"TLSv1.3","request_method":"GET",
    "request_uri":"/","status":200,"upstream_addr":"172.30.210.252:8080","request_time":166,"upstream_connect_time":0,
    "upstream_header_time":3,"termination_state":"--"}
    ...
    

微调连接处理

clientTimeoutserverTimeout 参数是关键配置,决定了客户端、Ingress 控制器和后端服务器之间保持活动连接的时间。 这些超时在优化请求处理方面发挥着重要作用,尤其是在处理长时间客户端连接、后端服务器延迟响应以及保护宝贵资源不被不必要占用时。

如果您预计客户会在较长时间内保持连接打开状态,建议您提高 clientTimeout 设置,以应对这些情况。 反之,如果您的后端服务器由于流量大或处理负载高而延迟较高,那么调整 serverTimeout 可以为服务器在入口控制器终止连接前完成请求处理提供必要的余量。

您可以在 IngressController 资源中更改上述参数:

apiVersion: operator.openshift.io/v1
kind: IngressController
 ...
spec:
  tuningOptions:
    clientTimeout: 5s
    serverTimeout: 5s

有关调整选项的更多信息,请参阅 OpenShift 文档

调整超时

如果您的群集通过 IBM Cloud Cloud Internet Services (CIS) / Cloudflare 公开,并使用 Web 应用程序防火墙 (WAF) 或全局负载平衡,则应将 clientTimeoutserverTimeout 设置为超过 900 秒的值,以防止连接过早终止。 有关详细信息,请参阅 Cloudflare 文档

  1. 确定您的入口控制器:首先列出 IngressController 资源。 这可以通过命令来实现:

    oc get ingresscontrollers -n openshift-ingress-operator
    
  2. 更新超时参数:要修改特定 IngressControllerclientTimeoutserverTimeout 参数,可以执行修补命令。 例如,以下命令会将 default 输入控制器的超时设置更新为 905 秒:

    oc patch ingresscontrollers default --patch '{"spec": {"tuningOptions":{"clientTimeout": "905s", "serverTimeout": "905s"}}}' --type=merge -n openshift-ingress-operator
    
  3. 仅限 VPC 群集:在虚拟专用云 (VPC) 中运行时,有必要将 VPC 负载平衡器的空闲连接超时与输入控制器设置一起进行调整。 我们建议选择比入口控制器超时设置更大的空闲连接超时。 下面的命令演示了如何将 router-default LoadBalancer 服务的空闲连接超时更新为 910 秒:

    oc annotate svc -n openshift-ingress service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout="910" router-default