Kubernetes Ingress 用于添加规则,以将流量从外部路由到 Kubernetes 集群的服务中。在本文中你将了解 ingress 的概念,以及用于路由外部流量到 Kubernetes deployment 的 ingress controller。
通常情况下,自定义 Nginx 或 HAproxy Kubernetes 部署将作为服务被暴露,它们用于将外部流量代理到内部集群的服务中。其中,路由规则将会 bake 到 Pod 中,并作为 configmap 添加。Kubernetes ingress 的行为与此类似,只是路由规则将作为 Kubernetes ingress 对象维护。它具有动态路由规则配置的巨大优势,因此无需重新部署 proxy pods。
Kubernetes Ingress 入门浅析
想要顺利开始使用 Kubernetes Ingress,你需要了解以下两个关键概念:
1、 Kubernetes Ingress
2、 Kubernetes Ingress Controller
让我们来逐一了解。
Kubernetes Ingress
Kubernetes Ingress 是一个原生的 Kubernetes 资源,你可以设置规则来从外部路由流量到集群内部的服务端点。它需要一个 Ingress Controller 来路由 ingress 对象所指定的规则。Ingress 对象如下所示:
上面的声明意味着,对 test.apps.example.com 的所有调用都应该 hit 名为 hello-service 的服务,这一服务位于 dev 命名空间中。
关于 Ingress 对象,你需要了解的关键事项如下:
你应该在你所部署服务的命名空间内创建 ingress 规则。如果在其他没有 ingress 对象的命名空间中,你将无法路由流量到其中的服务内。
一个 ingress 对象需要一个 ingress controller 来路由流量
外部流量将不会 hit ingress API,而是 hit ingress controller 服务。
Kubernetes Ingress Controller
Ingress controller 是一个典型的部署在集群中的代理服务,它只是暴露给服务的 Kubernetes 部署。以下是可用于 Kubernetes 的 Ingress Controller:
Nginx Ingress Controller
Traefik
HAproxy
Contour
GKE Ingress Controller
目前,Nginx 是大多数企业的选择。以下是 Nginx Ingress Controller 的工作原理:
在 Nginx controller pod 内部的 nginx.conf 文件是一个 go 模板,它可以与 Kubernetes Ingress API 通信并实时获得流量路由的最新值。
Nginx controller 与 Kubernetes ingress API 通信以检查是否为流量路由创建了规则。
如果它发现了任何 ingress 规则,它将应用到 Nginx Controller 配置,也就是使用 go 模板在 pod 内的 nginx.conf 文件。
如果你使用 exec 连接到 pod 并检查/etc/nginx/nginx.conf 文件,则可以看到在 conf 文件中应用的 ingress 对象中指定的所有规则。
以下的架构图将解释在一个 Kubernetes 集群上的 ingress 设置。
接下来,我们详细看看如何使用 Nginx Ingress Controller 在 Kubernetes 中设置 Ingress。
前期准备
一个 Kubernetes 集群
安装好的 kubectl 并已对 Kubernetes 集群进行身份验证
Kubernetes 集群的管理员访问权限
指向 ingress controller 负载均衡器的有效域
如果你在谷歌云上,请为你的账户分配管理员权限以启用集群角色。
请注意:本教程已在 Google Cloud GKE 集群上尝试过。理论上,它可在所有云环境中使用。如果你真的遇到任何错误,则可能需要在设置中进行一些调整。
设置 Nginx Ingress Controller
有两个 nginx ingress controller:
Kubernetes 社区的 Nginx ingress controller
Nginx 公司的 Nginx ingress controller
我们将使用 Kubernetes 社区的 nginx controller。
Ingress controller 需要特定的命名空间、服务账户、集群角色绑定、configmap 等。因此,你需要使用官方 ingress repo 中的 yaml 文件来创建所提到的 Kubernetes 对象。
官方 repo:
https://github.com/kubernetes/ingress-nginx/tree/master/deploy
让我们使用 mandatory.yaml 文件部署 ingress controller,你可以在官方 repo 找到它。它有 nginx 所需的 Kubernetes 对象列表。
让我们使用 kubectl 创建 Nginx controller deployment:
检查 ingress controller pod 以确保它是否正确设置:
为 Ingress Controller 设置 LoadBalancer 服务
下一步是创建一个 LoadBalancer 类型的服务,以在集群外部暴露 nginx controller 部署。
Step1: 在本地创建项目目录,然后切换到该目录。
Step2: 创建一个名为 nginx-ingress.yaml 的文件
Step3: 复制以下内容到文件
请注意:label 下的 annotation 对于 nginx controller 部署集成非常重要
Step4: 创建 ingress 服务
Step5: 检查已创建的服务是否已连接到外部负载均衡器
将域名映射到 Loadbalancer IP
为了让我们的 ingress 的设置运转起来,我们需要映射一个域名到负载均衡器 IP。你可以用两种方式,完成此操作。
单个 DNS 映射
你可以将单个域作为 A record 直接映射到负载均衡器 IP,使用这一功能,你只能为 ingress controller 提供一个域,并可以基于多个路径进行流量路由。
例如:
您可以使用此模型进行基于路径的路由。
以下有几个例子:
通配符 DNS 映射
如果你映射一个通配符 DNS 到负载均衡器,你就可以通过 ingress 拥有动态 DNS 端点。
例如:
这样,你可以通过单个 ingress controller 拥有多个动态子域,并且每个 DNS 有自己基于路径的路由。
例如:
出于演示目的,我们已将通配符 DNS 映射到 LoadBalancer IP。你可以根据你的 DNS 提供商进行此设置。
设置一个 Demo 应用程序
出于测试的目的,我们将部署一个 demo 应用程序并且添加一个 ClusterIP 服务到应用程序上。
Step1: 创建一个名为 dev 的命名空间
Step2: 创建一个名为 hello-app.yaml 的文件
Step3: 复制以下内容到文件并保存
Step4: 使用 kubectl 创建 deployment
检查 deployment 状态
Step5: 创建一个名为 hello-app-service.yaml 的文件
Step6: 复制以下内容到文件并保存
Step7: 使用 kubectl 创建服务
检查服务状态
创建 Kubernetes Ingress 对象
现在让我们使用一个 DNS 创建一个 Ingress 对象来访问我们的 hello app。Ingress 对象可以设置路由规则。
Ingress controller pod 会连接到 Ingress API 来检查规则,并且会相应地更新其 nginx.conf。
Step1: 创建一个名为 ingress.yaml 的文件
Step2: 复制以下内容到文件并保存
使用你的域名替换 test.apps.example.info。此处,我们假设你已经有*.apps.example.info 格式的通配符域名。
Step3: 描述已创建的 ingress 对象,它用于检查配置
现在,如果你尝试访问 test.apps.example.info 域(用你的域名代替它),你应该能够访问我们部署的 app。
原文链接:
https://devopscube.com/kubernetes-ingress-tutorial/
https://devopscube.com/setup-ingress-kubernetes-nginx-controller/
评论