网络IO模型的介绍引出nginx的网络IO模型

 

1. 什么是IO?

简单来说就是输入输出

2. 网络IO经历步骤

  1. 用户在获取网络资源是在进入网卡,经过网络七层模型将请求交给nginx用户进程

  2. 用户进程无法直接获取磁盘上的资源,会将请求获取什么资源翻译并转发给内核,内核驱动磁盘寻道找到文件(最耗时间的环节)

  3. 文件同样也不能直接交给用户进程,首先磁盘将文件放至内核缓冲区,然后内核告知用户进程请求的资源结果已准备好(耗时比较短)

  4. 内核缓冲区将文件拷贝一份至用户进程缓冲区,用户进程拿到文件 构建响应报文,通过http回传给用户

 

 

总结:

IO总共要经历两个阶段

1.磁盘读取数据,将数据拷贝至内核缓冲区

2.将内核缓冲区数据拷贝至用户进程缓冲区


 

3. 网络IO模型种类

 

同步阻塞

比如你要去完成这样一件事情,把水烧开,灌入暖瓶

现在给你一口普通的锅,你也不知道水什么时候可以烧开,你决定守在旁边等待水开。

这个时候的你是什么也做不了的,是不是觉得很浪费时间

当水开了就需要你把水灌入暖瓶,你还是做不了其他的事情

 

 

 

 

同步非阻塞

比如还是烧一锅开水,你还是不知道水什么时候会开,你选择了另外一个策略,去忙其它的事情但是要时不时看下谁开没开

 

改进了什么呢?

你可以在空挡时间忙其它的事情

 

增加了什么麻烦呢?

  1. 你得时不时的确认水开没开(就意味着得不停的调用cpu,占用cpu资源)

  2. 可能你上一次刚看的时候水没开,等你刚看完水开了,那就得等下一次查看的时候才能发现,增加了延迟,等你知道了水开了,自己去把水灌好

 

 

 

Linuxc/c++服务器开发高阶视频学习资料+qun720209036获取

更多视频内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,K8S,Docker,TCP/IP,协程,DPDK多个高级知识点分享。

 

异步阻塞

这个就比较二了

假如给你一个智能热水壶,水开了会自动的提醒你的,但是你还是要傻傻的等

完全没有利用好智能热水壶的优势(不做解释)

 

 

同步异步:关注的是消息的通知机制

阻塞非阻塞:关注的是在收到结果之前调用者的状态是等待还是忙自己的事情

 

IO多路复用

还拿烧水的例子

不要你来管水开没开,直接交给一个代理,假如代理名叫select,select在那帮你监控水开没开,捎带他还会看饭有没有煮好,你把所有的事情都交代给它,可以去忙自己的事情了在饭还没熟,水还没开的时候select就处于一个等待的状态,假如这个时候水开了select会水开了的结果写到一个小黑板你可以看到并知道水开了,不需要你去查看水开没开,接下来由你将烧开的水灌进暖瓶(用户进程前半部分不阻塞,后半部份阻塞)

 

 

 

select、poll、epoll的区别

无论是select、poll、epoll都可以面对多个用户进程的请求,它相当于一个代理人,收集很多用户进程的请求,他帮你从磁盘上获取数据,复制到内核中,那么这个数据准备没准备好它的实现机制是不一样的

通知方式:假设有一个用户数据准备好了,那么还有很多用户数据还没有准备好,那么如何通知?

select和poll是遍历扫描,效率低下

epoll采用回调机制,epoll会主动通知,效率更高(nginx支持)

 

信号驱动IO

举例:比如我们的智能热水壶我么设定好烧水以后,会给你一个反馈结果为设定成功,然后你就可以去忙其他的事情了,等到水烧开了会发给你一条短息,这个时候你再回去把水灌入暖瓶

 

 

通知机制: 水平触发:多次通知 边缘触发:只通知一次

 

 

<think>嗯,用户想了解Kubernetes和Nginx之间的关系以及它们如何协同工作,特别是集成方式和作用。这个问题很基础但也很重要,涉及到Kubernetes网络架构的核心组件。用户可能正在学习Kubernetes的网络管理部分,或者在工作中需要部署web应用。从引用内容看,用户已经接触过Ingress、Controller等概念,但需要系统化的梳理。用户特别强调"关系"和"协同工作",说明需要整体框架而非碎片化知识。深入分析用户需求:1)基础关系:Nginx如何从独立服务转变为K8s网络基础设施?2)价值定位:为什么选择Nginx而不是其他负载均衡方案?3)技术动因:K8s需要Nginx解决哪些原生缺陷?引用材料提供了重要线索:引用[5]提到NginxIngressController是"守门人",这是个很好的切入点。引用[1][2]展示了配置方式的进化,引用[3]则指向定制化需求。引用[4]的架构图特别关键,正好用来解释数据/控制平面协作。构建回答时要注意层次:先解释K8s原生服务暴露方式的局限性,自然引出对7层代理的需求。然后聚焦Nginx的三大价值——这正是用户问的"作用"部分。技术实现上,需要区分控制平面(Controller组件)和数据平面(Nginx进程)的分工,引用[4]的架构图很适用。用户可能忽略的要点在于部署模式差异:传统Nginx是独立部署,而K8s集成后变成动态生成配置的集群组件。补充的自定义部署场景特别重要,引用[3]的自编译案例说明高级用户可能需要这个知识。</think> Kubernetes 与 Nginx 的集成主要体现在 **Nginx Ingress Controller** 的部署和使用上,二者协同工作为集群提供高效、灵活的流量管理和服务暴露能力。以下是核心集成方式及作用: --- ### **1. Nginx Ingress Controller 的角色** **作用**: - **7层负载均衡**:解析 HTTP/HTTPS 请求的 URI、域名等,将流量按规则路由至后端 Service。 - **统一入口网关**:替代 NodePort/LoadBalancer 暴露服务,减少公网 IP 和端口管理成本。 - **高级路由能力**:支持路径重写、SSL 终止、熔断限流、灰度发布等(需搭配 Annotation 或 CRD)。 **集成方式**: - 在 Kubernetes 中部署 **Nginx Ingress Controller**(即独立 Pod),监听 Ingress 资源变化。 - 通过 **ConfigMap** 管理 Nginx 配置模板(如超时时间、日志格式),实现动态更新 [^1][^5]。 --- ### **2. 核心协同流程** ```mermaid graph LR A[用户创建 Ingress 资源] --> B[Ingress Controller 监听到变化] B --> C[生成 Nginx 配置文件] C --> D[重载 Nginx 服务] D --> E[外部请求经 Nginx 路由至后端 Pod] ``` **关键组件交互**(引用自 [^4]): ``` 监控变化 提供配置 Ingress 资源 --(定义规则)--> ConfigMap --(配置模板)--> Nginx Controller ↑ ↓ 用户定义 动态生成配置并重载 ↓ ↓ Kubernetes API Server ←------------ Nginx 进程 (数据平面) ``` --- ### **3. 典型集成方案** #### **(1) 标准部署(Helm 或 Manifest)** ```bash # 使用 Helm 部署(引用自 [^2]) helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install nginx-ingress ingress-nginx/ingress-nginx --namespace nginx-ingress ``` **作用**: - 自动创建 Deployment、Service(类型为 LoadBalancer/NodePort)、RBAC 规则等。 - 默认集成 Prometheus 指标接口,便于监控。 #### **(2) 自定义 Nginx 编译集成** **场景**:需要特定模块(如 GeoIP、Lua)或安全加固(引用自 [^3])。 **步骤**: 1. 从源码编译 Nginx,替换官方镜像中的二进制文件。 2. 构建新 Docker 镜像并推送至私有仓库。 3. 修改 Ingress Controller 的 Deployment 使用自定义镜像。 **优势**:避免云厂商锁定,满足合规性需求。 --- ### **4. 与传统 Nginx 的差异对比** | **维度** | 传统 Nginx | Kubernetes Nginx Ingress Controller | |-------------------|-------------------------------|-------------------------------------------| | **配置方式** | 手动编辑 nginx.conf | 通过 Ingress 资源声明式配置 | | **动态更新** | 需手动重载 `nginx -s reload` | Controller 自动监听并重载 | | **高可用** | 需自建 Keepalived | Kubernetes 自动调度 Pod + Service 负载均衡 | | **扩展性** | 垂直扩容 | 水平扩容(HPA 支持) | --- ### **5. 协同价值总结** 1. **基础设施解耦**: Nginx 作为数据平面处理流量,Kubernetes 控制平面管理声明式配置,职责分离 [^5]。 2. **弹性与自动化**: 结合 HPA 自动扩缩容,无需人工干预流量激增场景。 3. **安全强化**: 集中管理 SSL 证书(如 cert-manager 自动续签),减少配置泄露风险。 4. **多云兼容性**: 统一入口屏蔽底层基础设施差异(AWS/阿里云等)[^4]。 --- **相关问题**: 1. 如何为 Nginx Ingress Controller 配置自定义错误页面? 2. Nginx Ingress 与 Traefik 的性能差异如何测试? 3. 如何通过 Ingress 实现金丝雀发布(Canary Release)? 4. 为什么需要避免在 Pod 内直接部署 Nginx? > 深度实践可参考官方文档:[Kubernetes Nginx Ingress 项目](https://github.com/kubernetes/ingress-nginx)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值