本文分享自华为云社区《当创建一个ingress后,kubernetes会发什么?》,作者:可以交个朋友。

一、Ingress概述

Ingress是一组路由转发规则合集,将集群内部服务通过7层协议暴露给用户,是一种k8s默认的资源。Ingress资源对象用于定义来自外网的HTTP和HTTPS规则,流量路由由Ingress资源上定义的规则控制。从而达到管理控制进入集群内部流量的目的。

二、Ingress 相关定义

Ingress资源:Ingress是一个API对象,一般通过yaml进行配置,其作用是定义请求如何转发到service的规则,可以理解为配置模板。

Ingress-controller组件:入口控制器(ingress-controller)管理L4层和L7层请求的南北向流量,也就是指从集群外部进入或离开集群的流量。是具体实现反向代理及负载均衡的程序,对Ingress定义的规则进行解析,根据配置的规则来实现请求转发。

三、Ingress Controller 百花齐放

目前Ingress暴露集群内服务的行内被公认为是最好的方式,由于其重要地位,世面上有非常多的Ingress Controller,常见的有:

  • Kubernetes Ingress Nginx

    Kubernetes Ingress的官方推荐的Ingress控制器,它基于nginx Web服务器,并补充了一组用于实现额外功能的Lua插件。由于Nginx的普及使用,在将应用迁移到K8S后,该Ingress控制器是最容易上手的控制器,而且学习成本相对较低,建议使用。不过当配置文件太多的时候,Reload会很慢。

  • Nginx Ingress

    Nginx Ingress是NGINX开发的官方版本,它基于NGINX Plus商业版本,NGINX控制器具有很高的稳定性,持续的向后兼容性,没有任何第三方模块,并且由于消除了Lua代码而保证了较高的速度(与官方控制器相比)。它支持TCP/UDP的流量转发,付费版有很广泛的附加功能,主要缺点就是缺失了鉴权方式、流量调度等其他功能。

  • Kong Ingress

    Kong Ingress建立在NGINX之上,并增加了扩展其功能的Lua模块。kong之前是专注于API网关,现在已经成为了成熟的Ingress控制器,相较于官方控制器,在路由匹配规则、upstream探针、鉴权上做了提升,并且支持大量的模块插件,便与配置。它提供了一些 API、服务的定义,可以抽象成 Kubernetes 的 CRD,通过Kubernetes Ingress 配置便可完成同步状态至 Kong 集群。

  • Traefik Ingress

    traefik Ingress是一个功能很全面的Ingress,官方称其为:Traefik is an Edge Router that makes publishing your services a fun and easy experience。它具有许多有用的功能:连续更新配置(不重新启动),支持多种负载平衡算法,Web UI,指标导出,支持各种协议,REST API,Canary版本等。开箱即用的“Let'sEncrypt”支持是另一个不错的功能。而且在2.0版本已经支持了TCP / SSL,金丝雀部署和流量镜像/阴影等功能,社区非常活跃。

  • HAProxy Ingress

    HAProxy作为王牌的负载均衡器,在众多控制器中最大的优势还在负载均衡上。它提供了“软”配置更新(无流量丢失),基于DNS的服务发现,通过API的动态配置。HAProxy还支持完全自定义配置文件模板(通过替换ConfigMap)以及在其中使用Spring Boot函数。

  • APISIX Ingress

    ApiSix Ingress是一个新兴的Ingress Controller,它主要对标Kong Ingress。它具有非常强大的路由能力、灵活的插件拓展能力,在性能上表现也非常优秀。同时,它的缺点也非常明显,尽管APISIX开源后有非常多的功能,但是缺少落地案例,没有相关的文档指引大家如何使用这些功能。

四、ingress nginx 原理解析

nginx-ingress 模块在运行时主要包括三个主体:NginxController、Store、SyncQueue。

Store 主要负责从 kubernetes APIServer 收集运行时信息,感知各类资源(如 ingress、service等)的变化,并及时将更新事件消息(event)写入一个环形管道;

NginxController 作为中间的联系者,监听 updateChannel,一旦收到配置更新事件,就向同步队列 syncQueue 里写入一个更新请求。

SyncQueue :

  1. 协程定期扫描 syncQueue 队列,发现有任务就执行更新操作
  2. 借助 Store 完成最新运行数据的拉取(一般为新写入信息)

然后根据一定的规则产生新的 nginx 配置,(有些更新必须 reload,就本地写入新配置,执行 reload),然后执行动态更新操作,即构造 POST 数据,向本地 Nginx Lua 服务模块发送 post 请求,实现配置更新;

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。ingress nginx controller 嵌入多个lua脚本。下面对整个lua脚本处理过程做个简单梳理。

  • init_by_lua*:初始化 nginx 和预加载 lua(nginx 启动和 reload 时执行);

  • init_worker_by_lua*:每个工作进程(worker_processes)被创建时执行,用于启动一些定时任务,

    比如心跳检查,后端服务的健康检查,定时拉取服务器配置等;

  • ssl_certificate_by_lua*:对 https 请求的处理,即将启动下游 SSL(https)连接的 SSL 握手时执行,用例:按照每个请求设置 SSL 证书链和相应的私钥,按照 SSL 协议有选择的拒绝请求等;

  • set_by_lua*:设置 nginx 变量;

  • rewrite_by_lua*:重写请求(从原生 nginx 的 rewrite 阶段进入),执行内部 URL 重写或者外部重定向,典型的如伪静态化的 URL 重写;

  • access_by_lua*:处理请求(和 rewrite_by_lua 可以实现相同的功能,从原生 nginx 的 access阶段进入);

  • content_by_lua*:执行业务逻辑并产生响应,类似于 jsp 中的 servlet;

  • balancer_by_lua*:负载均衡;

  • header_filter_by_lua*:处理响应头;

  • body_filter_by_lua*:处理响应体;

  • log_by_lua*:记录访问日志

点击关注,第一时间了解华为云新鲜技术~

当创建一个ingress后,kubernetes会发什么?的更多相关文章

  1. K8S学习笔记之二进制的方式创建一个Kubernetes集群

    0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...

  2. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

  3. 如何在Kubernetes里创建一个Nginx service

    Jerry之前的文章如何在Kubernetes里创建一个Nginx应用,已经使用kubectl命令行创建了Pod,但是在kubernetes中,Pod的IP地址会随着Pod的重启而变化,因此用Pod的 ...

  4. kubernetes实战篇之创建一个只读权限的用户

    系列目录 上一节我们讲解到了如何限制用户访问dashboard的权限,这节我们讲解一个案例:如何创建一个只读权限的用户. 虽然可以根据实际情况灵活创建各种权限用户,但是实际生产环境中往往只需要两个就行 ...

  5. linux 成功安装oracle后,为其创建一个登录账户

    成功安装oracle后,创建一个登录账户 1.切换到oracle用户下 su -l oracle 2.使用sysdba账户登录: sqlplus / as sysdba 3.创建用户 语法:CREAT ...

  6. 创建一个MVC解决方案,添加一个控制器后,运行程序报错:”/"未找到服务器

    1.创建一个MVC项目,如图

  7. 如何在Kubernetes里创建一个Nginx应用

    使用命令行kubectl run --image=nginx nginx-app --port=80 创建一个名为nginx-app的应用 结果: deployment.apps/nginx-app ...

  8. Kubernetes — 从0到1:搭建一个完整的Kubernetes集群

    准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...

  9. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  10. Git创建一个自己的本地仓库

    如果我们要把一个项目加入到Git的版本管理中,可以在项目所在的目录用git init命令建立一个空的本地仓库,然后再用git add命令把它们都加入到Git本地仓库的暂存区(stage or inde ...

随机推荐

  1. Go协程揭秘:轻量、并发与性能的完美结合

    Go协程为并发编程提供了强大的工具,结合轻量级.高效的特点,为开发者带来了独特的编程体验.本文深入探讨了Go协程的基本原理.同步机制.高级用法及其性能与最佳实践,旨在为读者提供全面.深入的理解和应用指 ...

  2. # 简明快速配置 Rust 工具链

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/dBzL9WZ8P1L1X9j_XkmNQg 你可能会为不同版本的工具 ...

  3. Solution Set -「CF 1514」

    「CF 1514A」Perfectly Imperfect Array Link. 就看序列中是否存在不为平方数的元素即可. #include<bits/stdc++.h> using n ...

  4. Vite+ts+springboot项目集成2

    项目集成 集成element-plus 官网地址: 安装图标库 pnpm install element-plus @element-plus/icons-vue 入口文件main.ts全局安装ele ...

  5. Python面试——基础面试题

    文章目录 1.Python 和 Java.PHP.C.C#.C++等其他语言的对比? C语言既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C ...

  6. Jackson--FastJson--XStream--代码执行&&反序列化

    Jackson--FastJson--XStream--代码执行&&反序列化 Jackson代码执行 (CVE-2020-8840) 影响范围 2.0.0 <= FasterXM ...

  7. JDK21的虚拟线程是什么?和平台线程什么关系?

    虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度.许多虚拟线程共享同一个操作系统线程,虚拟线程的数 ...

  8. 随身wifi 救砖过程记录

    7,8块钱买了个随身wifi,准备刷机玩的,后来不知道刷错了boot还是啥,加电后灯都不亮了,前期没备份,于是网上找了各种教程,下面记录下: 变砖后有个底层的9008驱动协议可以刷机,下面的过程都是基 ...

  9. Python 面向对象编程:类、对象、初始化和方法详解

    Python 是一种面向对象的编程语言.在 Python 中,几乎所有东西都是对象,都具有其属性和方法. 类似于对象构造函数或用于创建对象的"蓝图"的类. 创建一个类 要创建一个类 ...

  10. 7z 一键压缩备份

    该批处理已开源 开原地址: 点击进入 磁盘备份 工具有很多,如果你需要增量式备份的话,以下这些方法并不适合你.goodsync 可以了解一下. 以下方式仅适用于,懒人一键压缩备份. 对于我来说 定期的 ...