一.kubernetes集群外部访问的方式

在kubernetes集群中,如果外部的应用需要访问集群内部的服务,可以通过NodePort Service、LoadBalancer Service、Ingress来实现。

  • NodePort Service

    这里实际在集群的每个节点上都暴露一个端口,然后将这个端口映射到某个具体的Service来实现。端口范围限制(0~65535),但是由于安全(kubernetes集群默认关闭防火墙)和易用性方面来看,存在一定的风险。只能适用小规模服务的集群。
  • LoadBalancer Service

    适用于云平台,有局限性。
  • Ingress

    在kubernetes集群中,Service和Pod的IP仅在集群内部访问,如果外部应用需要访问集群内的服务,集群外部请求转发到service在节点上暴露的NodePort上,然后由kube-proxy组件将其转发给相关的Pod。而Ingress就是为集群集群的请求提供路由规则的集合,简单来讲就是提供外部访问集群的入口,将外部的HTTP或HTTPS请求转发到集群内部的Service上。

二.Ingress具体介绍

  • Service是后端真实服务的抽象,一个Service可以负载多个相同的后端服务。
  • Ingress是反向代理规则,用于规定HTTP或HTTPS请求应该被转发到哪个Service上,例如可以根据请求中配置的不同Host和Url路径让请求负载到不同的Service上。
  • Ingress Controller就是一个反向代理程序,它负责解析Ingress的反向代理规则,如果Ingress有增删改的变动,所有的Ingress Controller都会及时更新自己相应的转发规则,当Ingress Controller收到请求后就会根据这些规则将请求转发到对应的Service。



Ingress Controller收到请求,匹配Ingress转发规则,匹配到了就转发到后端Service,而Service可能代表的后端Pod有多个,选出一个转发到那个Pod,最终由那个Pod处理请求。

三.Ingress-nginx组成

1)反向代理负载均衡器:通过接受并按照Ingress定义的规则进行转发,常用的有nginx,haproxy,traefik等。

2)ingress-nginx-controller:监听kube-apiserver,同居用户编写的ingress规则(用户编写的ingress的yaml文件),动态的去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动的。

3)ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个新的yaml文件即可。

四.Ingress-nginx工具原理

1)ingress controller通过和kubernetes的api进行交互,动态的去感知集群中ingress的规则变化。

2)读取ingress的规则,按照自定义的规则(规则就是写的哪个域名对应的哪个service),生成一段nginx的配置。

3)配置写入到nginx-ingress-controller的Pod里面。这个Ingress Controller的Pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到/etc/nginx/nginx.conf文件中。

4)写入配置后,会reload一下使配置生效,以此达到分配和动态更新的问题。

五.Ingress-nginx解决了哪些问题

1)动态配置服务

如果按照传统方式,当新增加一个服务时,我们可能需要在流量入口加一个反向代理指向我们新的服务,而使用ingress,只需要配置好ingress,当服务启动时,会自动注册到ingress当中,不需要额外的操作。

2)减少不必要的端口暴露

kubernetes部署时,默认是关闭防火墙的,服务会以nodeport方式映射出去,这样对于宿主机来说是非常的不安全的,而ingress可以避免这个问题,只需要将ingress自身服务映射出去,就可代理后端所有的服务,则后端服务不需要映射出去。

注意:配置DNS解析时,需要将域名解析到Ingress控制器的IP地址上。可以通过修改域名的DNS记录来实现,将域名解析到Ingress控制器的IP地址上。

参考链接:https://blog.51cto.com/13972012/2469368

kubernetes之Ingress工作原理的更多相关文章

  1. Kubernetes API server工作原理

    作为Kubernetes的使用者,每天用得最多的命令就是kubectl XXX了. kubectl其实就是一个控制台,主要提供的功能: 1. 提供Kubernetes集群管理的REST API接口,包 ...

  2. Docker Kubernetes 介绍 or 工作原理

    Kubernetes 介绍 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容 ...

  3. kubernetes大概的工作原理

    先放一张Kubernetes的架构图: 整体来看,是一个老大,多个干活的这种结构,基本上所有的分布式系统都是这样,但是里面的组件名称就纷繁复杂,下面将一一解析. 1.元数据存储与集群维护 作为一个集群 ...

  4. Ingress-nginx工作原理和实践

    本文记录/分享 目前项目的 K8s 部署结构和请求追踪改造方案 这个图算是一个通用的前后端分离的 k8s 部署结构: Nginx Ingress 负责暴露服务(nginx前端静态资源服务), 根据十二 ...

  5. [Kubernetes] CRI 的设计与工作原理

    咱们来看看,有了 CRI 之后, Kubernetes 的架构图: 我们可以看到, CRI 机制能够发挥作用的核心,在于每一个容器项目现在都可以自己实现一个 CRI shim ,自行对 CRI 请求进 ...

  6. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...

  7. 【转帖】kubernetes 部署ingress

    kubernetes 部署ingress https://www.cnblogs.com/dingbin/p/9754993.html 明天尝试一下 之前的文档里面一直没有提 需要改host文件 我有 ...

  8. kubernetes 部署ingress

    kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理 ...

  9. Spark in action on Kubernetes - Spark Operator的原理解析

    前言 在上篇文章中,向大家介绍了如何使用Spark Operator在kubernetes集群上面提交一个计算作业.今天我们会继续使用上篇文章中搭建的Playground进行调试与解析,帮助大家更深入 ...

  10. Kubernetes之Ingress

    在Service篇里面介绍了像集群外部的客户端公开服务的两种方法,还有另一种方法---创建Ingress资源. 定义Ingress (名词)-进入或进入的行为;进入的权利;进入的手段或地点;入口. 接 ...

随机推荐

  1. 【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”

    [电脑]解决DiskGenius调整分区大小时报错"文件使用的簇被标记为空闲或与其它文件有交叉" 零.报错 在使用DiskGenius对磁盘分区进行调整时,DiskGenius检查 ...

  2. CLI命令行应用

    前言 针对golang这门高级语言,主要想了解它的语言特性还有服务器建站还有微服务搭建方面的用途,以下都可以算是使用记录. 一.命令行应用的标准库实现 很多语言都有针对命令行参数的功能包,比如pyth ...

  3. Spring的三级缓存详解

    目录 1.什么是三级缓存 2.三级缓存详解 Bean实例化前 属性赋值/注入前 初始化后 总结 3.怎么解决的循环依赖 4.不用三级缓存不行吗 5.总结 一.什么是三级缓存 就是在Bean生成流程中保 ...

  4. eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法

    特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...

  5. easy-query隐式Group革命性OLAP优化JAVA下最强查询ORM没有之一子查询合并

    easy-query JAVA下最强查询ORM没有之一的任意子查询合并革命性OLAP优化 前言 对于大部分OLTP而言的查询市面上常见的orm已经能很好的处理,只要建立好对象关系那么就可以非常简单的实 ...

  6. 解决 Dify 部署中 Podman WSL 容器文件权限问题

    解决 Dify 部署中 Podman WSL 容器文件权限问题 在使用 Podman 进行 Dify 部署时,遇到了一个关键问题:启动服务时出现 initdb: error: could not ch ...

  7. 操作系统综合题之“采用实时调度,可调度的限制条件和可调度的最大X值是是多少ms的CPU时间”

    一.问题:单处理器情况下,m个周期性实时进程,若进程i处理时间为Ci,周期时间为Pi < (1 ≤ i ≤ m) 1.要使系统可调度的限制条件什么? 2.设置一个实时系统使用了4个周期事件,其周 ...

  8. python简单的time ticker

    在某些时候,我们需要精确的启动一个func,如果用time.sleep简单的轮询,会因为执行的任务阻塞,或者其他原因导致无法精确的定时执行. 例如在采集某些数据的时候,需要精确的每60秒采集一次,如果 ...

  9. NewtonJsonConvert的比较好搭配使用

    (1)与关键字冲突,解决办法加@ var a = new { @class=1, }; var d = JsonConvert.SerializeObject(a); Console.WriteLin ...

  10. WPF的Image控件图片不能显示出来

    在Visual studio中,将图片的属性的"生成操作"从"无"改为"资源". 最终解决问题: