Kubernetes Ingress 控制器讲解

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Kubernetes Ingress 控制器讲解

Kubernetes Ingress 控制器讲解

网络异常,图片无法展示
|

Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到外部,比如 ingress-nginx,本质上来说它只是一个 Nginx Pod,然后将请求重定向到其他内部(ClusterIP)服务去,这个 Pod 本身也是通过 Kubernetes 服务暴露出去,最常见的方式是通过 LoadBalancer 来实现的。同样本文我们希望用一个简单清晰的概述,让你来了解 Kubernetes Ingress 背后的东西,让你更容易理解使用的 Ingress。

我们可以使用 Ingress 来使内部服务暴露到集群外部去,它为你节省了宝贵的静态 IP,因为你不需要声明多个 LoadBalancer 服务了,此次,它还可以进行更多的额外配置。下面我们通过一个简单的示例来对 Ingress 进行一些说明吧。

简单 HTTP server

首先,我们先回到容器、Kubernetes 之前的时代。

之前我们更多会使用一个(Nginx)HTTP server 来托管我们的服务,它可以通过 HTTP 协议接收到一个特定文件路径的请求,然后在文件系统中检查这个文件路径,如果存在则就返回即可。

网络异常,图片无法展示
|

例如,在 Nginx 中,我们可以通过下面的配置来实现这个功能。

location /folder {    root /var/www/;    index index.html;}

除了上面提到的功能之外,我们可以当 HTTP server 接收到请求后,将该请求重定向到另一个服务器(意味着它作为代理)去,然后将该服务器的响应重定向到客户端去。对于客户端来说,什么都没有改变,接收到的结果仍然还是请求的文件(如果存在的话)。

网络异常,图片无法展示
|

同样如果在 Nginx 中,重定向可以配置成下面的样子:

location /folder {    proxy_pass http://second-nginx-server:8000;}

这意味着 Nginx 可以从文件系统中提供文件,或者通过代理将响应重定向到其他服务器并返回它们的响应。

简单的 Kubernetes 示例

使用 ClusterIP 服务

在 Kubernetes 中部署应用后,我们应该先去了解 Kubernetes Service 服务(前文中讲解的)。比如我们有两个 worker 节点,有两个服务 service-nginxservice-python,它们指向不同的 pods。这两

个服务没有被调度到任何特定的节点上,也就是在任何节点上都有可能,如下图所示:

网络异常,图片无法展示
|

在集群内部我们可以通过他们的 Service 服务来请求到 Nginx pods 和 Python pods 上去,现在我们想让这些服务也能从集群外部进行访问,按照前文提到的我们就需要将这些服务转换为 LoadBalancer 服务。

使用 LoadBalancer 服务

当然使用 LoadBalancer 服务的前提是我们的 Kubernetes 集群的托管服务商要能支持才行,如果支持我们可以将上面的 ClusterIP 服务转换为 LoadBalancer 服务,可以创建两个外部负载均衡器,将请求重定向到我们的节点 IP,然后重定向到内部的 ClusterIP 服务。

网络异常,图片无法展示
|

我们可以看到两个 LoadBalancers 都有自己的 IP,如果我们向 LoadBalancer 22.33.44.55 发送请求,它请被重定向到我们的内部的 service-nginx 服务去。如果发送请求到 77.66.55.44,它将被重定向到我们的内部的 service-python 服务。

这个确实很方便,但是要知道 IP 地址是比较稀有的,而且价格可不便宜。想象下我们 Kubernetes 集群中不只是两个服务,有很多的话,我们为这些服务创建 LoadBalancers 成本是不是就成倍增加了。

那么是否有另一种解决方案可以让我们只使用一个 LoadBalancer 就可以把请求转发给我们的内部服务呢?我们先通过手动(非 Kubernetes)的方式来探讨下这个问题。

手动配置 Nginx 代理服务

我们知道 Nginx 可以作为一个代理使用,所以我们可以很容易想到运行一个 Nginx 来代理我们的服务。如下图所示,我们新增了一个名为 service-nginx-proxy 的新服务,它实际上是我们唯一的一个 LoadBalancer 服务。service-nginx-proxy 仍然会指向一个或多个 Nginx-pod-endpoints(为了简单没有在图上标识),之前的另外两个服务转换为简单的 ClusterIP 服务了。

网络异常,图片无法展示
|

可以看到我们只分配了一个 IP 地址为 11.22.33.44 的负载均衡器,对于不同的 http 请求路径我们用黄色来进行标记,他们的目标是一致的,只是包含的不同的请求 URL。

service-nginx-proxy 服务会根据请求的 URL 来决定他们应该将请求重定向到哪个服务去。

在上图中我们有两个背后的服务,分别用红色和蓝色进行了标记,红色会重定向到 service-nginx 服务,蓝色重定向到 service-python 服务。对应的 Nginx 代理配置如下所示:

location /folder {    proxy_pass http://service-nginx:3001;}location /other {    proxy_pass http://service-python:3002;}

只是目前我们需要去手动配置 service-nginx-proxy 服务,比如新增了一个请求路径需要路由到其他服务去,我们就需要去重新配置 Nginx 的配置让其生效,但是这个确实是一个可行的解决方案,只是有点麻烦而已。

而 Kubernetes Ingress 就是为了让我们的配置更加容易、更加智能、更容易管理出现的,所以在 Kubernetes 集群中我们会用 Ingress 来代替上面的手动配置的方式将服务暴露到集群外去。

使用 Kubernetes Ingress

现在我们将上面手动配置代理的方式转换为 Kubernetes Ingress 的方式,如下图所示,我们只是使用了一个预先配置好的 Nginx(Ingress),它已经为我们做了所有的代理重定向工作,这为我们节省了大量的手动配置工作了。

网络异常,图片无法展示
|

这其实就已经说明了 Kubernetes Ingress 是什么,下面让我们来看看一些配置实例吧。

安装 Ingress 控制器

Ingress 只是 Kubernetes 的一种资源对象而已,在这个资源中我们可以去配置我们的服务路由规则,但是要真正去实现识别这个 Ingress 并提供代理路由功能,还需要安装一个对应的控制器才能实现。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml

使用下面的命令,可以看到安装在命名空间 ingress-nginx 中的 k8s 资源。

网络异常,图片无法展示
|

我们可以看到一个正常的 LoadBalancer 服务,有一个外部 IP 和一个所属的 pod,我们可以使用命令 kubectl exec 进入该 pod,里面包含一个预配置的 Nginx 服务器。

网络异常,图片无法展示
|

其中的 nginx.conf 文件就包含各种代理重定向设置和其他相关配置。

Ingress 配置示例

我们所使用的 Ingress yaml 例子可以是这样的。

# just example, not testedapiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:  annotations:    kubernetes.io/ingress.class: nginx  namespace: default  name: test-ingressspec:  rules:  - http:      paths:      - path: /folder        backend:          serviceName: service-nginx          servicePort: 3001  - http:      paths:      - path: /other        backend:          serviceName: service-python          servicePort: 3002

和其他资源对象一样,通过 kubectl create -f ingress.yaml 来创建这个资源对象即可,创建完成后这个 Ingress 对象会被上面安装的 Ingress 控制器转换为对应的 Nginx 配置。

如果你的一个内部服务,即 Ingress 应该重定向到的服务,是在不同的命名空间里,怎么办?因为我们定义的 Ingress 资源是命名空间级别的。在 Ingress 配置中,只能重定向到同一命名空间的服务

如果你定义了多个 Ingress yaml 配置,那么这些配置会被一个单一的 Ingress 控制器合并成一个 Nginx 配置。也就是说所有的人都在使用同一个 LoadBalancer IP。

配置 Ingress Nginx

有时候我们需要对 Ingress Nginx 进行一些微调配置,我们可以通过 Ingress 资源对象中的 annotations 注解来实现,比如我们可以配置各种平时直接在 Nginx 中的配置选项。

kind: Ingressmetadata:  name: ingress  annotations:      kubernetes.io/ingress.class: nginx      nginx.ingress.kubernetes.io/proxy-connect-timeout: '30'      nginx.ingress.kubernetes.io/proxy-send-timeout: '500'      nginx.ingress.kubernetes.io/proxy-read-timeout: '500'      nginx.ingress.kubernetes.io/send-timeout: "500"      nginx.ingress.kubernetes.io/enable-cors: "true"      nginx.ingress.kubernetes.io/cors-allow-methods: "*"      nginx.ingress.kubernetes.io/cors-allow-origin: "*"...

此外也可以做更细粒度的规则配置,如下所示:

nginx.ingress.kubernetes.io/configuration-snippet: |  if ($host = 'www.qikqiak.com' ) {    rewrite ^ https://qikqiak.com$request_uri permanent;  }

这些注释都将被转换成 Nginx 配置,你可以通过手动连接(kubectl exec)到 nginx pod 中检查这些配置。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
运维 Kubernetes 监控
Kubernetes详解(十九)——Kubernetes Pod控制器
Kubernetes详解(十九)——Kubernetes Pod控制器
96 3
|
28天前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
|
6月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
958 1
|
2月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
135 4
|
24天前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
3月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
111 6
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
3月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
71 0
|
3月前
|
存储 Kubernetes 网络协议
在K8S中,有哪几种控制器类型?
在K8S中,有哪几种控制器类型?
|
3月前
|
Kubernetes API 网络安全
在K8S中,ingress该如何使用?
在K8S中,ingress该如何使用?