【Kubernetes】集群外部的请求访问集群内应用的最佳方式:Ingress

Service 服务》系列,共包含以下文章:

  • Service 概念与实战
  • Service 类型:NodePort、ClusterlP、LoadBalancer、ExternalName
  • 虚拟 IP 与 Service 的代理模式
  • 集群外部的请求访问集群内应用的最佳方式:Ingress

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

集群外部的请求访问集群内应用的最佳方式:Ingress

  • 1.Ingress 是什么
  • 2.使用 Ingress Controller 创建 Ingress
  • 3.Ingress 注解
  • 4.基于 Ingress 的高可用架构

Kubernetes 通过 Service 为 Pod 提供了统一的入口地址,并使用 NodePort 和 LoadBalance 类型的 Service 让 外部的请求 可以访问 集群内部的应用

但是,使用 NodePort 和 LoadBalance 类型有以下缺点:

  • NodePort 类型通过在每个节点上暴露一个端口作为外部访问的入口,因此当 Service 很多时,这种方式会占用集群的大量端口。
  • LoadBalance 类型需要为每一个 Service 都定义一个负载均衡器,会浪费资源。

因此,Kubernetes 提供了 Ingress 域名访问应用 的方式,这也是从集群外部访问集群内应用的最佳方式。

在这里插入图片描述

1.Ingress 是什么

Ingress 的本质是,定义了一组从域名(或 URL)到 Service 的路由转发规则。Ingress 不会公开端口信息和所使用的协议,而是通过配置 HTTP 或 HTTPS 的路由规则,来实现从集群外部访问集群内应用的 URL 并实现负载均衡功能。

要创建和配置 Ingress 路由转发规则,则需要使用 Ingress Controller。它可以由任何具有 反向代理 功能的应用(如 Nginx 和 Haproxy)来实现。

Ingress 的工作机制如下图所示。
在这里插入图片描述

2.使用 Ingress Controller 创建 Ingress

下面来演示如何使用 Ingress Controller 创建 Ingress,从而实现从集群外部访问集群内部的应用。首先部署 Ingress Controller,再部署应用服务,最后创建 Ingress 的路由规则从集群外部访问集群内部的应用。

在这里插入图片描述
在 GitHub 上搜索 kubernetes/ingress-nginx。🚀 https://github.com/kubernetes/ingress-nginx

🚀 ingress-nginx is an Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer.

安装 NGINX Ingress Controller(使用 ingress-nginx 项目的官方清单)。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml

输出的信息如下:

在这里插入图片描述

检查 Ingress Controller Pod 是否已启动。

kubectl get pods -n ingress-nginx -o wide

在这里插入图片描述

检查是否能看到 NodePort 服务。

kubectl get services -n ingress-nginx

在这里插入图片描述

从 Ingress-NGINX 控制器 v1.0.0 版本开始,需要一个 ingressclass 对象。在默认安装中,已经创建了一个名为 nginxingressclass 对象。

kubectl get ingressclasses -n ingress-nginx

在这里插入图片描述

如果这只是 Ingresss-NGINX 控制器的实例,您应该在入口类中添加注释 ingressclass.kubernetes.io/is-default-class

kubectl annotate ingressclasses nginx ingressclass.kubernetes.io/is-default-class="true" -n ingress-nginx

在这里插入图片描述

🚀 在集群中,我们可以设定一个默认的 IngressClass,以便处理所有没有指定 IngressClass 的 Ingress 资源。通过将 ingressclass.kubernetes.io/is-default-class 注解的值设定为 true,来使没有设置 ingressClassName 的 Ingress 使用此默认的 IngressClass。 修改后必须新创建的 Ingress 才会默认使用。

尝试使用上一步中的 NodePort 连接 Ingress 控制器。

curl 10.107.109.133

如果您尚未配置任何后端服务,您应该会看到来自 Nginx 的 404 Not Found。现在这样就可以了。

在这里插入图片描述

如果您看到 Nginx 的响应,则表明 Ingress Controller 正在运行并且您可以访问它。

部署一个小型测试应用程序(httpd Web 服务器)来验证您的 Ingress 控制器。

创建以下 YAML 文件并将其命名为 simple-web-server-with-ingress.yaml

apiVersion: v1
kind: Namespace
metadata:name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:name: web-servernamespace: web
spec:selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: httpdimage: httpd:2.4.53-alpineports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: web-server-servicenamespace: web
spec:selector:app: webports:- protocol: TCPport: 5000targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: web-server-ingressnamespace: web
spec:ingressClassName: nginxrules:- host: web.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: web-server-serviceport:number: 5000

部署应用程序:

kubectl apply -f simple-web-server-with-ingress.yaml

查看 Pod、Deployment、Service 和 Endpoint 的信息。

kubectl get pod,deploy,svc,ep -n web -o wide

在这里插入图片描述

查看创建的 Ingress。

kubectl get ingress -n web

在这里插入图片描述

验证您是否可以使用 NodePort 访问您的应用程序。

curl 10.107.109.133 -H 'Host: web.example.com'

如果成功,您应该看到 <html><body><h1>It Works!</h1></body></html>

在这里插入图片描述

编辑 hosts 文件加入 IP 地址与域名的对应关系,如下:

10.107.109.133 web.example.com

通过域名访问应用,如下图所示。

在这里插入图片描述

3.Ingress 注解

有时默认的配置并不一定能满足实际的需求,这时可以通过修改 Ingress 的 注解annotations)来实现对特定参数的配置。在每次修改 Ingress 注解后,Ingress Controller 会立即加载新的配置。

下面是官方提供的一个示例。该示例将完成文件上传功能。但默认情况下上传的请求大小是 1 MB,修改注解可以改变请求的大小限制。例如,下面将请求的大小设置为 2 MB。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: openbayes-server-ingannotations:nginx.ingress.kubernetes.io/proxy-body-size: "2048"nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:rules:- http:paths:- path: /apibackend:serviceName: openbayes-server-svcservicePort: 80

下表为常用的 Ingress 注解。

注解名称
作用
nginx.ingress.kubernetes.io/app-root定义应用根目录
nginx.ingress.kubernetes.io/rewrite-target执行 URL 重定向
nginx.ingress.kubernetes.io/use-regex开启路径正则匹配
nginx.ingress.kubernetes.io/affinity开启会话的粘连
nginx.ingress.kubernetes.io/ssl-redirect开启 HTTP 到 HTTPS 的跳转
nginx.ingress.kubernetes.io/force-ssl-redirect即使未启用 TLS 也会强制重定向到 HTTP

4.基于 Ingress 的高可用架构

Ingress 的路由规则是由 Ingress Controller 创建和维护的,因此,Ingress Controller 的 高可用性 就显得非常重要了。如果在 Kubernetes 集群中只存在一个 Ingress Controller,则必然会造成 单点故障。为了解决这个问题,可以采用 Ingress Controller 的 多副本部署,并将其作为 DaemonSet 的守护进程在每个节点上启动一个。

为了最大限度地利用 Ingress 进行路由,建议可以将 Ingress Controller 以独占方式部署,这样可以避免业务应用与 Ingress 服务争用资源。

下图展示了基于 Ingress 的高可用架构,其中引入了 KeepAlived 以实现从公网域名到机房的公网 IP 地址服务器的路由解析。
在这里插入图片描述

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

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

相关文章

智慧水务项目(七)vscode 远程连接ubuntu 20.04 服务器,调试pyscada,踩坑多多

一、说明 以前用过pycharm&#xff0c;远程连接还可以&#xff0c;但是vscode用以前还可以&#xff0c;就用它开发python了&#xff0c;想搞个远程&#xff0c;源码直接放服务器上&#xff0c;能远程调试&#xff0c;其实也很方便的&#xff0c;结果第一次还成功了&#xff0c;…

LeetCode刷题笔记第231题:2 的幂

LeetCode刷题笔记第231题&#xff1a;2 的幂 题目&#xff1a; 想法&#xff1a; 对输入的数值循环除以2直至数值小于等于1&#xff0c;如果最终的数值为1则为2的幂&#xff0c;小于1则不是2的幂。 class Solution:def isPowerOfTwo(self, n: int) -> bool:if n 1:retur…

SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结

目录 1、SpringBoot的事务管理 2、SpringBoot的异步任务 3、SpringBoot定时任务调度 4、SpringBoot整合Mail发送邮件 5、Spring框架中的Bean的作用域 6、Spring框架中的Bean的线程安全 7、 Spring框架中的Bean生命周期 8、Spring框架如何解决循环依赖&#xff1f; 9、…

HarmonyOS Next 系列之列表下拉刷新和触底加载更多数据实现(十一)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

Golang | Leetcode Golang题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; func rob(root *TreeNode) int {val : dfs(root)return max(val[0], val[1]) }func dfs(node *TreeNode) []int {if node nil {return []int{0, 0}}l, r : dfs(node.Left), dfs(node.Right)selected : node.Val l[1] r[1]notSelected : …

mysql windows安装与远程连接配置

安装包在主页资源中 一、安装(此安装教程为“mysql-installer-community-5.7.41.0.msi”安装教程&#xff0c;安装到win10环境) 保持默认选项&#xff0c;点击”Next“。 点开第一行加号展开一路展开找到“MySQL Server 5,7,41 - X64”点击选中点击一下中间只想右侧的箭头看到…

Element-02.组件-Table表格

一.常见组件-表格 二.具体操作 <template><el-table:data"tableData"borderstyle"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-columnprop&q…

Chat App 项目之解析(二)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

SpringBoot项目部署时application.yml文件的加载优先级和启动脚本

文章目录 application.yml文件的加载优先级(由高到低)第一级命令行参数第二级Jar包同级目录 /config第三级Jar包同级目录第四级classpath 下的/config第五级classpath 根路径/总结&#xff1a; logback.xml 文件加载顺序当application.yml 和 bootstrap.yml 同时存在时java jar…

【iOS】Block底层分析

目录 前言Block底层结构Block捕获变量原理捕获局部变量&#xff08;auto、static&#xff09;全局变量捕获实例self Block类型Block的copyBlock作为返回值将Block赋值给__strong指针Block作为Cocoa API中方法名含有usingBlock的方法参数Block作为GCD API的方法参数Block属性的写…

使用QGraphicsView思想做一个简单图片查看器

使用QGraphicsView思想做一个简单图片查看器 如果要做一个图片查看器&#xff0c;支持放大、滚动操作&#xff0c;比较直接的方法是&#xff0c;使用QWidget来显示完整图片&#xff0c;将QWidget放入QScrollArea。缩放时调整QWidget的尺寸&#xff0c;QScrollArea会自动调整滚…

MBR20200FCT-ASEMI智能AI专用MBR20200FCT

编辑&#xff1a;ll MBR20200FCT-ASEMI智能AI专用MBR20200FCT 型号&#xff1a;MBR20200FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环峰值反向电压&#xff08;VRRM&a…

别再问了!微信小程序的那些事儿,一文搞定

微信小程序是一种无需下载安装即可使用的应用&#xff0c;它嵌入在微信生态中&#xff0c;用户通过微信扫一扫或搜索即可快速访问。 无论是购物、订餐、预约服务&#xff0c;还是玩个小游戏、看篇文章&#xff0c;都不需要下载额外的APP&#xff0c;直接就能在微信里搞定。不会…

联想电脑如何查看ip地址?详细介绍几种方法

随着互联网的普及和技术的飞速发展&#xff0c;IP地址已成为我们日常网络活动中不可或缺的一部分。无论是访问网站、远程办公还是进行网络游戏&#xff0c;IP地址都扮演着重要的角色。对于联想电脑用户来说&#xff0c;了解如何查看自己的IP地址是一项基本技能。虎观代理小二将…

JSON Web Token (JWT): 理解与应用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的&#xff0c;因为它可以使用JSON对象在各方…

【向量数据库】Ubuntu编译安装FAISS

参考官方的安装指导&#xff1a;https://github.com/facebookresearch/faiss/blob/main/INSTALL.md&#xff0c;不需要安装的可以跳过 ~$ wget https://github.com/facebookresearch/faiss/archive/refs/tags/v1.8.0.tar.gz ~$ tar -zxvf v1.8.0.tar.gz ~$ cd faiss-1.8.0 ~$ …

易基因:RNA修饰N4-乙酰胞苷(ac4C)的调控机制、检测方法及其在癌症中的作用最新研究进展|新方向

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 N4-乙酰胞苷&#xff08;ac4C&#xff09;是一种高度保守的化学修饰&#xff0c;广泛存在于真核和原核生物RNA中&#xff0c;如tRNA、rRNA和mRNA。这种修饰与多种人类疾病显著相关&#…

vuex的原理和使用方法

简介 Vuex 是 Vue.js 应用的状态管理模式&#xff0c;它为应用内的所有组件提供集中式的状态&#xff08;数据&#xff09;管理。可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 Vuex的构成 state&#xff1a;state 是 Vuex 的数据中心&#xff0c;也就是说state是用来…

职业院校云计算实训室建设方案全景剖析

在信息化社会的今天&#xff0c;云计算作为一项关键技术&#xff0c;正在迅速改变着教育和培训的方式。本文旨在探讨如何通过"职业院校云计算实训室建设方案"&#xff0c;为学生提供一个现代化、高效的学习和研究环境&#xff0c;以适应云计算技术的发展和市场需求。…

软件测试---接口测试

一、接口及接口测试概念 &#xff08;1&#xff09;接口的类型 &#xff08;2&#xff09;接口测试的概念 &#xff08;3&#xff09;接口测试的原理 &#xff08;4&#xff09;接口测试的特点 &#xff08;5&#xff09;接口测试的实现方式 二、HTTP协议 &#xff08;1&#…