ingress控制器介绍

1. ingress控制器介绍

ingress controller可以为外网用户访问K8S集群内部pod提供代理服务。

  • 作用:提供全局访问代理
  • 访问流程:用户 --> ingress controller --> service --> pod
    在这里插入图片描述

ingress控制器有很多种,接下来介绍一些常见ingress控制器:

1.1 Kubernetes Ingress Controller

http://github.com/kubernetes/ingress-nginx

实现:Go/Lua(nginx 是用 C 写的)
许可证:Apache 2.0

Kubernetes 的“官方”控制器(之所以称为官方,是想把它区别于 NGINX 公司的控制器)。这是社区开发的控制器,它基于 nginx Web 服务器,并补充了一组用于实现额外功能的 Lua 插件。

由于 NGINX 十分流行,再加上把它用作控制器时所需的修改较少,它对于 K8s 普通工程师来说,可能是最简单和最直接的选择。

1.2 NGINX Ingress Controller

http://github.com/nginxinc/kubernetes-ingress

实现:Go
许可证:Apache 2.0

这是 NGINX 公司开发的官方产品,它也有一个基于 NGINX Plus 的商业版。NGINX 的控制器具有很高的稳定性、持续的向后兼容性,且没有任何第三方模块。

由于消除了 Lua 代码,和官方控制器相比,它保证了较高的速度,但也因此受到较大限制。相较之下,它的付费版本有更广泛的附加功能,如实时指标、JWT 验证、主动健康检查等。

NGINX Ingress 重要的优势是对 TCP/UDP 流量的全面支持,最主要缺点是缺乏流量分配功能。

1.3 Kong Ingress

http://github.com/Kong/kubernetes-ingress-controller

实现:Go
许可证:Apache 2.0

Kong Ingress 由 Kong Inc 开发,有两个版本:商业版和免费版。它基于 NGINX 构建,并增加了扩展其功能的 Lua 模块。

最初,Kong Ingress 主要用作 API 网关,用于 API 请求的处理和路由。现在,它已经成为成熟的 Ingress 控制器,主要优点是拥有大量易于安装和配置的附加模块、插件(包括第三方插件)。它开启了控制器具备大量附加功能的先河,其内置函数也提供了许多可能性。Kong Ingress 配置是用 CRD 执行的。

Kong Ingress 的一个重要特性是它只能在一个环境中运行(而不支持跨命名空间)。这是一个颇有争议的话题:有些人认为这是一个缺点,因为必须为每个环境生成实例;而另一些人认为这是一个特殊特性,因为它是更高级别的隔离,控制器故障的影响仅限于其所在的环境。

1.4 Traefik

http://github.com/containous/traefik

实现:Go
许可证:MIT

最初,这个代理是为微服务请求及其动态环境的路由而创建的,因此具有许多有用的功能:连续更新配置(不重新启动)、支持多种负载均衡算法、Web UI、指标导出、对各种服务的支持协议、REST API、Canary 版本等。

支持开箱即用的 Let’s Encrypt 是它的另一个不错的功能,但它的主要缺点也很明显,就是为了控制器的高可用性,你必须安装并连接其 Key-value store。

在 2019 年 9 月发布的 Traefik v2.0 中,虽然它增加许多不错的新功能,如带有 SNI 的 TCP/SSL、金丝雀部署、流量镜像/shadowing 和经过改进的 Web UI,但一些功能(如 WAF 支持)还在策划讨论中。

与新版本同期推出的还有一个名叫 Maesh 的服务网格,它建在 Traefik 之上。

1.5 HAProxy Ingress

http://github.com/jcmoraisjr/haproxy-ingress

实现:Go(HAProxy 是用 C 写的)
许可证:Apache 2.0

HAProxy 是众所周知的代理服务器和负载均衡器。作为 Kubernetes 集群的一部分,它提供了“软”配置更新(无流量损失)、基于 DNS 的服务发现和通过 API 进行动态配置。 HAProxy 还支持完全自定义配置文件模板(通过替换 ConfigMap)以及在其中使用 Spring Boot 函数。

通常,工程师会把重点放在已消耗资源的高速、优化和效率上。而 HAProxy 的优点之一正是支持大量负载均衡算法。值得一提的是,在今年 6 月发布的 v2.0 中,HAProxy 增加了许多新功能,其即将推出的 v2.1 有望带来更多新功能(包括 OpenTracing 支持)。

1.6 Voyager

http://github.com/appscode/voyager

实现:Go
许可证:Apache 2.0

Voyager 基于 HAProxy,并作为一个通用的解决方案提供给大量供应商。它最具代表性的功能包括 L7 和 L4 上的流量负载均衡,其中,TCP L4 流量负载均衡称得上是该解决方案最关键的功能之一。

在今年早些时候,尽管 Voyager 在 v9.0.0 中推出了对 HTTP/2 和 gRPC 协议的全面支持,但总的来看,对证书管理(Let’s Encrypt 证书)的支持仍是 Voyager 集成的最突出的新功能。

1.7 Contour

http://github.com/heptio/contour

实现:Go
许可证:Apache 2.0

Contour 和 Envoy 由同一个作者开发,它基于 Envoy。它最特别的功能是可以通过 CRD(IngressRoute)管理 Ingress 资源,对于多团队需要同时使用一个集群的组织来说,这有助于保护相邻环境中的流量,使它们免受 Ingress 资源更改的影响。

它还提供了一组扩展的负载均衡算法(镜像、自动重复、限制请求率等),以及详细的流量和故障监控。对某些工程师而言,它不支持粘滞会话可能是一个严重缺陷。

1.8 Istio Ingress

http://istio.io/docs/tasks/traffic-management/ingress

实现:Go
许可证:Apache 2.0

Istio 是 IBM、Google 和 Lyft 的联合开发项目,它是一个全面的服务网格解决方案——不仅可以管理所有传入的外部流量(作为 Ingress 控制器),还可以控制集群内部的所有流量。

Istio 将 Envoy 用作每种服务的辅助代理。从本质上讲,它是一个可以执行几乎所有操作的大型处理器,其中心思想是最大程度的控制、可扩展性、安全性和透明性。

通过 Istio Ingress,你可以对流量路由、服务之间的访问授权、均衡、监控、金丝雀发布等进行优化。

1.9 Ambassador

http://github.com/datawire/ambassador

实现:Python
许可证:Apache 2.0

Ambassador 也是一个基于 Envoy 的解决方案,它有免费版和商业版两个版本。

Ambassador 被称为“Kubernetes 原生 API 微服务网关”,它与 K8s 原语紧密集成,拥有你所期望的从 Ingress controller 获得的功能包,它还可以与各种服务网格解决方案,如 Linkerd、Istio 等一起使用。

顺便提一下,Ambassador 博客日前发布了一份基准测试结果,比较了 Envoy、HAProxy 和 NGINX 的基础性能。

1.10 Gloo

http://github.com/solo-io/gloo

实现:Go
许可证:Apache 2.0

Gloo 是在 Envoy 之上构建的新软件(于 2018 年 3 月发布),由于它的作者坚持认为“网关应该从功能而不是服务中构建 API”,它也被称为“功能网关”。其“功能级路由”的意思是它可以为后端实现是微服务、无服务器功能和遗留应用的混合应用路由流量。

由于拥有可插拔的体系结构,Gloo 提供了工程师期望的大部分功能,但是其中一些功能仅在其商业版本(Gloo Enterprise)中可用。

1.11 Skipper

http://github.com/zalando/skipper

实现:Go
许可证:Apache 2.0

Skipper 是 HTTP 路由器和反向代理,因此不支持各种协议。从技术上讲,它使用 Endpoints API(而不是 Kubernetes Services)将流量路由到 Pod。它的优点在于其丰富的过滤器集所提供的高级 HTTP 路由功能,工程师可以借此创建、更新和删除所有 HTTP 数据。

Skipper 的路由规则可以在不停机的情况下更新。正如它的作者所述,Skipper 可以很好地与其他解决方案一起使用,比如 AWS ELB。

### Ingress 控制器的概念、配置与使用教程 #### 概念概述 Ingress 控制器是一种特殊的组件,用于管理和实现 Kubernetes 中的 Ingress 资源。它通过监听 Ingress API 对象中的规则配置,并将其转化为具体的反向代理或负载均衡策略[^3]。常见的 Ingress 控制器实现包括 NGINX、Traefik 和 HAProxy 等。 NGINX Ingress 控制器的核心功能是将 Ingress 规则转换为 NGINX 配置文件,并动态更新这些配置以适应集群内的服务变化。这使得外部流量可以通过单一入口点访问多个内部服务,同时支持 SSL/TLS 加密、路径匹配和负载均衡等功能[^1]。 --- #### 配置步骤 ##### 1. 安装 NGINX Ingress Controller 在 Kubernetes 集群中安装 NGINX Ingress Controller 的典型方法如下所示: ```bash kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml ``` 该命令会部署一个包含以下资源的默认 NGINX Ingress Controller 实现: - Deployment:运行 NGINX 进程的主要容器。 - Service:暴露 NGINX 控制器的服务(通常是 LoadBalancer 类型)。 - ConfigMap:存储自定义 NGINX 配置参数。 如果需要更精细的控制,可以根据具体需求修改 YAML 文件中的字段[^2]。 --- ##### 2. 创建 Ingress Resource 为了使 NGINX Ingress Controller 正常工作,还需要定义至少一个 Ingress 资源。下面是一个简单的示例: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: number: 80 - path: /app2 pathType: Prefix backend: service: name: app2-service port: number: 80 ``` 在此配置中: - `annotations` 字段指定了额外的功能选项(如 URL 重写)。 - `rules` 列表描述了主机名到服务映射的关系以及对应的路径匹配逻辑[^4]。 --- ##### 3. 测试 Ingress 设置 完成上述操作后,可通过浏览器或工具测试新创建的 Ingress 是否按预期工作。假设已成功绑定域名,则可以直接访问 `http://example.com/app1` 或 `http://example.com/app2` 并验证返回的内容是否来自对应的服务实例。 此外还可以借助 kubectl 查看实时状态信息: ```bash kubectl get ingress kubectl describe ingress example-ingress ``` --- #### 使用场景扩展 除了基础的流量路由外,现代应用开发还可能涉及更多高级特性,例如 TLS 自动化配置、蓝绿发布模式集成等。对于前者来说,推荐结合 Cert-Manager 插件简化证书生命周期管理;而对于后者而言,则可以探索 Argo Rollouts 提供的支持渐进式交付能力的解决方案。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值