本文是有态度马甲的第185篇原创。

本文记录了k8s中核心对象Ingress的产生背景和实现机制。

我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务定义了一组有关Pod的端点, Service有几种类型

  • ClusterIP: 默认,以集群内Ip的形式提供集群内的可访问性
  • NodePort:在每个节点的静态端口上对外暴露了服务
  • Loadbalancer: 外部负载均衡器

这不明摆了,常规的对外暴露服务的方式只有NodePort吗?

NodePort类型建立在ClusterIP服务类型之上, 意味着你创建了NodePort类型服务,k8s自动创建了ClusterIP 服务。

外部客户端---> 任意节点(NodePort)---> ClusterIP服务---> Pod

有几个缺陷:

  • NodePort形式的服务 没有跨节点的负载均衡能力, 有的节点忙着导流,有的闲得蛋疼
  • 能暴露的服务数量受限于节点的可用端口
  • 这姑且不算缺陷吧: 引流方式基于节点端口,位于osi网络模型的4层, 人类感知不明显。

Ingress号称是一种智能路由,表象上Ingress从集群外部将HTTP和HTTPS路由引流到k8s集群中的Service。



一个典型的数据流如上图

曾几何时,我以为Ingress是新开天辟地的网络引流方案。

后面等我深究一丢丢,发现k8s Ingress 其实是个老6, 它对外暴露服务的方式其实很贼,还是现成技能的积木。

Ingress 本质上是先在集群内产生了负载均衡服务(nginx pod), 这个k8s服务在集群内与其他服务必然可以互访。

然后咋们目标不是要对外暴露服务吗? 那我这个Ingress Nginx服务就作为一个流量入口,我这个服务还使用NodePort形式对外暴露服务, 对内通过nginx天生的路由能力来引流到后端的Service。

下面是Ingress-nginx的流程图:

注意流量从 client---> nginx pod ---> service Pod,

Ingress记录并监听了注册到Ingress上服务的路由规则,Ingress-Nginx Controller是本次业务的声明式核心控制器,确保产生满足这一规则的NodePort类型的nginx服务, Ingress nginx本身不能解决节点间负载均衡问题,注意还需前置负载提供跨节点负载均衡能力。


我们找个demo快速验证一下吧。

k8s ingress官方 给了一个通过Ingress引流到"hello world“ 这样的服务,但是它的服务竟然采用了NodePort形式,这都NodePort了,还要你Ingress作甚。

我的Demo是以默认的ClusterIP形式快速启动了Nginx服务,

已经显示nginx-svc是 ClusterIP类型的服务。

aladdin@bogon ~ % kubectl get  svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
nginx-svc ClusterIP 10.103.46.57 <none> 80/TCP 24h

之后使用Ingress配置通过host:hello.nginx.com路由到nginx-svc服务:

    apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: hello.nginx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80

产生一个Ingress核心对象

    aladdin@bogon ~ % kubectl get  ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress nginx hello.nginx.com 192.168.58.2 80 24h

准备工作就做完了。

启动minikube tunnel, 然后在新的终端执行curl 127.0.0.1 -H "host:hello.nginx.com" 你会看到nginx服务的Welcome to nginx!输出。

That's All, Ingress 就是如此暴露服务引流的.


Ingress相关的核心对象默认被安装在Ingress-nginx命名空间下,我们接着验证Ingress架构图中出现的组件:

上图中出现了两种核心对象:

  • Deployment/Pod: ingress-nginx-controller-56d7c84fd4-znrvq其实就是Nginx Pod
  • Service: 以NodePort形式对外暴露的ingress-nginx-controller服务

根据我们的猜想:

这个Nginx Pod受ingress-nginx-controller服务(NodePort)控制对外暴露路由服务, 对内引流到backend Service。

验证如下:


Ingress-nginx分为两大块: Ingress规则和Ingress-nginx controller Service,

两者配合一举解决了NodePort暴露服务的一些缺陷, 通过Ingress暴露服务既能有效节约节点端口,又有负载均衡能力(搭配前置负载),又是广大码农喜闻乐见的7层协议, 悠哉快哉。

但是归根到底,Ingress-nginx底层还是NodePort服务和ClusterIP服务的积木组合, 实在是高啊。

K8s Ingress, 你这个老6的更多相关文章

  1. 浅谈 k8s ingress controller 选型

    大家好,先简单自我介绍下,我叫厉辉,来自腾讯云.业余时间比较喜欢开源,现在是Apache APISIX PPMC.今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容 ...

  2. K8S ingress控制器

    文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...

  3. nginx 与 k8s ingress 配置转发websocket

    环境 10.1.100.10:70 是后端websocket 服务 需要通过nginx 向后端转发,nginx 配置文件如下 # cat test-ue4.conf map $http_upgrade ...

  4. k8s Ingress 理解和部署

    目录 前言 Ingress 与 ingress-controller Ingress 部署 1.部署 ingress-controller 2.部署测试 web 服务 3.部署 Ingress 4.检 ...

  5. k8s ingress 转发服务,内容显示不全问题

    0x00 事件 部署了 ingress ,并声明了两个路由 /eureka 和 /tomcat,/eureka 转发到了 eureka server 的服务端口,/tomcat 转发到了 tomcat ...

  6. k8s Ingress和ingress控制器

    ingress架构图简介 我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制 ...

  7. k8s ingress路由强制跳转至https设置

    为ingress配置增加注解(annotations):nginx.ingress.kubernetes.io/ssl-redirect: 'true' 就可以实现http强制跳转至https 不过默 ...

  8. k8s ingress - traefik

    前面提到过 k8s 的 ingress 有 ingress-nginx,traefik,haproxy 等多种.今天来实践一下 tarefik. 闲言少叙,直接上代码. # cat traefik.y ...

  9. k8s ingress 报错整理

    问题: Error from server (InternalError): error when creating "ingress-rules-demo1.yaml": Int ...

  10. k8s ingress

    ingress   ingress为k8s集群中的服务提供了入口,可以提供复制均衡,ssl终止和基于名称的虚拟主机,再生产环境中,常用的ingress有Treafik,Nginx,HAProxy,Is ...

随机推荐

  1. 视频分析框架VideoPipe完整介绍

    (2024年4月编写) github地址 https://github.com/sherlockchou86/video_pipe_c 作者微信 zhzhi78(备注 videopipe),拉群交流( ...

  2. 基于AI底座的数智油气田参考架构

      基于AI底座的数智油气田参考架构 Architecture for Intelligent & Digital Oilfileds Based-on AI 王权 2024.12.29   ...

  3. Bolt.new 30秒做了一个网站,还能自动部署,难道要吊打 Cursor?

    大家好,我是汤师爷~ 这篇聊聊 Bolt.new 和 Cursor 的对比. Bolt.new 是一款基于 SaaS 的 AI 编码平台.它由 LLM 驱动的智能体作为底层,并结合 WebContai ...

  4. 一站式解决方案 :OFD电子证照生成

    前言 证照的电子化是一个趋势:可以预计,未来几年内,绝大部分证照都会电子化.电子证照的种类越来越多,应用场景也复杂多样:这就给电子证照规范的制定.电子证照的生成提出了更高的要求.电子证照采用的格式有两 ...

  5. 深度学习基础理论————DeepSpeed

    DeepSpeed原理 DeepSpeed 是由微软开发的一种深度学习优化库,专为高性能训练和推理而设计,尤其适用于大规模深度学习模型(如 GPT 系列.BERT 等).它通过一系列技术和优化策略,帮 ...

  6. 【JMeter】---入门

    JMeter入门 一.概述 JMeter是Apache下一款在国外非常流行和受欢迎的开源性能测试工具,JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能. ...

  7. Linux:yum

    yum介绍 [yellow dog updater,modified],一个在Fedora和RedHat以及SUSE.Centos中的shell前段软件包管理器 能够自动的从指定的服务器自动下载RPM ...

  8. (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理?

    (vm/vb)虚拟机复制或者拷贝之后连不上网络怎么处理? Linux虚拟机无论在VMware还是VirtualBox下面,只要复制拷贝到别的地方,开启网络服务都会出现报错的问题. 这里以CentOS ...

  9. 国际认可!天翼云合规领域影响力up!

    近日,天翼云科技有限公司成功通过ISO 37301合规管理体系双认证(GB/T 35770-2022/ISO 37301:2021 & CTS GHMS001-2024),标志着公司合规管理和 ...

  10. C# 深度学习框架 TorchSharp 原生训练模型和图像识别-自定义网络模型和识别手写数字

    目录 使用 Torch 训练模型 定义神经网络 加载数据集 创建网络模型 定义损失函数 训练 识别手写图像 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址:https://torch.w ...