下面将详细介绍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
程序的入口规则
现在,如果您查看架构,它会更有意义,并且您可能能够理解每个入口工作流的工作原理。
部署你的第一个入口控制器
为了更好地理解入口和入口控制器,您应该亲自动手实现。
我已经发布了关于设置 Nginx 入口控制器的详细指南。
我还详细介绍了一些基本概念,例如入口准入控制器。
此外,我已经给出了逐步的清单部署和解释以获得深刻的理解。
查看Nginx 入口控制器设置指南。
Kubernetes Ingress 常见问题解答
Ingress 是负载均衡器吗?
Ingress 不是负载均衡器。它包含所有路由规则、自定义标头和 TLS 配置。入口控制器充当负载平衡器。
为什么我需要入口控制器?
入口控制器负责将外部流量实际路由到 kubernetes 服务端点。没有入口控制器,添加到入口的路由规则将不起作用。
ingress 和 Nginx 有什么区别?
Ingress 是一个 kubernetes 对象。Nginx 用作入口控制器(反向代理)。
我们可以使用入口将流量路由到多条路径吗?
是的。使用单个入口定义,您可以添加多个基于路径的路由配置。
ingress是否支持TLS配置?
是的。您可以在入口对象定义中包含 TLS 配置。TLS 证书将作为 Kubernetes 秘密添加并在入口对象中引用。
结论
在本Kubernetes Ingress 教程中,我们了解了 ingress 在 Kubernetes 中的工作原理。及其相关组件。为生产选择入口控制器取决于各种因素和要求。