K8s Ingress, 你这个老6

本文是有态度马甲的第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类型的服务。

sql 复制代码
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服务:

yaml 复制代码
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核心对象

swift 复制代码
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服务的积木组合, 实在是高啊。

相关推荐
于过7 分钟前
基于Mybatis的SQL模版解析
后端·mybatis
lamdaxu11 分钟前
Java基础--异常机制详解
后端
宦如云16 分钟前
Bash语言的哈希表
开发语言·后端·golang
失业写写八股文20 分钟前
本地事务 vs 分布式事务:核心区别与解释
分布式·后端
uhakadotcom43 分钟前
快速构建交互式数据应用:Streamlit入门指南
后端·面试·github
无名之逆1 小时前
hyperlane:Rust HTTP 服务器开发的不二之选
服务器·开发语言·前端·后端·安全·http·rust
机构师1 小时前
<iced><rust><GUI>基于rust的GUI库iced的学习(02):svg图片转png
后端·rust
老赵骑摩托1 小时前
Go语言nil原理深度解析:底层实现与比较规则
开发语言·后端·golang
卑微小文1 小时前
惊!代理 IP 竟成社交媒体营销破局“神助攻”!
后端
程序员爱钓鱼2 小时前
Go 语言邮件发送完全指南:轻松实现邮件通知功能
后端·go·排序算法