当前位置: 首页 > news >正文

K8S--Ingress的作用

原文网址:K8S--Ingress的作用-CSDN博客

简介

本文介绍K8S的Ingress的作用。

-----------------------------------------------------------------------------------------------
分享Java真实高频面试题,吊打面试官: Java后端真实面试题大全 - 自学精灵
分享靠谱的Java高级实战,包含:高并发、架构、全局处理等:JavaWeb高级实战 - 自学精灵
-----------------------------------------------------------------------------------------------

什么是Ingress?

Kubernetes 暴露服务的有三种方式:LoadBlancer Service、NodePort Service、Ingress。官网的定义:管理对外服务到集群内服务之间规则的集合。即:将请求转发到服务,实现服务暴露。

Ingress的功能类似Nginx:把集群内 Service 配置成外网能够访问的 URL、流量负载均衡、提供基于域名访问的虚拟主机等。

Ingress由两部分组成:

  1. Ingress:配置服务的路由规则。
  2. Ingress Controller:将Ingress转化成Nginx的配置文件并使之生效。
    1. 常用的是基于nginx服务的Ingress Controller。

可以将Ingress比作一张地图,而Ingress Controller则是导航系统,它根据地图上的规则将请求导航到正确的位置。

Ingress在调用流程的位置

为什么用Ingress?

K8S集群内服务想要暴露出去面临着几个问题:

Pod 漂移问题

K8S在任意副本(Pod)挂掉时自动启动一个新的。这个新节点可能在任何节点上,Pod IP 会变。如何把动态的 Pod IP 暴露出去?

答案:使用K8S的Service,以标签的形式选定带有指定标签的Pod,并监控和自动负载它们的 Pod IP,只向外暴露 Service IP即可。

一般使用NodePort来暴露:创建NodePort类型的Service时,K8S会自动在集群的每个节点上开一个端口,将请求转发到内部 Service IP 上,如下图所示:

端口管理问题

用 NodePort 方式暴露服务面临的问题是:如果服务数量很多,NodePort 在每个节点上开启的端口会很多。

思考:能否使用Nginx只监听一个端口,比如80,然后按照域名向后转发?

这思路很好,可以使用 DaemonSet 在每个node上监听80,然后写规则。Nginx 外面绑定了宿主机 80 端口(就像 NodePort),本身又在集群内,那么将请求转发到相应Service IP就行了,如下图所示:

域名分配及动态更新问题

按上面的思路,用 Nginx 似乎已经解决了问题,但是有一个很大缺陷:每次有新服务加入怎么改 Nginx 配置?总不能手动改吧?

Ingress就是为了解决这个问题的。原来要改 Nginx 配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,你可以用 yml 创建,不用每次都去改 Nginx 了,直接改yml,然后创建/更新就行了。

Ingress Controoler 动态的去感知集群中 Ingress 规则变化,生成一段 Nginx 配置,写到 Nginx Pod 里,最后 reload 一下,工作流程如下图:

在实际应用中,最新版本 Kubernetes 已经将 Nginx 与 Ingress Controller 合并为一个组件,所以 Nginx 无需单独部署,只需要部署 Ingress Controller 即可。

相关文章:

  • 结构化数据,非结构化数据,半结构化数据(AI问答)
  • 数据通信基础
  • gcd得最大公约数,辗转相除法理解
  • Dockerfile镜像实战
  • ReactHooks:渲染与useState
  • openssl3.2 - 在VS2019下源码调试openssl.exe
  • 如何通过Burp Suite专业版构建CSRF PoC
  • 【纯CSS特效源码】(二)精美的立体字
  • JavaScript基础05
  • css 怎么绘制一个带圆角的渐变色的边框
  • UGUI Image图像控件替换图片
  • Java 8 中的 Stream 轻松遍历树形结构
  • 视频转为序列图的软件,让视频批量转为序列图
  • Object.keys()
  • Go语言学习记录——用正则表达式(regexp包)来校验参数
  • ES6指北【2】—— 箭头函数
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ES6 ...操作符
  • flutter的key在widget list的作用以及必要性
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue 重置组件到初始状态
  • 翻译:Hystrix - How To Use
  • 如何优雅地使用 Sublime Text
  • 双管齐下,VMware的容器新战略
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 消息队列系列二(IOT中消息队列的应用)
  • 应用生命周期终极 DevOps 工具包
  • 用Python写一份独特的元宵节祝福
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #android不同版本废弃api,新api。
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $GOPATH/go.mod exists but should not goland
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (5)STL算法之复制
  • (C++)八皇后问题
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)RocketMQ初步认识
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (译)2019年前端性能优化清单 — 下篇
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)Linux 多线程条件变量同步
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • @Autowired多个相同类型bean装配问题
  • @Autowired自动装配
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [2023年]-hadoop面试真题(一)