您当前所在位置: > 爆料站 > 有深度

以图形化的方式简单介绍KubernetesIngress

时间:2020-02-07 10:39:17  来源:  作者:网络

原标题:以图形化的方式简单介绍Kubernetes Ingress

系列文章第一篇:《 以图形化的方式简单介绍Kubernetes Service 》

内容摘要

Kubernetes Ingress 不是一个 Kubernetes Service,简单地说,它只是一个将请求重定向到集群内部服务的 Nginx Pod,只不过这个 Pod 是通过 Kubernetes Service 进行访问,通常使用的是 LoadBalancer 类型的 Service。

本文有必要读吗?

首先,本文将向你提供一个清晰且简单的概述,用以说明神秘的 Kubernetes Ingress 背后到底是什么,这样能够让你更容易理解你正在实施的内容。

然后,本文将向你展示一些使用样例的配置示例。

为什么使用 Ingress?

使用 Ingress 可以将你集群的内部服务对外暴露,它能够帮你节省内部宝贵的静态 IP,因为你不需要声明多个 LoadBalancer 类型的 service。而且,如我们所见,它还能够进行多样化的配置以及更加简易的设置方式。

本文将要讲述什么?

  • 首先,我们将简短阐述 HTTP 服务器(尤其是 Nginx)是如何工作以及它们可以做什么。
  • 然后,我们将展示在不使用 Kubernetes Ingress 资源的情况下,如何手动搭建 Ingress。
  • 最后,我们将看到 Kubernetes Ingress 只是一个预配置的 Nginx 服务器。

听起来有点迷惑?那就继续往下看吧。

简要了解一个简单的 HTTP 服务器的世界

让我们回到容器、Kubernetes以及现代云计算世界之前的那个时代。跟我一起,简单回顾一下。

一个 HTTP 服务器(如 Nginx)能做什么?

如下图所示,它能够接收一个基于 HTTP 协议访问某个特定文件路径的请求,检查文件系统中该文件路径是否存在,如果存在就将其返回。

本例中 Nginx 的配置可能如下:

  1. location / folder {
  2. root / var / www /;
  3. index index . html ;
  4. }

一个 HTTP 服务器(如 Nginx)还能做什么?

如下图所示,它能够接收一个访问特定文件路径的请求,然后将这个请求重定向到另一个服务器上(这里它扮演着代理角色)并且将来自于这个服务器的请求响应内容返回给客户端。客户端不需要做什么改变,如果请求的文件存在,它就能收到想要的结果。

我们不会深入解释这个过程,本例中 Nginx 作为一个代理服务器使用的配置可能如下:

  1. location / folder {
  2. proxy_pass http : //second-nginx-server:8000;
  3. }

这个配置表示 Nginx 能够扮演一个代理角色,对外提供文件系统服务,重定向请求到其他服务器上并返回对应的响应内容。

一个简单的 Kubernetes 示例

使用 ClusterIP 类型的 service

我们假定现在你已经对 Kubernetes Service 有所了解(可以参考另一篇文章 Kubernetes Services )。如下图所示,我们有两个 worker 节点,这里先忽略 master 节点。我们有两个服务: service-nginxservice-python,它们指向了不同的 Pod。Service 不会调度到任何节点上,让我们先简单地认为它们“存在于集群的任何地方”。

目前你可以看到在我们集群内部,我们能够通过 service 访问 Nginx pod 和 Python pod。如果我们想在集群外部也能够访问它们,我们就需要将service 转换为 LoadBalancer 类型。

使用 LoadBalancer 类型的 service

如下图,你可以看到我们将 ClusterIP 类型的 service 转成了 LoadBalancer 类型。我们的 Kubernetes 集群部署在能够支持 LoadBalancer 类型 Service 的云服务提供商上(例如 Gcloud、AWS、DigitalOcean 等),可以看到提供商创建了 2 个外部的负载均衡器,负载均衡器将请求转发到了集群节点的外部 IP 地址,进而转发到了内部服务上。

从上图可以看出,两个负载均衡器都有自己的 IP 地址。如果我们将请求发往地址为 22.33.44.55 的负载均衡器上,请求被转发到集群内的 service-nginx。如果我们将请求发往地址为 77.66.55.44 的负载均衡器上,请求被转发到集群内的 service-python

这种运行方式很棒!但 IP 地址有限且负载均衡器的价格取决于云服务提供商。设想下我们集群内部不止 2 个服务,而是拥有很多内部服务。如果我们都想构建 LoadBalancer 方式,那成本将迅速上涨。

有更好的解决方案能够让我们只使用一个负载均衡器(只使用一个 IP 地址),仍然可以访问我们内部的服务吗?在继续探索之前,我们先手动实现一种方式(非 Kubernetes 方式)。

手动配置一个 Nginx 代理服务

如之前所述,Nginx 可以作为一个代理服务。如下图所示,集群内有一个新的 service 叫做 service-nginx-proxy,它作为我们集群内唯一的 LoadBalancer 类型 service。在集群内 service-nginx-proxy也会指向一个或者多个 Nginx pod 终端,不过在下图中我们没有展示出来。其他两个 service 由之前的类型转为了简单的 ClusterIP 类型。

从图中我们能够看到,通过一个 LoadBalancer(11.22.33.44) 访问不同的 http url 返回的请求内容是不同的,因为如图中黄线所示,使用不同 url 访问相同的地址,请求重定向的服务是不同的。

service-nginx-proxy这个服务使用 Nginx 代理配置了传入路径与重定向目标的关系,依据请求 url 决定了请求应该重定向到哪个服务。

在这个示例中(如上图所示)我们有两个选项:红色线条和蓝色线条。红色线条重定向到了 service-nginx,而蓝色线条重定向到了 service-python。Nginx 配置如下所示:

  1. # very simplified Nginx config example
  2. location / folder {
  3. proxy_pass http : //service-nginx:3001;
  4. }
  5. location / other {
  6. proxy_pass http : //service-python:3002;
  7. }

现在我们需要手动配置 service-nginx-proxy服务,构建合适的 Nginx 配置文件指向我们 ClusterIP 类型的 service。这是一种能做到的、可行的且通用的解决方案。

基于这种通用的解决方案,Kubernetes Ingress 就是用来让构建配置文件的过程变得更简单且更加可控。现在你应该能理解上述示例的好处了,接下来我们继续讨论 Kubernetes Ingress。

使用 Kubernetes Ingress

对比下图和上述图例,其实没什么区别。我们只是使用了一个事先配置好的 Nginx(Kubernetes Ingress) 服务,不过所有代理配置已经完成,减少了很多手动配置的工作。

以上就是理解 Kubernetes Ingress 的所有内容,接下来我们介绍一些使用示例。

安装 Kubernetes Ingress Controller

Kubernetes Ingress 是 Kubernetes 附加的资源,使用以下命令进行安装:

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

使用下面的命令,可以看到 ingress-nginx 命名空间下安装的所有 k8s 资源:

  1. kubectl get svc , pod -- namespace = ingress - nginx

如上图所示,可以看到一个具备外部 IP 地址的普通 LoadBalancer service 以及一个附属的 pod。你可以使用 kubectlexec 命令进入 pod 内部,看到它包含了一个事先配置好的 Nginx 服务。

在 nginx.conf 文件中你可以看到不同代理配置以及其他一些相关配置项。

Kubernetes Ingress 配置示例

上述示例使用的 Ingress yaml 文件如下所示:

  1. # just example, not tested
  2. apiVersion : networking . k8s . io / v1beta1
  3. kind : Ingress
  4. annotations :
  5. kubernetes . io / ingress . class : nginx
  6. namespace : default
  7. name : test - ingress
  8. rules :
  9. - http :
  10. paths :
  11. - path : / folder
  12. backend :
  13. serviceName : service - nginx
  14. servicePort : 3001
  15. - http :
  16. paths :
  17. - path : / other
  18. backend :
  19. serviceName : service - python
  20. servicePort : 3002

我们可以通过命令 kubectl create-f ingress.yaml 来构建这个 Ingress。执行完命令之后,yaml 文件就会转变为之前安装的 Ingress Controller 服务中的 Nginx 配置。

不同命令空间下 Kubernetes Ingress 示例

现在如果你的集群有一个内部服务,它和 Ingress 在不同的命令空间,该如何进行重定向呢?因为一个 Ingress 资源是命令空间化的, 在 Ingress 配置中你只能重定向到相同命令空间下的服务

如果你定义了多个 Ingress yaml 配置,那么所有的配置会集中写入 Ingress Controller 使用的 Nginx 配置文件中。意味着: 所有配置都使用相同的 LoadBalancer IP地址。

因此,为不同命名空间下的内部服务创建不同命令空间下的 Ingress 资源即可。例如 service-nginx在 default 命名空间下:

  1. # just example, not tested
  2. apiVersion : networking . k8s . io / v1beta1
  3. kind : Ingress
  4. annotations :
  5. kubernetes . io / ingress . class : nginx
  6. ** namespace : default **
  7. name : ingress1
  8. rules :
  9. - http :
  10. paths :
  11. - path : / folder
  12. backend :
  13. serviceName : service - nginx
  14. servicePort : 3001

service-python在 namespace2 命令空间下:

  1. # just example, not tested
  2. apiVersion : networking . k8s . io / v1beta1
  3. kind : Ingress
  4. annotations :
  5. kubernetes . io / ingress . class : nginx
  6. namespace : namespace2
  7. name : ingress2
  8. rules :
  9. - http :
  10. paths :
  11. - path : / other
  12. backend :
  13. serviceName : service - python
  14. servicePort : 3002

如何微调 Ingress Nginx 的配置?

你可以通过 Kubernetes Ingress 资源定义中的 annotations 属性来实现。如下所示,你可以配置不同内容就像直接在配置 Nginx 一样。

  1. kind : Ingress
  2. name : ingress
  3. annotations :
  4. kubernetes . io / ingress . class : nginx
  5. nginx . ingress . kubernetes . io / proxy - connect - timeout : '30'
  6. nginx . ingress . kubernetes . io / proxy - send - timeout : '500'
  7. nginx . ingress . kubernetes . io / proxy - read - timeout : '500'
  8. nginx . ingress . kubernetes . io / send - timeout : "500"
  9. nginx . ingress . kubernetes . io / enable - cors : "true"
  10. nginx . ingress . kubernetes . io / cors - allow - methods : "*"
  11. nginx . ingress . kubernetes . io / cors - allow - origin : "*"
  12. ...

你甚至可以做一个特殊规则配置:

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

这些 annotations 设置会被转换为 Nginx 配置。你可以通过手动连接(kubectl exec)到 ingress Nginx pod 内检查下这些配置项。

还有一些不同的配置示例可以参考:

  • https://github.com/kubernetes/ingress-nginx/tree/master/docs/user-guide/nginx-configuration
  • https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#lua-resty-waf

检查 Ingress 或者 Nginx 的日志

找出问题或者错误可以通过查看 Ingress 的日志,如下所示:

  1. kubectl logs - n ingress - nginx ingress - nginx - controller - 6cfd5b6544 - k2r4n

使用 curl 命令测试你的配置

如果你想测试 Ingress 或者 Nginx 的配置规则是否生效,使用 curl-v yourhost.com 是一个不错的选择,用它来取代浏览器访问,避免缓存问题。

重定向或者 Ingress Rules的不同设置方式

在本文中介绍的示例都是通过路径来重定向到不同的服务,例如 /folder 或者 /other/directory。这是所谓的“路径列表”。

另一种方式是可以根据请求的来源地址(例如 api.myurl.com 和 website.myurl.com) 区分不同请求,进而重定向到不同的内部 ClusterIP service 上。配置如下所示:

  1. apiVersion : networking . k8s . io / v1beta1
  2. kind : Ingress
  3. name : simple - fanout - example
  4. rules :
  5. - host : api . myurl . com
  6. http :
  7. paths :
  8. - path : / foo
  9. backend :
  10. serviceName : service1
  11. servicePort : 4200
  12. - path : / bar
  13. backend :
  14. serviceName : service2
  15. servicePort : 8080
  16. - host : website . myurl . com
  17. http :
  18. paths :
  19. - path : /
  20. backend :
  21. serviceName : service3
  22. servicePort : 3333

从上可以看出,针对特定的地址(host)以及不同的 http 路径可以重定向到不同的内部服务。

SSL 或者 HTTPS 的配置方式

SSL,你应该听说过吧?你可能想让你的 web 服务通过 https 安全访问。Kubernetes Ingress 提供了更加简单的“TLS Termination”机制,也就是说它能够处理所有 SSL 通信,解密或者终止 SSL 请求并将解密后的内容发往集群内部服务。

如果你集群内多个内部服务使用的是相同的 SSL 证书,这种机制是很适用的,因为你只需要在你的 Ingress 上配置一次即可,而不需要修改所有内部服务。Ingress 能通过一个配置好的 TLS Kubernetes Secret 来使用 SSL 证书,如下所示:

  1. apiVersion : networking . k8s . io / v1beta1
  2. kind : Ingress
  3. name : tls - example - ingress
  4. tls :
  5. - hosts :
  6. - sslexample . foo . com
  7. secretName : testsecret - tls
  8. rules :
  9. - host : sslexample . foo . com
  10. http :
  11. paths :
  12. - path : /
  13. backend :
  14. serviceName : service1
  15. servicePort : 80

需要注意的是,如果在不同的命令空间中有多个不同的 Ingress 资源,你要确保你的 TLS secret 同样能够在这些命名空间中被使用。

总结

本文主要是想为你提供有关神秘的 Kubernetes Ingress 背后实现原理的概述。简单来说,它无非就是一种轻松配置 Nginx 服务器的方法,该服务器会将请求重定向到集群内的其他内部服务。

通过 Ingress,你可以节省宝贵的静态 IP 地址以及 LoadBalancer 资源。但是,你不应该将 Kubernetes Ingress 视为 Kubernetes 的一种 Service 类型。Ingress 本身不是 Kubernetes 的一种 Service 类型,它只是使用了一个 Service,主要是 LoadBalancer。

需要注意的是,还有其他 Kubernetes Ingress 类型并非基于 Nginx 服务实现,不过它们只是使用了不同的代理技术。

原文链接:https://medium.com/swlh/kubernetes-services-simply-visually-explained-2d84e58d70e5 游戏网

相关下载

玩家评论

word中怎么打印图形

word中怎么打印图形?我们在word里插入图形,当打印时会发现打印不出来,这该怎么办呢?下面小编就来教大家如何打印word中的图形。步骤分解1如下图,当我们在word中插入一个图形,打印详情>>

阅读: 9
日期: 2019-06-24
把Office文档打印成为TIFF图形文件

Office文档可以通过 Microsoft Office Document Image Writer 打印驱动程序将文档另存为 TIFF 文件。Microsoft Office Document Image Writer 打印驱动程序是 Microsoft Of详情>>

阅读: 15
日期: 2019-06-24
WPS的office图形怎么组合

Wps的office的图形怎么组合,即多个图形挪动时一起拖动,多个图形变化时一起等比例变化,下面给大家介绍一下。攻略对象电脑Wps软件步骤分解1第一:在wps的office软件中输入需要的图详情>>

阅读: 11
日期: 2019-06-22
PPT设置图形大小的方法

PPT在我们的职场中经常使用,图形更是PPT中常用到的元素,有时因为展示需要,需将图形大小进行调整。然后有时候由于页面内容多少的原因,导致有些调整方法并不一定好用,小编在这里将详情>>

阅读: 6
日期: 2019-06-17
WPS office图形互相组合教程

这里讲述一下,怎样在WPS把两个图形组合在一块!!攻略对象WPS办公软件;电脑。步骤分解1打开WPS;2插入要进行操作的图形;如下图:3比如:想把方块组合到太阳形状的图形上;首先选中方块图形详情>>

阅读: 5
日期: 2019-06-17
国内最早的图形页游活了17年,三天不充钱就不能接着玩?

0.gb-final-mod详情>>

阅读: 1
日期: 2019-04-16
COD11高级战争图形设置说明 如何提高游戏帧数

这儿我们可以通过修改游戏中的画面设置来简单提升一下...》COD11全十五章通关视频 》COD11打不开卡顿解决办法... 详情>>

阅读: 1
日期: 2019-03-24
微信欢乐烧脑游戏第18关怎么过 用图形盖房子

  微信欢乐烧脑挑战第18关是用图形盖房子。难度比较简单,那么微信欢乐烧脑挑战第18关怎么过呢?下面将给大家带微信欢乐烧脑挑战第18关答案。  第18关  用云遮住题目详情>>

阅读: 3
日期: 2018-11-13
史上最囧坑爹游戏第15关怎么过 点击红色图形三次

微信史上最囧坑爹游戏第15关是点击红色图形三次。难度比较简单,那么微信史上最囧坑爹游戏第10关怎么过呢?下面将给大家带微信史上最囧坑爹游戏第15关答案。第15关注意在点详情>>

阅读: 7
日期: 2018-11-13
史上最囧坑爹游戏第45关怎么过 3步操作内用图形盖房子

  微信史上最囧坑爹游戏第45关是3步操作内用图形盖房子。难度比较简单,那么微信史上最囧坑爹游戏第45关怎么过呢?下面将给大家带微信史上最囧坑爹游戏第45关答案。  第详情>>

阅读: 3
日期: 2018-11-12
【oO】用zoom命令缩放图形,其操作结果是 A.图形的绝对大小和视觉的大小均无改变 B.图形的绝对大小和

小编为您搜罗的答案:选D小编为您搜罗的答案:选D.不改变图形的绝对大小.只改变视觉上的比例详情>>

阅读: 11
日期: 2018-08-28
关于图形创意的几点认知!

文/于萌萌杨和维图形是在平面构成要素中形成广告性格及提高视觉注意力的重要素材,能够左右广告的传播效果。图形作为视觉传达设计的信息交流中心,是所有视觉艺术得以体现的重要组成部分。图形的创意理念以及详情>>

阅读: 3
日期: 2018-08-23
CAD中怎样让所画的图形成为一体

小编为您搜罗的答案:哪你就给它编成一个组,只要是你点中这个组的其中的一个图元,它就会自动的全选中这个组的所有图元了。你在CAD输入行,输入快捷命令G,回车。编辑组的对话框就出来了。快捷图标的话我忘了是详情>>

阅读: 0
日期: 2018-08-22
AutoCAD图形文件保存到Word、Excel中

AutoCAD图形文件保存到Word、Excel中有时候需要把DWG文件放到Word或者Excel中保存,改如何处理呢?1、更改CAD系统变量WMFBKGND值为OFF,使CAD背景为透明,如图1;详情>>

阅读: 16
日期: 2018-08-21
android程序中如何改变图形大小?

小编为您搜罗的答案:不好意思,你的意思没有表达清楚!如果是在程序中的话,建议使用dp、sp或者直接进行xml文件视图拖动即可。详情>>

阅读: 2
日期: 2018-07-25
史上最囧挑战第二季第28关攻略 三步操作内用图形盖房子

  三步操作内用图形盖房子。这一关的难度不是在于复杂的文字陷阱,也不是在于难以完成的问题。而是在于脑洞大不大。下面小编将给大家带来史上最囧挑战第二季第28关攻略。  第详情>>

阅读: 10
日期: 2018-07-01
我的世界0.14.0图形密码门怎么做图形密码门制作视频讲解说明

今天Game234和大家讲解我的世界0.14.0图形密码门怎么做图形密码门制作视频讲解说明今天搞趣网小编为大家带来我的世界0.14.0图形密码门怎么做,下详情>>

阅读: 2
日期: 2018-06-25
《粘粘世界》第四章图文攻略图形处理系统 详解怎么玩

点评:这一关继续没有什么难度,看看视频,大家耐心的操作就好了。.x0hsibeycvxqlprmw2dbg{display:none;}详情>>

阅读: 2
日期: 2018-06-16
黑暗之魂地图平面图形

以下是黑暗之魂游戏的平面地图,有点尴尬的是文字大部分是日文,不过这些不会影响到的,基本上都能看个半懂。如果出现图片看不清的情况,请将图片另存到本地进行查详情>>

阅读: 5
日期: 2018-06-07
最囧烧脑游戏3第9关攻略 三步操作内用图形盖房子

  最囧烧脑游戏3第9关怎么过?三步操作内用图形盖房子,小编将给大家带来最囧烧脑游戏3第9关攻略。最囧烧脑游戏3攻略相关资料12345678910详情>>

阅读: 4
日期: 2018-05-28
剑网3图形设备被移除887a0007怎么办 图形设备被移除解决方法

剑网3图形设备被移除887a00详情>>

阅读: 60
日期: 2018-04-25
最囧烧脑游戏第3关怎么过 3步用图形盖房子图文攻略

最囧烧脑游戏第3关怎么过?下面带来的是《最囧烧脑游戏》第3关通关攻略,还过不了的小伙伴一起来看看吧。第3关:把房子图片用手指拖动到文字题目“房子”上,即可过关。传送门:继续翻看详情>>

阅读: 7
日期: 2018-04-03
有种你就来第54关怎么过 点绿色黄色图形图文攻略

有种你就来第54关怎么过,点绿色黄色图形图文攻略。感兴趣的小伙伴就来看看吧!点黄色图形要注意,点到第四下时按钮会变成白色,要稍微等一下,等变回黄色时在继续点,即可过关:点击查看下一关热门推荐:有种你详情>>

阅读: 7
日期: 2018-04-03
《粘粘世界》第四章图文图形处理系统 详解怎么玩

点评:这一关继续没有什么难度,看看视频,大家耐心的操作就好了。.xxmkwla8jkacn92vbbrai{display:none;}详情>>

阅读: 1
日期: 2018-03-31
精彩推荐