Ingress 规则(Kubernetes Ingress)将集群外部的 HTTP/HTTPS 路由暴露到内部路由(Kubernetes Service),从而实现对计算组件外部访问的控制。
创建一个 Ingress 来管理对 Service 的外部 HTTP/HTTPS 访问。
在同一命名空间内创建多个 ingress 时,不同的 ingress 不得 具有相同的 域名、协议 和 路径(即不允许重复的访问入口)。
Ingress 规则依赖于 Ingress Controller 的实现,Ingress Controller 负责监听 Ingress 和 Service 的变化。当创建新的 Ingress 规则后,Ingress Controller 内部会自动生成与该 Ingress 规则匹配的转发规则。当 Ingress Controller 收到请求时,会根据 Ingress 规则匹配转发规则,并将流量分发到指定的内部路由,如下图所示。
对于 HTTP 协议,Ingress 只支持 80 端口作为外部端口。对于 HTTPS 协议,Ingress 只支持 443 端口作为外部端口。平台的负载均衡器会自动添加 80 和 443 监听端口。
接下来,我们将使用社区版的 Ingress-NGINX 演示如何使用 NGINX controller 访问您自己的应用。
部署 Ingress-NGINX
controller。
使用该命令后会自动创建以下资源:
类型 | 名称 | 说明 |
---|---|---|
Namespace | ingress-nginx | 用于隔离 Controller 的资源 |
ServiceAccount | ingress-nginx | Controller 的服务账户 |
ClusterRole | ingress-nginx | 集群范围权限 |
ClusterRoleBinding | ingress-nginx | 将 ClusterRole 绑定到服务账户 |
ConfigMap | ingress-nginx-controller | 配置 Controller 行为(如日志级别、代理超时等) |
ValidatingWebhookConfig | ingress-nginx-admission | 用于验证 Ingress 配置合法性的 webhook(可选) |
Service (TCP/UDP) | ingress-nginx-controller | 类型默认为 LoadBalancer ,可更改为 NodePort 。 |
Deployment | ingress-nginx-controller | |
Pod | ingress-nginx-controller-xxx | |
Role /RoleBinding | admission 相关 | 支持 webhook |
Job | ingress-nginx-admission-create | webhook 注册 |
如果想更改默认的镜像仓库地址,可以先用 curl
下载 YAML 文件,修改后再应用该 YAML 文件。
等待 ingress-nginx-controller-xxx
Pod 运行。
本地测试
创建一个简单的 web 服务器及其对应的 Service:
创建一个 ingress 资源。此示例使用映射到 localhost
的主机:
将本地端口转发到 ingress controller:
使用 curl 访问您的部署:
注意:该参数临时将域名 demo.local 解析到 IP 127.0.0.1,并使用端口 8080。当您访问 http://demo.local:8080
时,实际上访问的是 http://127.0.0.1:8080
。
另外,您应配置 hosts
文件:
最终您应该看到包含 “Welcome to nginx!” 字样的 HTML 响应。
然后您可以访问网站 http://demo.local:8080/
。
ingress-nginx-controller
默认类型为 LoadBalancer
,如果 EXTERNAL-IP
字段显示为 pending
,表示您的 Kubernetes 集群无法创建负载均衡器。
如果您使用的云服务商支持通过(特定于服务商的)annotations 指定 Service 的负载均衡器 IP 地址,建议切换为该方式。
在线测试
当您的 ingress-nginx-controller
(LoadBalancer 类型的 Service)存在 EXTERNAL-IP
时,您就可以创建 ingress 资源。以下示例假设您已为 www.developer.io
配置了 DNS 记录:
您可以访问 http://www.developer.io
查看相同的输出。
当前命名空间中必须存在可用的 Service。
请与管理员确认已为当前命名空间关联的项目分配了可用的域名。
若需通过 HTTPS 访问域名,需先将 HTTPS 证书保存为 TLS secret。
ingress-nginx
controller。hosts
。访问 容器平台。
在左侧导航栏点击 网络 > Ingress。
点击 创建 Ingress。
参考以下说明配置相关参数。
参数 | 说明 |
---|---|
Ingress Class | 不同的 Ingress Controller 可能使用不同的 IngressClass 名称。如果平台上存在多个 ingress controller,用户可以通过此选项选择使用哪一个。 |
域名 | 主机可以是精确匹配(例如 foo.bar.com )或通配符(例如 *.foo.com )。可用的域名由平台管理员分配。 |
证书 | TLS secret 或由平台管理员分配的证书。 |
匹配类型 和 路径 |
|
Service | 外部流量将转发到该 Service。 |
Service 端口 | 指定流量将转发到 Service 的哪个端口。 |
点击 创建。
如果 ingress 没有指定 Ingress Class,则分配给该项目的所有 ALB 实例都会处理此 ingress。