【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,一经查实,立即删除!

相关文章

白骑士的C#教学附加篇 5.1 C#开发工具

系列目录 上一篇&#xff1a;白骑士的C#教学实战项目篇 4.4 游戏开发 在这一部分&#xff0c;我们将介绍一些额外的内容和工具&#xff0c;以帮助您提高 C# 开发的效率和质量。掌握合适的开发工具和调试技巧&#xff0c;可以让您在编写和维护代码时更加高效和从容。 开发工具对…

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

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

学习笔记第二十八天

有名管道&#xff08;FIFO&#xff09; 有名管道是Linux系统中一种特殊的文件类型&#xff0c;它允许不相关的进程之间进行通信。有名管道在文件系统中具有具体的路径和名称&#xff0c;因此可以被多个进程共同访问。 特点 持久性&#xff1a;有名管道在文件系统中以文件的形…

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、…

【Java】 Java 中的 BufferedReader 详解

我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 &#x1f3b5; 许嵩《内线》 在 Java 中&#xff0c;处理文件输入和输出操作时&#xff…

如何开发一款流畅、稳定、有趣味性的棋类游戏?

开发一款流畅、稳定且具有趣味性的棋类游戏&#xff0c;需要从多个角度出发&#xff0c;进行全面的设计和技术实现。以下是开发过程中的关键要素&#xff1a; 1. 明确游戏规则与玩法设计&#xff1a; 首先&#xff0c;确定棋类游戏的基本规则和核心玩法。规则需要严谨而不复杂…

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

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

东南大学:Wi-Fi 6搭档全光以太,打造“数智东南”信息高速路

东南大学&#xff1a;Wi-Fi 6搭档全光以太&#xff0c;打造“数智东南”信息高速路 - 华为企业业务 打好ICT底座&#xff0c;平台和应用层面就会非常通畅了。首先&#xff0c;出海企业的需求既有普遍性&#xff0c;也有垂直性行业的特性需求。普遍性需求需要通信、沟通数据和传…

虚幻反射-

在Unreal Engine中&#xff0c;如果你想获取一个AActor中的所有FProperty&#xff0c;可以使用TFieldIterator来遍历特定类的属性。以下是一些关键步骤和示例代码&#xff1a; 包含必要的头文件&#xff1a;首先&#xff0c;确保包含了反射相关的头文件。 #include "Engin…

GB/T 26825-2011 FJ抗静电防腐胶检测

FJ抗静电防腐胶是指涂覆于石油、化工贮运设备或建筑物室内地面上&#xff0c;能够防止静电积累并疏导静电快速释放的防腐蚀材料。 GB/T 26825-2011 FJ抗静电防腐胶检测项目&#xff1a; 测试项目 测试方法 干燥时间 GB/T 1728 硬度 GB/T 6739 粘接强度 GB/T 26825 抗压…

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 : …

Kali Linux网络问题解决与静态IP配置技巧

很多用户在使用 Kali Linux 时会遇到无法联网的问题&#xff0c;尤其是在 VMware 虚拟机中。这种情况相当常见&#xff0c;一般都是没有配置DNS服务器或者网卡配置文件的IP和虚拟网络编辑器的IP不一致所导致的&#xff0c;下面我们将探讨如何在 Kali Linux 中配置 DNS 服务和设…

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…

SQL - 事务

事务是代表单个工作单元的一组SQL语句&#xff0c;当我们需要对数据库进行多次更改的情况下&#xff0c;要使用事务&#xff0c;我们希望所有这些更改作为一个单元一起成功或失败事务属性 (ACID) 原子性(Atomicity)&#xff1a;事务中的所有操作要么全部完成&#xff0c;要么全…

各种文件的预览下载(docx,pdf,txt,图片)

一、word 1、word的预览可以用onlyoffice 2、word的预览下载 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div onclick"FilehandleClick()">word文件</…

Android -- 谷歌地图绘制

引言 集成之后&#xff0c;在项目中肯定要打点&#xff0c;画线&#xff08;实线&#xff0c;虚线&#xff09;&#xff0c;绘制区域等。 Android 谷歌地图绘制轨迹polyline 在Android中使用Google Maps绘制轨迹polyline的基本步骤如下&#xff1a; 确保你的项目已经正确集成…

spring:Springboot升级到最新的3.0或者java8升级到java17所需要的改动(持续更新)

背景 Spring Boot 2.x 升级到 Spring Boot 3.x 需要使用Java 17或更高版本&#xff0c;所以有些地方需要改动 pom.xml文件改动 修改pom.xml文件&#xff0c;version版本根据实际情况配置最新。 <!-- java.version版本8更换为17 --> <java.version>17</java.…

JS中链式调用的实现和应用

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 不知你是否注意过&#xff0c;链式调用在编程中还是很普遍的&#xff0c;无论是原生JavaScript还是在一些框架和库中&#xff0c;都会看到它们的身影。今天我们一探究竟&#xff0c;看下链式调用是怎么…