当前位置: 首页 > 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;您可以使用…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...

【前端实战】如何让用户回到上次阅读的位置?

目录 【前端实战】如何让用户回到上次阅读的位置&#xff1f; 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法&#xff1a;监听滚动&#xff0c;记录 scrollTop&#xff08;不推荐&#xff09; 2、Intersection Observer 插入探针元素 3、基…...

C++参数传递 a与a的区别

在 C 中&#xff0c;&a&#xff08;引用&#xff09;和 a&#xff08;值传递&#xff09; 的关键区别在于 参数如何传递给函数&#xff0c;以及由此引发的 性能、语义和安全问题。 最核心的在于你想不想传入的参数被改变&#xff0c;如果想&#xff0c;就用参数传递&#…...

git删除本地分支和远程分支

删除本地分支 git branch -d 分支名删除远程分支 git push origin --delete 分支名...

详解ZYNQ中的 RC 和 EP

详解ZYNQ中的 RC 和 EP 一、ZYNQ FPGA 开发板基础&#xff08; ZC706 &#xff09; 1. 核心特点 双核大脑 灵活积木&#xff1a; ZC706 集成了 ARM Cortex-A9 双核处理器&#xff08;相当于电脑 CPU&#xff09;和 FPGA 可编程逻辑单元&#xff08;相当于可自定义的硬件积木…...

Ubuntu 系统.sh脚本一键部署内网Java服务(组件使用docker镜像,宕机自启动)

#!/bin/bash# 更新系统并安装必要的依赖 sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common# 安装 Docker curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository …...