设置 Ingress
创建 Ingress 资源以配置 Ingress 组件,定义路由请求的规则以及指定应用程序服务的路径。 包含要公开的应用程序或服务的每个名称空间都需要单独的 Ingress 资源。
准备工作
在开始之前,请遵循以下准备步骤。
-
确保您具有正确的许可权来设置 Ingress。 以下 IBM Cloud IAM 角色 是必需的:
- 管理员群集的平台访问角色
- Manager 所有命名空间中的服务访问角色
-
确定是否要使用 IBM提供的 Ingress 子域。 如果您不想使用提供的子域,那么必须创建并注册自己的 定制域。
需要定制域以通过专用 ALB 公开应用程序。
-
如果要通过专用 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>
-
确保集群每个专区至少包含两个工作程序节点,以确保高可用性并应用定期更新。 如果一个区域中只有一个工作节点,则 ALB 无法接收自动更新。 有关更多信息,请参阅 ALB 的工作程序节点需求。
-
如果您正在使用经典集群,请为 IBM Cloud 基础架构帐户启用 虚拟路由器功能(VRF)。 要启用 VRF,请参阅 启用 VRF。 要检查是否已启用 VRF,请使用
ibmcloud account show
命令。 如果无法或不想启用 VRF,请启用 VLAN 生成。 启用 VRF 或 VLAN 跨接后,ALB 可以将数据包路由到开户免费送彩金38元中的各个子网。 -
如果您正在使用 VPC 集群,请确保 VPC 安全组 中允许 Ingress 将流量请求路由到工作程序节点上的节点端口。
-
请注意,如果在 5 天内次或更多次 7 创建和删除名称相同或相似的集群 (例如,出于自动化或测试目的),那么可能会达到 Let 's Encrypt 复制证书速率限制。 要确保正确注册 Ingress 子域和证书,集群名称的前 24 个字符必须不同。
-
如果将网络流量限制为流至边缘工作程序节点,请确保每个专区中至少启用 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 私钥。
-
要使用 IBM提供的 Ingress 子域,请参阅 为 IBM提供的 Ingress 子域设置 TLS 私钥。
-
要使用定制域,请参阅 为定制子域设置 TLS 私钥。
步骤 3:创建入口资源
创建 Ingress 资源以定义 Ingress 控制器用于将流量路由到应用程序服务的路由规则。
-
在 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 路径匹配方法。 受支持的值为
ImplementationSpecific
,Exact
或Prefix
。 有关每种路径类型的更多信息和示例,请参阅 社区 Kubernetes 文档。 service.name
- 将
app1_service
和app2_service
替换为您为公开应用程序而创建的服务名称,以此类推。 确保您指定的应用程序位于同一名称空间中。 service.name
- 将
<app1_service>
和<app2_service>
替换为您为公开应用程序而创建的服务名称,以此类推。 确保您指定的应用程序位于同一名称空间中。 service.port.number
- 服务侦听的端口。 使用针对应用程序创建 Kubernetes 服务时定义的端口。
-
将 Ingress 资源应用于集群。 确保资源部署到在资源中指定的应用程序服务所在的名称空间中。
kubectl apply -f community-ingress-resource.yaml -n <namespace>
步骤 4: 验证 Ingress 设置
-
列出 ALB,并复制运行 Kubernetes Ingress 映像的一个 ALB 的 IP 地址 (经典) 或主机名 (VPC)。 在输出中,选择具有格式为
<community_version>_<ibm_build>_iks
的 构建 的 ALB。ibmcloud ks ingress alb ls -c <cluster>
-
使用 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 创建定制域的步骤。
-
创建定制域。 要注册定制域,请使用您的域名服务 (DNS) 提供者或 IBM Cloud DNS。 如果希望 Ingress 公开的应用程序位于一个集群的不同名称空间中,请将定制域注册为通配符域,例如
*.custom_domain.net
。 请注意,在 Kubernetes V 1.20 或更高版本中,域限制为不超过 130 个字符。 -
通过将 IBM 提供的子域指定为规范名称记录 (CNAME),为自定义域定义别名。 要查找 IBM 提供的 Ingress 域,请运行
ibmcloud ks cluster get --cluster <cluster_name>
并查找 Ingress 子域字段。自动运行状况检查需要将 IBM提供的子域指定为 CNAME,以从 DNS 响应中除去任何失败的 IP,并确保在添加或除去 ALB 时定制域更新。
为专用 ALB 创建定制域
遵循步骤为专用 ALB 创建定制域。 请注意,需要定制域才能将 Ingress 与专用 ALB 配合使用。
如果您具有仅具有专用 VLAN 的经典集群,那么必须首先配置自己的 专用网络上可用的 DNS 服务。
-
通过 DNS 服务提供商创建自定义域名。 请注意,Ingress URL 必须不超过 130 个字符。
-
通过添加其 IP 地址作为 A 记录 (经典集群) 或其 VPC 主机名作为 CNAME (VPC 集群),将定制域映射到专用 ALB。 要查找 ALB IP 地址 (经典) 或主机名 (VPC),请运行
ibmcloud ks ingress alb ls -c <cluster_name_or_ID>
。