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类型的服务。
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的更多相关文章
- 浅谈 k8s ingress controller 选型
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云.业余时间比较喜欢开源,现在是Apache APISIX PPMC.今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容 ...
- K8S ingress控制器
文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...
- nginx 与 k8s ingress 配置转发websocket
环境 10.1.100.10:70 是后端websocket 服务 需要通过nginx 向后端转发,nginx 配置文件如下 # cat test-ue4.conf map $http_upgrade ...
- k8s Ingress 理解和部署
目录 前言 Ingress 与 ingress-controller Ingress 部署 1.部署 ingress-controller 2.部署测试 web 服务 3.部署 Ingress 4.检 ...
- k8s ingress 转发服务,内容显示不全问题
0x00 事件 部署了 ingress ,并声明了两个路由 /eureka 和 /tomcat,/eureka 转发到了 eureka server 的服务端口,/tomcat 转发到了 tomcat ...
- k8s Ingress和ingress控制器
ingress架构图简介 我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制 ...
- k8s ingress路由强制跳转至https设置
为ingress配置增加注解(annotations):nginx.ingress.kubernetes.io/ssl-redirect: 'true' 就可以实现http强制跳转至https 不过默 ...
- k8s ingress - traefik
前面提到过 k8s 的 ingress 有 ingress-nginx,traefik,haproxy 等多种.今天来实践一下 tarefik. 闲言少叙,直接上代码. # cat traefik.y ...
- k8s ingress 报错整理
问题: Error from server (InternalError): error when creating "ingress-rules-demo1.yaml": Int ...
- k8s ingress
ingress ingress为k8s集群中的服务提供了入口,可以提供复制均衡,ssl终止和基于名称的虚拟主机,再生产环境中,常用的ingress有Treafik,Nginx,HAProxy,Is ...
随机推荐
- 今天记录一下css布局的flex布局的一个小妙招之gap
在平常前端开发中,常见的开发布局flex布局,常见的布局有这个样子,这个是可以用css进行修改,但是今天分享一个简单的方法 这种布局的话,如果是偶数的话可以用flex的 justify-content ...
- canal源码分析简介-3
5.0 store模块 2018-10-08 23:14:58 8,328 7 1 store模块简介 store模块用于binlog事件的存储 ,目前开源的版本中仅实现了Memory内存模式.官 ...
- .net工作流elsa-书签
啥是书签 流程引擎的核心关注点是安排流程,如:第1步做什么 → 第2步做什么 → 第n步做什么...,至于各步骤具体是怎么做的,是由你来决定的,这不是流程引擎关注的重点. 流程安排可能会涉及到分叉.并 ...
- 原生JS实现一个日期选择器(DatePicker)组件
这是通过原生HTML/CSS/JavaScript完成一个日期选择器(datepicker)组件,一个纯手搓的组件的开发.主要包括datepicker静态结构的编写.日历数据的计划获取.组件的渲染以及 ...
- el-table当前行的获取和设置,用于表格行操作
1.在vue的data区声明当前行变量对象,如果当前行的信息用于了按钮的状态则需要赋予默认值,否则会报找不到属性的错误,比如下面会用到当前记录的status属性值控制按钮是否可用. //表格选中的行 ...
- 使用天翼云云容器引擎CCE创建简单nginx服务
本文分享自天翼云开发者社区<使用天翼云云容器引擎CCE创建简单nginx服务>,作者:b****n 一.创建一个nginx应用. 1.选择资源池,如[杭州2],进入云容器引擎CCE平台页面 ...
- 更快更省更好用!天翼云云原生一体机iStack打通物云最后一公里!
近年来,随着企业数字化转型的深入,从传统 IT 架构向云原生架构转型,已经成为企业谋求更高质量发展的必由之路.然而,云原生技术复杂度高,运维成本高,且技术工具间的集成度不足.打破云原生技术应用门槛,以 ...
- Q:如何实现notepad++列编辑模式
列编辑: txt编辑器大家都非常熟悉,当需要修改多行的时候只能一行一行的修改.而notepad 可以同时修改多行的数据. 1.鼠标移动光标到要选择的列 2.按住 alt 键,从上到下选择多列,光标会变 ...
- FLink参数pipeline.operator-chaining介绍
1.当使用flink提交一个任务,没有给算子设置并行度情况下,默认所有算子会chain在一起,整个DAG图只会显示一个算子,虽然有利于数据传输,提高程序性能,但是无法看到数据的输入和疏忽,业绩反压相关 ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)
1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位.监听事件和执行js脚本三个方面进行展开 ...