[单master节点k8s部署]34.ingress 反向代理(一)

ingress是k8s中的标准API资源,作用是定义外部流量如何进入集群,并根据核心路由规则将流量转发到集群内的服务。

ingress和Istio工作栈中的virtual service都是基于service之上,更细致准确的一种流量规则。每一个pod对应的service是四层代理,也就是说处于通信网络结构的第四层(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)。service只根据tcp或udp协议,确定主机的位置,而不能确定到底传送到哪一个服务,这是http\https等七层的协议来处理的,这就是ingress 和 virtual service工作的场景。总的来说,ingress 是工作在service aip资源之上的。

Kubernetes 具有强大的副本控制能力,能保证在任意副本(Pod)挂掉时自动从其他机器启动一个新 的,还可以动态扩容等,通俗地说,这个 Pod 可能在任何时刻出现在任何节点上,也可能在任何时刻死 在任何节点上;那么自然随着 Pod 的创建和销毁,Pod IP 肯定会动态变化;那么如何把这个动态的 Pod IP 暴露出去?这里借助于 Kubernetes 的 Service 机制,Service 可以以标签的形式选定一组带有指定标签的 Pod,并监控和自动负载他们的 Pod IP,那么我们向外暴露只暴露 Service IP 就行了;这就是NodePort 模式:即在每个节点上开起一个端口,然后转发到内部 Pod IP 上。
但是只通过service来管理pod会存在端口难以维护的问题。服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大。这个时候可以通过nginx进行反向代理,也就是说所有服务进来以后都转发到nginx(nginx是一个反向代理服务器,可以看作是ingress的一种实现),这样由nginx pod进行流量转发就可以了。
从上面的方法,采用 Nginx-Pod 似乎已经解决了问题,但是其实这里面有一个很大缺陷:当每次有新服 务加入又该如何修改 Nginx 配置呢?我们知道使用 Nginx 可以通过虚拟主机域名进行区分不同的服务, 而每个服务通过 upstream 进行定义不同的负载均衡池,再加上 location 进行负载均衡的反向代理,在 日常使用中只需要修改 nginx.conf 即可实现,但是k8s集群需要进行自动管理,不能一直手动修改nginx-pod资源。这时就需要抽象出来ingress 资源,从而更好地让nginx工作。

ingress

Ingress 简单的理解就是你原来需要改 Nginx 配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,你可以用 yaml 创建,每次不要去改 Nginx 了,直接改 yaml 然后创建/更新就行了。

但是ingress本身是一组基于 DNS 名称(host)或URL 路径把请求转发到指定的 Service 资源的规则。而没有完成将配置挂载到nginx的操作,这个操作是通过ingress controller实现的。

ingress controller

Ingress Controller 是一个七层负载均衡调度器,客户端的请求先到达这个七层负载均衡调度器,由七层 负载均衡器在反向代理到后端 pod,常见的七层负载均衡器有 nginx、traefik,以我们熟悉的 nginx 为 例,假如请求到达 nginx,会通过 upstream 反向代理到后端 pod 应用,但是后端 pod 的 ip 地址是一直在变化的,因此在后端 pod 前需要加一个 service,这个 service 只是起到分组的作用,那么我们 upstream 只需要填写 service 地址即可。
总结来讲,ingress controller是控制器,通过不断的和Kubernetes API交互,实时获取后端service、pod的变化,比如新增、删除等,结合ingress定义的规则生成配置,然后更新nginx或traefik的负载均衡器。

使用ingress controller代理k8s内部应用的流程

部署ingress controller

通过部署ingress-controller的pod和default-backend的pod,成功部署了ingress服务。其中default-backend作为一个默认的ingress controller的后端。

默认后端 是一个提供基础响应的服务,当没有任何 Ingress 规则与传入的请求匹配时,Ingress Controller 会将请求路由到这个默认后端。它通常用于处理以下情况:

  • 404 响应:当用户请求的路径或主机名没有被任何定义的 Ingress 规则匹配时,默认后端会返回一个标准的 404 - Not Found 响应。
  • 健康检查:默认后端通常也会提供一个健康检查接口(如 /healthz),供 Ingress Controller 或其他服务检查其健康状态。

这里的ingress controller通过args变量里的--default-backend-serivce参数,在没有ingress的情况下将流量转发给backend服务。

ingress controller代码 

可以看到ingress controller使用了两个探针,分别是就绪探针和存活探针。

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-controllernamespace: kube-system
spec:replicas: 1selector:matchLabels:k8s-app: nginx-ingress-controllertemplate:metadata:labels:k8s-app: nginx-ingress-controllerspec:# hostNetwork makes it possible to use ipv6 and to preserve the source IP correctly regardless of docker configuration# however, it is not a hard dependency of the nginx-ingress-controller itself and it may cause issues if port 10254 already is taken on the host# that said, since hostPort is broken on CNI (https://github.com/kubernetes/kubernetes/issues/31307) we have to use hostNetwork where CNI is used# like with kubeadm# hostNetwork: true #注释表示不使用宿主机的80口,terminationGracePeriodSeconds: 60hostNetwork: true  #表示容器使用和宿主机一样的网络serviceAccountName: nginx-ingress-serviceaccount #引用前面创建的serviceacountcontainers:   - image: registry.cn-hangzhou.aliyuncs.com/peter1009/nginx-ingress-controller:0.20.0      #容器使用的镜像name: nginx-ingress-controller  #容器名readinessProbe:   #启动这个服务时要验证/healthz 端口10254会在运行的node上监听。 httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5periodSeconds: 10successThreshold: 1failureThreshold: 3livenessProbe:httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10  #每隔10做健康检查 timeoutSeconds: 1ports:- containerPort: 80  hostPort: 80    #80映射到80
#        - containerPort: 443
#          hostPort: 443env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceargs:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backend- --configmap=$(POD_NAMESPACE)/nginx-configurationnodeName: node1

这里的环境变量抓取了ingress controller运行的pod的名称和namespace的值。并且写明了是一个针对nginx的ingress controller,并且挂载了一个configMap。

这里写明了该pod是调度到node1上。下面的default backend 也会调度到node1。

default backend代码

这里定义了一个deployment和一个service。这里和上面ingress controller都将pod部署在node1

节点,这两个pod需要被部署在相同的节点。

apiVersion: apps/v1
kind: Deployment
metadata:name: default-http-backendlabels:k8s-app: default-http-backendnamespace: kube-system
spec:replicas: 1selector:matchLabels:k8s-app: default-http-backendtemplate:metadata:labels:k8s-app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: registry.cn-hangzhou.aliyuncs.com/hachikou/defaultbackend:1.0livenessProbe:httpGet:path: /healthz   #这个URI是 nginx-ingress-controller中nginx里配置好的localtion port: 8080scheme: HTTPinitialDelaySeconds: 30   #30s检测一次/healthztimeoutSeconds: 5ports:- containerPort: 8080
#        resources:
#          limits:
#            cpu: 10m
#            memory: 20Mi
#          requests:
#            cpu: 10m
#            memory: 20MinodeName: node1
---
apiVersion: v1
kind: Service     #为default backend 创建一个service
metadata:name: default-http-backendnamespace: kube-systemlabels:k8s-app: default-http-backend
spec:ports:- port: 80targetPort: 8080selector:k8s-app: default-http-backend

还需要配合rbac代码,这里不再列举。

configMap代码
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-configurationnamespace: kube-system  # 确保这个与 Ingress Controller 所在的命名空间一致
data:proxy-read-timeout: "120"proxy-send-timeout: "120"client-max-body-size: "50m"use-proxy-protocol: "false"

不同的ingress controller

一个 Ingress Controller 实例通常对应一种特定的反向代理。例如,nginx-ingress-controller 仅支持 NGINX 作为反向代理,而 traefik-ingress-controller 只支持 Traefik。但你可以在同一个 Kubernetes 集群中运行多个不同类型的 Ingress Controller,每个控制器处理不同的 Ingress 资源或不同的域名。

nginx ingress controller 是k8s中最常使用的ingress controller。

traefik ingress controller是专门针对http/https的反向代理和负载均衡器,更适合微服务。

HAProxy Ingress Controller是基于 HAProxy 的ingress controller,Envoy Ingress Controller使用 Envoy 作为反向代理,通常在基于服务网格的架构中使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/444954.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32接入扣子(Coze) API使用自定义智能体

使用ESP32接入Coze API实现聊天机器人的教程 本示例将使用ESP32开发板通过WiFi接入 Coze API,实现一个简单的聊天机器人功能。用户可以通过串口向机器人输入问题,ESP32将通过Coze API与智能体进行通信,并返回对应的回复。本文将详细介绍了如…

PyCharm打开及配置现有工程(详细图解)

本文详细介绍了如何利用Pycharm打开一个现有的工程,其中包括编译器的配置。 PyCharm打开及配置现有工程 1、打开工程2、配置编译器 1、打开工程 双击PyCharm软件,点击左上角 文件 >> 打开(O)… 选中想要打开的项目之后点击“确定” 2、配置编译器…

[Algorithm][贪心][可被三整除的最大和][距离相等的条形码][重构字符串]详细讲解

目录 1.可被三整除的最大和1.题目链接2.算法原理详解3.代码实现 2.距离相等的条形码1.题目链接2.算法原理详解3.代码实现 3.重构字符串1.题目链接2.算法原理详解3.代码实现 1.可被三整除的最大和 1.题目链接 可被三整除的最大和 2.算法原理详解 思路:正难则反 贪…

326. 3 的幂

文章目录 326. 3 的幂解题思路Go代码 326. 3 的幂 326. 3 的幂 给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回true;否则,返回 false 。 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n 3 x n …

Android设置状态栏隐藏、固定颜色

设置隐藏效果&#xff1a; <?xml version"1.0" encoding"utf-8"?> <resources><style name"Theme.XiaoShuang" parent"Theme.AppCompat.Light.NoActionBar"><!--设置沉浸式通知栏--><item name"an…

Nullinux:一款针对Linux操作系统的安全检测工具

关于Nullinux Nullinux是一款针对Linux操作系统的安全检测工具&#xff0c;广大研究人员可以利用该工具针对Linux目标设备执行网络侦查和安全检测。 该工具可以通过SMB枚举目标设备的安全状况信息&#xff0c;其中包括操作系统信息、域信息、共享信息、目录信息和用户信息。如…

292. Nim 游戏

文章目录 292. Nim 游戏解题思路Go代码 292. Nim 游戏 292. Nim 游戏 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的…

Elasticsearch的安装与配置

注意&#xff1a;elasticsearch 禁止安装在/root路径下&#xff01; 1、创建用户组 groupadd elastic 2、创建用户 useradd es -d /home/es -g elastic echo es | passwd es --stdin 3、给新创建的用户进行授权 chown -R es:elastic /home/es chmod -R 775 /home/es 4…

『网络游戏』游戏数据库管理类查询插入账号存储【23】

新建数据库连接 新建数据库 打开数据库 新建表 账号数据 设计表 - 添加属性 对照服务器工程GameMsg增加对应字段 保存后在服务器脚本中操作数据库数据 添加数据层文件夹 创建脚本&#xff1a;DBMgr 编写脚本&#xff1a;DBMgr.cs 修改脚本&#xff1a;ServerRoot.cs 将MySql.d…

Java值传递、序列化详解

Java 值传递详解 说到参数&#xff0c;我们先来搞懂一下这两个概念 形参&实参 值传递&引用传递 形参&实参 方法的定义可能会用到 参数&#xff08;有参的方法&#xff09;&#xff0c;参数在程序语言中分为&#xff1a; 实参&#xff08;实际参数&#xff0c;…

10.11作业

实现简单数据库功能 &#xff08;增删改查&#xff09; widget.h #ifndef WIDGET_H #define WIDGET_H #include <QSqlDatabase> // 数据库管理类 #include <QWidget> // #include <QSqlQuery> #include <QSqlRecord> //记录类 #include …

若依 从字典类型跳到字典数据跳到了404

描述&#xff1a; 在字典类型从表中字典类型跳转到详情的字典数据时跳到了404 解决过程&#xff1a; 由于我的id统一是用GUID&#xff0c;所以想到了路由表相关路由的正则校验&#xff0c;若依是int类型&#xff0c;我直接删掉了&#xff0c;改了之后还是跳404 后面想是路由表…

【微服务】网关 - Gateway(下)(day8)

网关过滤工厂 在上一篇文章中&#xff0c;主要是对网关进行了一个总体的介绍&#xff0c;然后对网关中的断言进行了一个描述。在这篇文章中&#xff0c;主要是对网关中的最后一大核心——过滤进行介绍。 当客户端发送过来的请求经过断言之后&#xff0c;如果还想在请求前后添…

智能制造与精益制造的模型搭建

现行制造模式分析I-痛点改善思路-管控省优四化推行

中间件有哪些分类?

中间件的分类 中间件是位于操作系统和应用程序之间的软件&#xff0c;它提供了一系列服务来简化分布式系统中的应用程序开发和集成。中间件可以根据其功能和用途被分为不同的类别。以下是中间件的一些主要分类&#xff1a; 1. 通信处理&#xff08;消息&#xff09;中间件&am…

利用编程思维做题之反转链表

牛客网题目 1. 理解问题 给到我们的是一个单链表的头节点 pHead&#xff0c;要求反转后&#xff0c;返回新链表的头节点。 首先在心里设想能够快速理解的例子&#xff0c;如给你123序列&#xff0c;要你反转此序列如何回答&#xff1f;将最后一个数字3作为头&#xff0c;然后修…

使用Qt Creator创建项目

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示: 1. 新…

基于SpringBoot+Vue的非物质文化遗产保护与传播系统设计实现(地图组件)

&#x1f388;系统亮点&#xff1a;地图组件&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#x…

C/C++进阶(一)--内存管理

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 ​​​​​​项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…