下面将详细介绍ingress 的基本概念、原生 ingress 资源对象以及ingress controller 涉及的概念。
Kubernetes Ingress 是一种资源,用于添加Rules以将流量从外部源路由到 kubernetes 集群中运行的应用程序。
主要包括下面几个方面的内容:
- 什么是 Kubernetes Ingress?
- 在 Kubernetes Ingress 之前?
- Kubernetes Ingress 是如何工作的?
- Kubernetes 入口资源
- Kubernetes 入口控制器
- 入口控制器如何工作?
- 入口和入口控制器架构
- Kubernetes 入口控制器列表
- 部署你的第一个入口控制器
- Kubernetes Ingress 常见问题解答
Ingress是指进入集群的流量,egress是指离开集群的流量。
Ingress 是原生的 Kubernetes 资源,如 pod、deployments 等。使用 ingress,您可以维护 DNS 路由配置。入口控制器通过从存储在 etcd 中的入口对象读取路由规则来进行实际路由。
让我们通过一个高级示例来了解Ingress。
在没有 Kubernetes ingress 的情况下,要将应用程序暴露给外界,您将向部署添加服务类型 Loadbalancer。这是它的样子。(我已经显示了 nodePort 只是为了显示流量)
在相同的实现中,对于Ingress,在负载均衡器和 kubernetes 服务端点之间有一个反向代理层(入口控制器实现)。
这是Ingress实现的一个非常高级的视图。在后面的部分中,我们将看到涵盖所有关键概念的详细架构。
在 Kubernetes Ingress 之前?
在 Kubernetes Ingress 稳定之前,自定义 Nginx 或 HAproxy kubernetes 部署将作为 Loadbalancer 服务公开,用于将外部流量路由到内部集群服务。
路由规则作为配置映射添加到 Nginx/HAProxy pod 中。每当 dns 发生变化或要添加新的路由条目时,它都会在 configmap 中更新,并且 pod 配置会重新加载,或者重新部署。
Kubernetes ingress 也遵循类似的模式,将路由规则维护为本地 Kubernetes ingress 对象而不是 configmap。
在 Nginx/HAProxy 的位置,我们有入口控制器、Nginx/HAProxy 的自定义版本等,它可以动态获取路由规则。
此外,还有使用 consul 和其他服务发现工具的实现,无需停机即可将 DNS 更改更新到 Nginx 或 HAproxy,这带来了作为入口的确切实现。
当谈到 openshift 时,路由器(HAproxy 实现)概念使得在集群外暴露服务端点变得容易。您所要做的就是进行路由器配置(Openshift YAML 对象),openshift 路由器会处理所有事情。它类似于 Kubernetes 入口。
Kubernetes Ingress 是如何工作的?
如果您是初学者并试图了解 ingress,可能会对它的工作原理感到困惑。
例如,您可能会问,嘿,我创建了入口规则,但我不确定如何将其映射到域名或将外部流量路由到内部部署。
您需要非常清楚两个关键概念才能理解这一点。
- Kubernetes Ingress Resource: Kubernetes Ingress Resource 负责存储集群中的 DNS 路由规则。
- Kubernetes 入口控制器: Kubernetes 入口控制器(Nginx/HAProxy 等)负责通过访问通过入口资源应用的 DNS 规则来进行路由。
让我们详细看看入口资源和入口控制器。
Kubernetes 入口资源
Kubernetes Ingress 资源是一种本地 kubernetes 资源,您可以在其中指定 DNS 路由规则。这意味着,您将外部 DNS 流量映射到内部 Kubernetes 服务端点。
它需要一个入口控制器来路由入口对象中指定的规则。让我们来看看一个非常基本的入口资源。
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
上面的声明意味着,所有对的调用都应该命中驻留在 dev 命名空间中的test.apps.example.com
命名服务。hello-service
如您所见,它只有路由规则。您可以为基于路径的路由添加多个路由端点,您可以添加 TLS 配置等。
关于入口对象需要了解的关键事项。
- 入口对象需要入口控制器来路由流量。
- 最重要的是,外部流量不会到达入口 API,而是会到达直接使用负载均衡器配置的入口控制器服务端点。
现在,让我们了解入口控制器。
Kubernetes 入口控制器
入口控制器不是原生的 Kubernetes 实现。这意味着它在集群中不是默认的。
我们需要为入口规则设置一个入口控制器。有几个可用的开源和企业入口控制器。
入口控制器通常是集群中的反向 Web 代理服务器实现。在 kubernetes 术语中,它是一个反向代理服务器部署为kubernetes 部署暴露给服务类型 Loadbalancer。
您可以将集群中的多个入口控制器映射到多个负载均衡器。每个入口控制器都应该有一个名为ingress-class 的唯一标识符添加到注释中。
入口控制器如何工作?
Nginx 是广泛使用的入口控制器之一。
那么让我们以 Nginx 入口控制器实现为例来了解它是如何工作的。
- Nginx controller pod 中的文件是一个 lua 模板,可以与Kubernetes ingress API
nginx.conf
通信并实时获取流量路由的最新值。这是模板文件。 - Nginx 控制器与 Kubernetes ingress API 对话,以检查是否为流量路由创建了任何规则。
- 如果找到任何入口规则,Nginx 控制器会在
/etc/nginx/conf.d
每个 nginx pod 内的位置生成一个路由配置。 - 对于您创建的每个入口资源,Nginx 都会在内部位置生成一个配置
/etc/nginx/conf.d
。 - 主
/etc/nginx/nginx.conf
文件包含来自etc/nginx/conf.d.
- 如果您使用新配置更新入口对象,Nginx 配置将再次更新并重新加载配置。
如果您使用 exec 连接到 Nginx ingress controller pod 并检查该/etc/nginx/nginx.conf
文件,您可以看到在 conf 文件中应用的 ingress 对象中指定的所有规则。
入口和入口控制器架构
这是解释 kubernetes 集群上的入口和入口控制器设置的架构图。
它显示了将流量路由到两个payment
应用auth
程序的入口规则
现在,如果您查看架构,它会更有意义,并且您可能能够理解每个入口工作流的工作原理。
(点击图片可查看高清)
Kubernetes 入口控制器列表
以下是可用于 Kubernetes 的常用入口控制器。
- Nginx 入口控制器(社区和来自 Nginx Inc)
- 特拉菲克
- 代理服务器
- 轮廓
- GKE 的 GKE 入口控制器
- 来自 AKS 的 AWS ALB 入口控制器
- 一个zure 应用程序网关入口控制器
Learnk8s 创建了一个很棒的文档来比较所有可用的入口控制器。看一下比较文档。
部署你的第一个入口控制器
为了更好地理解入口和入口控制器,您应该亲自动手实现。
我已经发布了关于设置 Nginx 入口控制器的详细指南。
我还详细介绍了一些基本概念,例如入口准入控制器。
此外,我已经给出了逐步的清单部署和解释以获得深刻的理解。
Kubernetes Ingress 常见问题解答
Ingress 是负载均衡器吗?
Ingress 不是负载均衡器。它包含所有路由规则、自定义标头和 TLS 配置。入口控制器充当负载平衡器。
为什么我需要入口控制器?
入口控制器负责将外部流量实际路由到 kubernetes 服务端点。没有入口控制器,添加到入口的路由规则将不起作用。
ingress 和 Nginx 有什么区别?
Ingress 是一个 kubernetes 对象。Nginx 用作入口控制器(反向代理)。
我们可以使用入口将流量路由到多条路径吗?
是的。使用单个入口定义,您可以添加多个基于路径的路由配置。
ingress是否支持TLS配置?
是的。您可以在入口对象定义中包含 TLS 配置。TLS 证书将作为 Kubernetes 秘密添加并在入口对象中引用。
结论
在本Kubernetes Ingress 教程中,我们了解了 ingress 在 Kubernetes 中的工作原理。及其相关组件。为生产选择入口控制器取决于各种因素和要求。