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

k8s中,ingress的实现原理,及其架构。

 

图片来源:自己画的

图片来源:k8s官网

首先,什么是ingress?

是服务还是控制器?

都不精确

ingress是一个api资源

service和deployment也是api资源。

这几个相互协作,组建成一个对外提供服务的架构。

ingress提供的作用是什么?

ingress资源的生成,系统会给ingress资源一个ip地址

这个ip地址下的不同路径,会定位到后端的不同服务

比如ingress资源的ip地址是192.168.1.3

那么客户端访问http://192.168.1.3/websvc_path

ingress资源会把这个请求

转发给后端一个服务

这个服务的名称为websvc  (举例,具体是在ingress资源文件中指定)

这个服务的端口号为6789  (举例,具体是在ingress资源文件中指定)

这个服务真实的提供者

是后端的pod,

这些pod监听着6789端口

这些pod与websvc服务绑定

如何绑定?

是通过服务资源文件中定义的selector标签选择器

而pod资源文件中给pod都加了这个标签

通过这个标签

服务能找到pod

这个叫服务的自动感知功能。

如果某个带有这个标签的pod删除了,

重新在别的节点上以别的ip产生了

拥有同样标签的pod

服务能自动感知到这个新的pod,

服务是如何感知到这个新的pod的?

这个就和服务的程序设计有关,

从开发代码的层面,

其核心是跟网络插件对于ip的管理

和数据库组件对于新pod 的信息的记录有关。

核心也是标签选择器。

-------------------------------------------------------------------------------

服务还有一个功能是负载均衡,

外部对于服务的请求,会分摊到后端的pod

如何实现的?

是通过kube-proxy组件

kube-proxy组件是如何实现负载均衡的?

是调用ipvs内核模块

也就是使用lvs进行负载均衡

------------------------------------------------------------

服务还有一个功能,是自动注册

就是把ip地址注册为域名

服务创建时,自动在内部dns上注册域名

域名格式为:

<服务名称>.<名称空间>.svc.cluster.local

-----------------------------------------------------------

说服务的目的是什么?跟ingress什么关系?

ingress的资源文件中

需要指定

把对于集群的某一个/path的访问

转发给后端的一个服务及其监听的端口

而这个后端的服务

是一个服务名

那么ingress怎么通过这个服务的名称

找到这个服务呢

就跟服务的自动注册有关系,

内部dns上,记录了这个服务的名称和ip的对应关系

所以ingress可以通过名称的方式找到后端的服务

---------------------------------------------------------------------------

ingress需要选择一个控制器,

nginx或者haproxy

一般用nginx的比较多

那么ingress怎么使用这个nginx来

进行负载均衡反向代理这些操作呢

就要通过选择ingressclass来实现

是选nginx?

还是选haproxy?

还是选别的?

要选择nginx

就要在ingress的资源文件中声明

ingressClassName: nginx

----------------------------------------------------------

那么,ingressclass

也就是ingress的类之一

nginx

这个nginx是从哪来的呢?

是在ingressclass的资源文件中

要在.spec的字段下

定义一个

controller: k8s.io/ingress-nginx

------------------------------------------------------------

这个ingressclass中定义了

名称为nginx的ingress的类

使用的控制器是k8s.io/ingress-nginx

这是一个标识符

实际上的控制器是ingress-nginx

------------------------------------------------------------

ingress-nginx这个控制器是以什么形态存在的?

是以pod的形态存在的

pod里面运行着实现控制器功能的容器

容器里面运行着实现控制器功能的进程

容器来自于docker镜像

镜像在部署k8s平台的时候

就需要部署在harbor仓库里

------------------------------------------------------------

ingress-nginx这个控制器的pod从哪来的?

是用deployment无状态控制器来实现的

deployment中定义了

ingress-nginx控制器的pod的容器模版

-------------------------------------------------------------

如何启动ingress-nginx这个控制器?

常用两种方式

1. Helm Chart方式,部署k8s集群的时候,就自动部署好了,也就是集群已经有这个ingress-nginx

2. yaml资源文件方式

ingress-nginx控制器要实现功能,需要有一个资源文件,这个资源文件里面有相关的service资源和deployment资源,也就是一个文件中有多个资源,来实现ingress-nginx控制器。说白了就是,service接收访问ingress-nginx控制器的请求,转发给后端的ingress-nginx的pod,这些pod同时由deployment进行自动部署、维护、扩容、滚动更新。

----------------------------------------------------------------

根本上来说,ingress-nginx控制器来源于

镜像文件,以及用镜像文件启动容器的时候,配置的一些启动参数

还有存放这个容器的pod中,配置的一些可选项

比如initcontainer 初始化容器

startupPorbe

livenessProbe

readinessProbe

这三个容器探针

还有

postStart

preStop

这两个事件处理函数,也叫钩子函数。

以镜像文件、

启动参数、

configMap注入配置文件

还有pod内的一系列要素

构建了ingress-nginx这个控制器的核心

通过service对ingress-nginx进行发布

让ingress在集群内能找到这个控制器

通过deployment对于ingress-nginx进行自动化部署和维护

包括扩容和滚动更新

这样,形成了一个ingress资源对外提供请求分发的功能

ingress自己本身由于有service来管理后端ingress-nginx的pod

所以自身也是负载均衡的

而且有deployment的存在

ingress资源本身的pod也是能自动部署和维护的

比如提供ingress服务的pod出错了

deployment会自动修复,部署新的

如果有必要的话,deployment里面的副本数量

写成2个3个以上,这样能更加保障

ingress资源本身的高可用,而且是自维护

ingress对流量进行分发之后

后端提供计算服务的,

比如web服务

也是可以利用同样的架构

service+pod+deployment的方式

实现负载均衡和高可用

---------------------------------------------------------------

在传统方式中,用到的lvs、nginx、keepalived

负载均衡和高可用技术。

在容器化环境中,

在k8s平台,

以kube-porxy调用ipvs

ingress调用nginx

deployment调用keepalived (不一定相同,但原理类似)

实现了负载均衡和高可用

----------------------------------------------------------------

而且在deployment的基础上

k8s提供了

HPA监理功能

HorizontalPodAutoscaling

水平 pod  自动 伸缩

deployment的扩缩容需要

管理员去手工scale

根据资源的使用量调整

而HPA可以自动根据pod的资源使用量

调整pod的数量

也就是自动扩缩容

管理员只需要提前配置好就行。

-----------------------------------------------------------------

这么来看,k8s对于容器化环境的

负载均衡、

高可用、

自动化部署(给个模版,自动创建pod)、

自动化维护(pod删掉了,自动新建)、

自动化调整服务器规模

(pod不够用了,自动扩容;

pod太多了,请求没那么多,自动缩容)

都设计的比较ok

------------------------------------------------------------------

从pod的监控方面来讲

pod中的

容器探针

钩子函数

初始化容器

包括利用临时卷

configMap

emptyDir

可以实现很多功能。

---------------------------------------------------------------

总的来说

k8s作为云原生时代的平台

也称为云原生时代的操作系统,

对于传统方式的容器化提供了很多功能。

资源利用率更高

服务的管理更加自动化。

安全性也比较高

相关文章:

k8s中,ingress的实现原理,及其架构。

图片来源&#xff1a;自己画的 图片来源&#xff1a;k8s官网 首先&#xff0c;什么是ingress? 是服务还是控制器&#xff1f; 都不精确 ingress是一个api资源 service和deployment也是api资源。 这几个相互协作&#xff0c;组建成一个对外提供服务的架构。 ingress提供的…...

【数据结构强化】应用题打卡

应用题打卡 数组的应用 对称矩阵的压缩存储 注意&#xff1a; 1. 2.上三角的行优先存储及下三角的列优先存储与数组的下表对应 上/下三角矩阵的压缩存储 注意&#xff1a; 上/下三角压缩存储是将0元素统一压缩存储&#xff0c;而不是将对角线元素统一压缩存储 三对角矩阵的…...

解决 MySQL 服务无法启动:failed to restart mysql.service: unit not found

目录 前言1. 问题描述2. 问题分析3. 解决步骤3.1 检查 MySQL 服务文件3.2 备份旧的服务文件3.3 启动 MySQL 服务3.4 验证服务状态 4. 总结结语 前言 在日常使用 MySQL 数据库时&#xff0c;有时候可能会遇到服务无法正常启动的问题。这类问题通常出现在系统更新或者服务配置文…...

Dubbo和Http的调用有什么区别

背景 我们在项目开发中&#xff0c;需要进行调用外部接口时&#xff0c;往往使用Dubbo和Http方式都能实现远程调用。那么他们在使用上&#xff0c;有什么区别呢&#xff1f; 定位不同 一个是分布式环境下的框架&#xff0c;一个是通信协议。 Dubbo&#xff1a;是一种高性能的…...

ARM 架构、cpu

一、ARM的架构 ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构. 1、ARM芯片特点 ARM芯片的主要特点有以下几点&#xff1a; 精简指令集&#xff1a;ARM芯片使用精简指令集&#xff0c;即每条指令只完成一项简单的操作&#xff0c;从而提高指令的执行效率…...

【React】入门Day03 —— Redux 与 React Router 核心概念及应用实例详解

1. Redux 介绍 // 创建一个简单的Redux store const { createStore } Redux;// reducer函数 function counterReducer(state { count: 0 }, action) {switch (action.type) {case INCREMENT:return { count: state.count 1 };case DECREMENT:return { count: state.count -…...

u2net网络模型训练自己数据集

单分类 下载项目源码 项目源码 准备数据集 将json转为mask json_to_dataset.py import cv2 import json import numpy as np import os import sys import globdef func(file):with open(file, moder, encoding"utf-8") as f:configs json.load(f)shapes configs…...

登录功能开发 P167重点

会话技术&#xff1a; cookie jwt令牌会话技术&#xff1a; jwt生成&#xff1a; Claims&#xff1a;jwt中的第二部分 过滤器&#xff1a; 拦截器&#xff1a; 前端无法识别controller方法&#xff0c;因此存在Dispa什么的...

数据架构图:从数据源到数据消费的全面展示

在这篇文章中&#xff0c;我们将探讨如何通过架构图来展示数据的整个生命周期&#xff0c;从数据源到数据消费。下面是一个使用Mermaid格式的示例数据架构图&#xff0c;展示了数据从源到消费的流动、处理和存储过程。 数据架构图示例 说明 数据源&#xff1a;分为内部数据源&…...

useEffect 与 useLayoutEffect 的区别

useEffect 与 useLayoutEffect 的区别 useEffect和useLayoutEffect是处理副作用的React钩子函数&#xff0c;有以下区别1. 执行时机不同2. 对性能影响不同3. 对渲染的影响不同&#xff1a;4. 使用场景不同 使用建议 useEffect和useLayoutEffect是处理副作用的React钩子函数&…...

OPENCV判断图像中目标物位置及多目标物聚类

文章目录 在最近的项目中&#xff0c;又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中&#xff0c;有时候目标物比较偏&#xff0c;也就是在图像的比较偏的位置&#xff0c;需要通过移动样本&#xff0c;将目标物置于视野正中央&#xff0c;然后再…...

分布式理论:拜占庭将军问题

分布式理论&#xff1a;拜占庭将军问题 介绍拜占庭将军的故事将军的难题 解决方案口信消息型拜占庭问题之解流程总结 签名消息型拜占庭问题之解 总结 介绍 拜占庭将军问题是对分布式共识问题的一种情景化描述&#xff0c;由兰伯特于1082首次发表《The Byzantine Generals Prob…...

从零开始Ubuntu24.04上Docker构建自动化部署(三)Docker安装Nginx

安装nginx sudo docker pull nginx 启动nginx 宿主机创建目录 sudo mkdir -p /home/nginx/{conf,conf.d,html,logs} 先启动nginx sudo docker run -d --name mynginx -p 80:80 nginx 宿主机上拷贝docker上nginx服务上文件到本地目录 sudo docker cp mynginx:/etc/nginx/ngin…...

阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

作者&#xff1a;胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件&#xff0c;这个事件是 K8s 原生的事件&#xff0c;其实绝大多数的用户并不会关心&#xff0c;同时也可能看不懂。而事件中心&#xff0c;是希望能够…...

人口普查管理系统基于VUE+SpringBoot+Spring+SpringMVC+MyBatis开发设计与实现

目录 1. 系统概述 2. 系统架构设计 3. 技术实现细节 3.1 前端实现 3.2 后端实现 3.3 数据库设计 4. 安全性设计 5. 效果展示 ​编辑​编辑 6. 测试与部署 7. 示例代码 8. 结论与展望 一个基于 Vue Spring Boot Spring Spring MVC MyBatis 的人口普查管理…...

使用VBA快速将文本转换为Word表格

Word提供了一个强大的文本转表格的功能&#xff0c;结合VBA可以实现文本快速转换表格。 示例文档如下所示。 现在需要将上述文档内容转换为如下格式的表格&#xff0c;表格内容的起始标志为。 示例代码如下。 Sub SearchTab()Application.DefaultTableSeparator "*&quo…...

力扣题解1870

这道题是一个典型的算法题&#xff0c;涉及计算在限制的时间内列车速度的最小值。这是一个优化问题&#xff0c;通常需要使用二分查找来求解。 题目描述&#xff08;中等&#xff09; 准时到达的列车最小时速 给你一个浮点数 hour &#xff0c;表示你到达办公室可用的总通勤时…...

D3.js数据可视化基础——基于Notepad++、IDEA前端开发

实验:D3.js数据可视化基础 1、实验名称 D3数据可视化基础 2、实验目的 熟悉D3数据可视化的使用方法。 3、实验原理 D3 的全称是(Data-Driven Documents),是一个被数据驱动的文档,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。本次实…...

在Robot Framework中Run Keyword If的用法

基本用法使用 ELSE使用 ELSE IF使用内置变量使用Python表达式本文永久更新地址: 在Robot Framework中&#xff0c;Run Keyword If 是一个条件执行的关键字&#xff0c;它允许根据某个条件来决定是否执行某个关键字。下面是 Run Keyword If 的基本用法&#xff1a; Run Keyword…...

虚拟机ip突然看不了了

打印大致如下&#xff1a; 解决办法 如果您发现虚拟机的IP地址与主机不在同一网段&#xff0c;可以采取的措施之一是调整网络设置。将虚拟机的网络模式更改为桥接模式&#xff0c;这样它就会获得与主机相同的IP地址&#xff0c;从而处于同一网段。或者&#xff0c;您可以使用…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...