Ingress入门指南
翻译
原文:https://devopscube.com/kubernetes-ingress-tutorial/
- name: 翻译
desc: 原文:https://devopscube.com/kubernetes-ingress-tutorial/
bgColor: '#F0DFB1'
textColor: 'green'
2
3
4
# Ingress入门指南

在本 Kubernetes Ingress 教程中,您将学习 Ingress 的基本概念、原生 Ingress 资源对象以及 Ingress 控制器中涉及的概念。
Kubernetes Ingress 是一种资源,用于添加规则以将流量从外部源路由到 Kubernetes 集群中运行的应用程序。
以下是我将在 Kubernetes Ingress 完整指南中介绍的主题:
# 1什么是Kubernetes Ingress?
字面意思:Ingress 是指进入的行为。
在 Kubernetes 世界中也是如此。Ingress 表示进入集群的流量,Egress 表示离开集群的流量。

Ingress 是一个原生的 Kubernetes 资源,就像 pods、deployments 等。使用 Ingress,您可以维护 DNS 路由配置。Ingress 控制器通过存储在 etcd 中的 Ingress 对象读取路由规则,来执行实际的路由。
让我们通过一个高级示例来理解 ingress。
在没有 Kubernetes ingress 的情况下,如果要向外界公开应用程序,您需要将服务类型 Loadbalancer 添加到 deployments 中。这是它的样子。(我在此处展示的是 nodePort 只为了展示流量)

在同一个实现中,如果使用 Ingress 的话,则负载均衡器和 kubernetes 服务端点之间存在一个反向代理层(由 Ingress 控制器实现)。
下面是一个非常高级的 ingress 实现视图。在后面的部分中,我们将看到一个 涵盖所有关键概念 的详细架构。

注意
注意:AWS、GCP 云上的 ingress 控制器实现略有不同。例如,AWS loadbalancer (opens new window)本身即可充当 ingress 控制器。请参阅GKE ingress 设置 (opens new window)博客,了解有关 GCP loadbalancer 的更多信息。
# 2在 Kubernetes Ingress 之前?
在 Kubernetes Ingress 问世之前,自定义的 Nginx 或 HAproxy Kubernetes deployment 将被公开为 Loadbalancer 服务,用于将外部流量路由到内部集群服务。
路由规则被作为 configmap 添加到 Nginx/HAProxy 的 pods 中。每当 DNS 发生更改或要添加新的路由条目时,它都会在 configmap 中更新,并重新加载和部署 pod 配置。
Kubernetes ingress 也遵循类似的模式,但它将路由规则维护为原生 Kubernetes ingress 对象,而不是一个 configmap。
Nginx/HAProxy 的代替方案有 ingress 控制器、Nginx/HAProxy 的定制版本等,它们都可以动态地获取路由规则。
此外,还有一些使用 consul 实现的其他服务发现工具 (opens new window),可以在不停机的情况下将 DNS 变化更新到 Nginx 或 HAproxy,这为 ingress 带来了更精确的实现。
在 openshift 方面,路由器(HAproxy 实现)概念使得 在集群外部公开服务端点 变得容易。您所要做的就是进行路由器配置(Openshift YAML 对象),然后 openshift 路由器会处理好一切。它类似于 Kubernetes ingress。
# 3Kubernetes Ingress是如何工作的?
如果您是一个初学者,并试图了解 ingress,那么可能会对它的工作原理感到困惑。
例如,您可能会问:嘿,我创建了 ingress 规则,但我不确定如何将其映射到域名,或将外部流量路由到内部 deployments。
您需要非常清楚以下两个关键概念,才能理解这一点。
- Kubernetes Ingress 资源:Kubernetes 的 ingress 资源负责在集群中存储 DNS 路由规则。
- Kubernetes Ingress 控制器:Kubernetes 的 ingress 控制器(Nginx/HAProxy 等)负责访问和应用 Ingress 资源中的 DNS 规则来进行路由。

让我们详细了解一下 ingress 资源和 ingress 控制器。
# 4Kubernetes Ingress资源
Kubernetes Ingress 资源是一个原生的 kubernetes 资源,您可以在其中指定 DNS 路由规则。这意味着,您可以将外部 DNS 流量映射到内部 Kubernetes 服务端点。
它需要一个 ingress 控制器,来路由 ingress 对象中指定的规则。让我们来看看一个非常基本的入口资源。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: dev
spec:
rules:
- host: test.apps.example.com
http:
paths:
- backend:
serviceName: hello-service
servicePort: 80
2
3
4
5
6
7
8
9
10
11
12
13
上面的声明意味着,所有对test.apps.example.com
的访问都应该被路由到位于dev
命名空间中名为hello-service
的服务。
正如您所看到的,它只具备路由规则。您可以为基于路径的路由添加多个路由端点,也可以添加 TLS 配置等。
需要了解的有关入口对象的关键事项。
一些有关于了解 ingress 对象的关键事项:
- ingress 对象需要 ingress 控制器来路由流量。
- 最重要的是,外部流量不会直接到达 ingress API,而是到达使用了负载均衡器配置的 ingress 控制器服务端点。
现在,让我们了解一下 ingress 控制器。
# 5Kubernetes Ingress控制器
Ingress 控制器不是原生的 Kubernetes 实现。这意味着,默认情况下它不会在集群中出现。
我们需要设置一个 ingress 控制器才能使 ingress 规则正常工作。有几种开源的和企业级的 ingress 控制器可用。
ingress 控制器通常是由集群中的反向 Web 代理服务器实现。在 kubernetes 术语中,它是一个反向代理服务器,将其部署为 kubernetes deployment (opens new window),并暴露给服务类型 Loadbalancer。
您可以将集群中的多个 ingress 控制器映射到多个负载均衡器。每个 ingress 控制器都应该将一个名为 ingress-class 的唯一标识符添加到注释中。
# 6Kubernetes Ingress控制器是如何工作的?
Nginx 是广泛使用的 ingress 控制器之一。
因此,让我们以 Nginx 的 ingress 控制器实现为例,来了解它是如何工作的。

- Nginx 控制器 Pod 中的
nginx.conf
文件是一个 lua 模板,可以与 Kubernetes ingress API 通信并实时获取流量路由的最新值。这是模板文件 (opens new window)。 - Nginx 控制器与 Kubernetes ingress API 通信,以检查是否为流量路由创建了任何新规则。
- 如果找到任何 ingress 规则,则 Nginx 控制器会在每个 nginx Pod 内的
/etc/nginx/conf.d
位置生成路由配置。 - 对于您创建的每个 ingress 资源,Nginx 都会在
/etc/nginx/conf.d
位置中生成一个配置。 - 主文件
/etc/nginx/nginx.conf
包含来自/etc/nginx/conf.d
的所有配置。 - 当您使用新配置更新 ingress 对象时,Nginx 配置也会同步更新,并优雅地重新加载配置。
如果您使用 exec 连接到 Nginx ingress 控制器 Pod 中并检查/etc/nginx/nginx.conf
文件,则可以在 conf 文件中看到应用的所有 ingress 对象规则。
# 7Ingress和Ingress控制器架构
下面是架构图,解释了设置在 kubernetes 集群上的 ingress 和 ingress 控制器。
它显示了将流量路由到两个支付 & 身份验证应用程序的 ingress 规则。
现在,如果你回头看看架构,它将会变得更有意义,您可以理解每个 ingress 工作流是如何工作的。

# 8Kubernetes Ingress控制器列表
以下是适用于 Kubernetes 的常用 ingress 控制器。
- Nginx Ingress 控制器(社区 (opens new window) & 来自Nginx Inc (opens new window))
- Traefik (opens new window)
- HAproxy (opens new window)
- Contour (opens new window)
- GKE Ingress 控制器 (opens new window)(谷歌云 Kubernetes 托管服务-GKE)
- AWS ALB Ingress 控制器 (opens new window)(亚马逊云 Kubernetes 托管服务-AKS)
- Azure 应用程序网关 Ingress 控制器 (opens new window)
Learnk8s 创建了一个很棒的文档,比较了所有可用的 ingress 控制器。查看比较文档 (opens new window)。
# 9部署您的第一个Ingress控制器
为了更好地理解 ingress 和 ingress 控制器,您应该亲自动手实现。
我已经发布了一个关于设置 Nginx ingress 控制器的详细指南。
我还详细介绍了一些基本概念,例如 ingress 准入控制器(Admission Controllers)。
此外,我还给出了分步部署清单和解释,以获得深刻的理解。
查看 Nginx ingress 控制器设置指南 (opens new window)。
# 10Kubernetes Ingress常见问题
# Ingress是负载均衡器吗?
Ingress 不是负载均衡器。它包含所有路由规则、自定义标头和 TLS 配置。但 Ingress 控制器可以充当负载均衡器。
# 为什么需要ingress控制器?
ingress 控制器负责将外部流量实际路由到 Kubernetes 服务端点。如果没有 ingress 控制器,那么添加到 ingress 中的路由规则将无法工作。
# ingress和Nginx有什么区别?
ingress 是一个 kubernetes 对象。Nginx 被用作为 ingress 控制器(反向代理)。
# 我们可以使用ingress将流量路由到多个路径吗?
是的。使用单个 ingress 定义时,您可以添加多个基于路径的路由配置。
# ingress 是否支持 TLS 配置?
是的。您可以在 ingress 对象定义中对 TLS 进行配置。TLS 证书将作为 Kubernetes secret 添加,并在 ingress 对象中引用。
# 11结论
在这个 Kubernetes Ingress 教程中,我们了解了 Ingress 及其相关组件在 Kubernetes 中是如何工作的。为生产环境选择 ingress 控制器时,应考虑各种因素和要求。
您可以阅读 ingress 控制器比较文档 (opens new window)作为选择 ingress 控制器的参考。
也许您刚刚开始学习 ingress 或正在项目中使用 ingress。
无论是哪种情况,请在下面发表评论,让我知道您的想法。
另外,如果您正在学习 Kubernetes,请查看我的 30 多个全面的 Kubernetes 教程 (opens new window)。
本文原作者:Bibin Wilson
https://devopscube.com/author/bibinwilson/
- name: 本文原作者:Bibin Wilson
desc: https://devopscube.com/author/bibinwilson/
bgColor: '#38b6ff'
textColor: 'black'
2
3
4