IBM Cloud Docs
设置 Ingress

设置 Ingress

创建 Ingress 资源以配置 Ingress 组件,定义路由请求的规则以及指定应用程序服务的路径。 包含要公开的应用程序或服务的每个名称空间都需要单独的 Ingress 资源。

准备工作

在开始之前,请遵循以下准备步骤。

  1. 确保您具有正确的许可权来设置 Ingress。 以下 IBM Cloud IAM 角色 是必需的:

    • 管理员群集的平台访问角色
    • Manager 所有命名空间中的服务访问角色
  2. 确定是否要使用 IBM提供的 Ingress 子域。 如果您不想使用提供的子域,那么必须创建并注册自己的 定制域

    需要定制域以通过专用 ALB 公开应用程序。

  3. 如果要通过专用 ALB 公开应用程序,那么必须在 CLI 中启用每个专用 ALB。 要获取 ALB 标识,请运行 ibmcloud ks ingress alb ls --cluster CLUSTER

    经典集群 有关更多信息和命令选项,请参阅CLI 参考

    ibmcloud ks ingress alb enable classic --alb <alb_id> --cluster <cluster_name>
    

    VPC 集群 有关更多信息和命令选项,请参阅CLI 参考

    ibmcloud ks ingress alb enable vpc-gen2 --alb <alb_id> --cluster <cluster_name>
    
  4. 确保集群每个专区至少包含两个工作程序节点,以确保高可用性并应用定期更新。 如果一个区域中只有一个工作节点,则 ALB 无法接收自动更新。 有关更多信息,请参阅 ALB 的工作程序节点需求

  5. 如果您正在使用经典集群,请为 IBM Cloud 基础架构帐户启用 虚拟路由器功能(VRF)。 要启用 VRF,请参阅 启用 VRF。 要检查是否已启用 VRF,请使用 ibmcloud account show 命令。 如果无法或不想启用 VRF,请启用 VLAN 生成。 启用 VRF 或 VLAN 跨接后,ALB 可以将数据包路由到开户免费送彩金38元中的各个子网。

  6. 如果您正在使用 VPC 集群,请确保 VPC 安全组 中允许 Ingress 将流量请求路由到工作程序节点上的节点端口。

  7. 请注意,如果在 5 天内次或更多次 7 创建和删除名称相同或相似的集群 (例如,出于自动化或测试目的),那么可能会达到 Let 's Encrypt 复制证书速率限制。 要确保正确注册 Ingress 子域和证书,集群名称的前 24 个字符必须不同。

  8. 如果将网络流量限制为流至边缘工作程序节点,请确保每个专区中至少启用 2 个边缘工作程序节点,以便 ALB 能以均匀方式进行部署。

如果某个专区发生故障,那么您可能会看到对该专区中 Ingress ALB 的请求中出现间歇性故障。

设置步骤

执行以下步骤以设置 Ingress。

步骤 1: 创建 ClusterIP 服务

需要 ClusterIP 服务以使应用程序可从集群中访问,以便可以将外部请求转发到应用程序 pod。 要包含在 Ingress 负载均衡中,用于公开应用程序的 ClusterIP 服务的名称必须在集群中的所有名称空间中唯一。

对于要公开的每个应用程序部署,创建 Kubernetes ClusterIP 服务。 您的应用程序必须由 Kubernetes 服务公开,才能包含在 Ingress 负载平衡中。

kubectl expose deploy <app_deployment_name> --name my-app-svc --port <app_port> -n <namespace>

步骤 2: 使用 TLS 证书和 Kubernetes 私钥设置 TLS 终止

TLS 证书必须存储为应用程序所在的每个名称空间中的 Kubernetes 私钥。

步骤 3:创建入口资源

创建 Ingress 资源以定义 Ingress 控制器用于将流量路由到应用程序服务的路由规则。

  1. 在 YAML 文件中创建 Ingress 资源。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress-resource
    spec:
      ingressClassName: nginx-example
      tls:
      - hosts:
        - <domain_name>
        secretName: <tls_secret_name>
      rules:
      - host: HOSTNAME
        http:
          paths:
          - path: <app_path_1>
            pathType: Prefix
            backend:
              service:
                name: <app_service_1>
                port:
                  number: 80
          - path: <app_path_2>
            pathType: Prefix
            backend:
              service:
                name: <app_service_2>
                port:
                  number: 80
    
    
    annotations
    kubernetes.io/ingress.class: 指定要应用的 Ingress 类。 IBM提供的 Ingress 类为 "public-iks-k8s-nginx" (针对公共 ALB) 和 "private-iks-k8s-nginx" (针对专用 ALB)。
    IngressClass 资源和 ibm-ingress-deploy-config configmap 中指定此定制类。 要为 Ingress 定制路由,可以添加 Kubernetes NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>)。不支持定制 IBM Cloud Kubernetes Service 注释 (ingress.bluemix.net/<annotation>)。
    注: 对于其他组件管理 Ingress ALB 的配置 (例如,如果 Ingress 部署为 Helm Chart 的一部分) ,请勿指定此注释。 而是查找配置的 Ingress 类,并在 spec.ingressClassName: <class_name> 字段中指定该类。
    ingressClassName
    Ingress 类名。 IBM提供的 Ingress 类为 public-iks-k8s-nginx (针对公共 ALB) 和 private-iks-k8s-nginx (针对专用 ALB)。
    tls.hosts
    要使用 TLS,请将 <domain> 替换为 IBM 提供的 Ingress 子域或您的自定义域。
    tls.secretName
    <tls_secret_name> 替换为存储 TLS 证书 的 Kubernetes 私钥的名称。
    host
    <domain> 替换为 IBM 提供的 Ingress 子域或您的自定义域。
    path
    <app_path> 替换为斜线或应用程序监听的路径。 该路径会被附加到指定的 Ingress 域,从而为您的应用程序创建一个唯一的路由。 在 Web 浏览器中输入此路径时,网络流量会路由到 ALB。 ALB 会查找关联的服务,并将网络流量发送到该服务。 然后,服务会将流量转发到应用程序运行所在的 pod。
    pathType
    URL 路径匹配方法。 受支持的值为 ImplementationSpecificExactPrefix。 有关每种路径类型的更多信息和示例,请参阅 社区 Kubernetes 文档
    service.name
    app1_serviceapp2_service 替换为您为公开应用程序而创建的服务名称,以此类推。 确保您指定的应用程序位于同一名称空间中。
    service.name
    <app1_service><app2_service> 替换为您为公开应用程序而创建的服务名称,以此类推。 确保您指定的应用程序位于同一名称空间中。
    service.port.number
    服务侦听的端口。 使用针对应用程序创建 Kubernetes 服务时定义的端口。
  2. 将 Ingress 资源应用于集群。 确保资源部署到在资源中指定的应用程序服务所在的名称空间中。

    kubectl apply -f community-ingress-resource.yaml -n <namespace>
    

步骤 4: 验证 Ingress 设置

  1. 列出 ALB,并复制运行 Kubernetes Ingress 映像的一个 ALB 的 IP 地址 (经典) 或主机名 (VPC)。 在输出中,选择具有格式为 <community_version>_<ibm_build>_iks构建 的 ALB。

    ibmcloud ks ingress alb ls -c <cluster>
    
  2. 使用 ALB 的 IP 地址 (经典) 或主机名 (VPC),应用程序路径和域来验证您是否可以通过此 ALB 成功向应用程序发送流量。

    curl http://<ALB_IP>/<app_path> -H "Host: <ingress_subdomain>"
    

    例如,要使用缺省 Ingress 子域将请求发送到名为 myapp 的应用程序,请运行以下命令。

    curl http://169.X.X.X/myapp -H "Host: mycluster-a1b2cdef345678g9hi012j3kl4567890-0000.us-south.containers.appdomain.cloud"
    

通过 Ingress 连接到应用程序时遇到问题? 请尝试 对 Ingress 进行故障诊断。 您可以通过运行 ibmcloud ks ingress status-report get -c <cluster_name_or_ID> 来检查 Ingress 组件的运行状况和状态。

具有 Ingress 的定制域

如果不想使用 IBM提供的 Ingress 子域,那么可以使用您在 Ingress 资源中指定的自己的定制域。 请注意,通过专用 ALB 向 Ingress 公开的应用程序需要定制域。

为公共 ALB 创建定制域

执行为公共 ALB 创建定制域的步骤。

  1. 创建定制域。 要注册定制域,请使用您的域名服务 (DNS) 提供者或 IBM Cloud DNS。 如果希望 Ingress 公开的应用程序位于一个集群的不同名称空间中,请将定制域注册为通配符域,例如 *.custom_domain.net。 请注意,在 Kubernetes V 1.20 或更高版本中,域限制为不超过 130 个字符。

  2. 通过将 IBM 提供的子域指定为规范名称记录 (CNAME),为自定义域定义别名。 要查找 IBM 提供的 Ingress 域,请运行 ibmcloud ks cluster get --cluster <cluster_name> 并查找 Ingress 子域字段。

    自动运行状况检查需要将 IBM提供的子域指定为 CNAME,以从 DNS 响应中除去任何失败的 IP,并确保在添加或除去 ALB 时定制域更新。

为专用 ALB 创建定制域

遵循步骤为专用 ALB 创建定制域。 请注意,需要定制域才能将 Ingress 与专用 ALB 配合使用。

如果您具有仅具有专用 VLAN 的经典集群,那么必须首先配置自己的 专用网络上可用的 DNS 服务

  1. 通过 DNS 服务提供商创建自定义域名。 请注意,Ingress URL 必须不超过 130 个字符。

  2. 通过添加其 IP 地址作为 A 记录 (经典集群) 或其 VPC 主机名作为 CNAME (VPC 集群),将定制域映射到专用 ALB。 要查找 ALB IP 地址 (经典) 或主机名 (VPC),请运行 ibmcloud ks ingress alb ls -c <cluster_name_or_ID>