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

news2024/10/10 4:20:04

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-controller
  labels:
    k8s-app: nginx-ingress-controller
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
       k8s-app: nginx-ingress-controller
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-controller
    spec:
      # 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: 60
      hostNetwork: true  #表示容器使用和宿主机一样的网络
      serviceAccountName: nginx-ingress-serviceaccount #引用前面创建的serviceacount
      containers:   
      - image: registry.cn-hangzhou.aliyuncs.com/peter1009/nginx-ingress-controller:0.20.0      #容器使用的镜像
        name: nginx-ingress-controller  #容器名
        readinessProbe:   #启动这个服务时要验证/healthz 端口10254会在运行的node上监听。 
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10  #每隔10做健康检查 
          timeoutSeconds: 1
        ports:
        - containerPort: 80  
          hostPort: 80    #80映射到80
#        - containerPort: 443
#          hostPort: 443
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        args:
        - /nginx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
#        - --default-ssl-certificate=$(POD_NAMESPACE)/ingress-secret    #这是启用Https时用的
#      nodeSelector:  #指明运行在哪,此IP要和default backend是同一个IP
#        kubernetes.io/hostname: 10.3.1.17   #上面映射到了hostport80,确保此IP80,443没有占用.
# 
      nodeName: node1

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

default backend代码

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
  labels:
    k8s-app: default-http-backend
  namespace: kube-system
spec:
  replicas: 1
  selector:
   matchLabels:
     k8s-app: default-http-backend
  template:
    metadata:
      labels:
        k8s-app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - 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 endpoint
        image: registry.cn-hangzhou.aliyuncs.com/hachikou/defaultbackend:1.0
        livenessProbe:
          httpGet:
            path: /healthz   #这个URI是 nginx-ingress-controller中nginx里配置好的localtion 
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30   #30s检测一次/healthz
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
#        resources:
#          limits:
#            cpu: 10m
#            memory: 20Mi
#          requests:
#            cpu: 10m
#            memory: 20Mi
      nodeName: node1
---
apiVersion: v1
kind: Service     #为default backend 创建一个service
metadata:
  name: default-http-backend
  namespace: kube-system
  labels:
    k8s-app: default-http-backend
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    k8s-app: default-http-backend

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

不同的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.coloradmin.cn/o/2195608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

City Builder Urban 城市都市街道建筑场景模型

目前拥有178项优质资产。 城市建设者:Urban一个高质量的资产包,专为快速的纽约式城市建设而设计,与所有渲染管道兼容。 资产 56个带LOD的街道和屋顶道具 13个可堆叠的建筑部件与LOD混合搭配 10个不同尺寸的建筑装饰/分离器,总共40个装饰 请参阅秋季列表的技术细节 1个带有C…

【redis-07】redis实现主从复制架构和底层原理

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

UE管理内容 —— FBX Static Mesh Pipeline

目录 General Setup Export Mesh Static Mesh LODs FBX导入流程中加入 静态网格体 支持后,将网格体从3D软件加入虚幻引擎的操作便极为简便;网格体导入后,网格体的材质纹理(仅限漫反射和法线贴图)也将被导入&#xf…

Bianchi模型、python计算及ns3验证

由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。 本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比: 1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时…

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制,通常采用双 PI 控制器和 S…

Linux系统创建新分区并挂载的方法

一、引言 本文以CentOS为例讲述Linux系统创建新分区并挂载的方法。如下图所示,用fdisk -l命令可以看到该CentOS系统下有一个磁盘/dev/vda,其容量为2199G,即2T。该磁盘有两个分区:vda1和vda2: 用lsblk命令可以查看到磁…

Ancient City Ruins 古代城市遗址废墟建筑游戏场景

这个包包含450多个古代遗迹预制件,可组合模块化预制件和许多建筑元素。它适用于室内和室外,并允许不同层次的定制建筑。 [亮点] 超过450个古代遗迹的预制件 可组合的模块化预制件 许多建筑元素 适用于室内和室外 允许不同层次的自定义建筑 预制房间和建筑 废墟装饰道具 基本自…

jQuery——循环翻页

本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中自动翻页功能的学习。

【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题🚩题意与思路 ⭐返回贪心🚩原理(反悔池)🚩落实到题🚩AC code ⭐练习题⭐END🌟交流方式 ⭐例题 经典例题: 871. 最低加油次数 🚩题意与思路 题意&#xf…

【光追模组】使命召唤7黑色行动光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好,今天小编我给大家继续引入一款游戏mod,这次这个模组主要是针对使命召唤7黑色行动进行修改,如果你觉得游戏本身光影有缺陷,觉得游戏色彩有点失真的话,或者说你想让使命召唤7这款游戏增加对光线追踪的支持的话&am…

RESTful风格接口+Swagger生成Web API文档

RESTful风格接口Swagger生成Web API文档 文章目录 RESTful风格接口Swagger生成Web API文档1.RESTful风格接口RESTful简介RESTful详细图示常见http状态码springboot实现RESTfulRESTful springboot设计实例demo 2.Swagger生产Web API文档Swagger简介使用Swagger1.加入依赖2.配置S…

C++笔记之shared_ptr的reset()函数

C++笔记之shared_ptr的reset()函数 code review! std::shared_ptr 的 reset() 函数用于管理指针的生命周期。以下是它的几种用法和功能: 用法 无参数调用: reset() 会释放当前管理的对象,并将指针置为空。std::shared_ptr<int> ptr = std::make_shared

数据库原理及应用:用实例理解关系代数(传统集合运算和专门关系运算)

&#xff01;注意&#xff01;&#xff1a;本篇博客只是利用实例来更好地理解关系代数&#xff0c;有关本章内容专业的表达式在此篇博客中未被提及。本博客中关系和表格这两个表达是等价的。 关系操作分为传统集合运算和专门关系运算&#xff0c;这一篇博客我们将从实例进行关系…

Go基本数据结构

1.jdk丰富的数据结构 Jdk提供了许多基本数据结构的实现&#xff0c;这些数据结构是Java Collections Framework的一部分&#xff0c;位于java.util包中。以下是一些常见的数据结构&#xff1a; ArrayList&#xff1a;一个可调整大小的数组实现&#xff0c;支持快速随机访问。 …

[Algorithm][贪心][合并区间][无重叠区间][用最少数量的箭引爆气球]详细讲解

目录 1.合并区间1.题目链接2.算法原理详解3.代码实现 2.无重叠区间1.题目链接2.算法原理详解3.代码实现 3.用最少数量的箭引爆气球1.题目链接2.算法原理详解3.代码实现 1.合并区间 1.题目链接 合并区间 2.算法原理详解 区间问题思路&#xff1a; 排序 左端点(本题)右端点 根…

Docker安装及使用记录

本文汇总一下 Docker 的安装过程和使用过程中的问题 安装过程 Windows Linux 更新软件源&#xff1a;Linux安装前可先更新以下各自发行版包管理器的软件源 卸载旧版本&#xff1a;如果之前安装过的话&#xff0c;可以先卸载 yum remove docker docker-common docker-sel…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

基于SpringBoot“花开富贵”花园管理系统【附源码】

效果如下&#xff1a; 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升&#xff0c;越来越多的人开始追求与自然和谐共生的生活方式&#xf…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…