k8s给多个外部静态IP作负载均衡、反向代理

news/2024/10/12 6:23:12

在 Kubernetes (K8s) 中,Ingress、Endpoints 和 Service 是三个重要的概念,它们协作实现了集群内部和外部应用程序的访问和服务发现。

Ingress:

  • Ingress 用于提供集群外部到集群内部服务的 HTTP/HTTPS 路由。
  • Ingress 定义了访问集群内部服务的规则,如路径映射、虚拟主机等。
  • Ingress 通常需要搭配 Ingress Controller 来实现实际的流量转发和负载均衡。
  • Ingress 位于应用程序的前端,处理七层(HTTP/HTTPS)流量。

Endpoints:

  • Endpoints 用于记录提供某个 Service 的 Pod 的 IP 地址和端口信息。
  • Endpoints 由 Kubernetes 根据 Pod 的变化自动创建和管理,生命周期与 Pod 相关。
  • Endpoints 位于应用程序的后端,主要用于服务发现,记录提供服务的 Pod 信息。
  • Endpoints 通过 Pod 的 IP 地址和容器端口直接提供访问。

Service:

  • Service 用于对外暴露应用程序的访问入口,提供四层(TCP/UDP)的负载均衡功能。
  • Service 由用户通过 YAML 文件进行配置,生命周期独立于 Pod。
  • Service 位于应用程序的前端,处理四层(TCP/UDP)流量。
  • Service 通过 ClusterIP、NodePort 或 LoadBalancer 方式提供访问。

Ingress、Endpoints 和 Service 的关系:

  • Ingress 定义了从集群外部到集群内部服务的 HTTP/HTTPS 路由规则。
  • Service 根据 Endpoints 信息提供四层负载均衡,Endpoints 记录了提供服务的 Pod或 IP信息。
  • Ingress 将流量转发到对应的 Service,Service 再根据 Endpoints 信息进行负载均衡和流量分发。

总的来说,Ingress、Endpoints 和 Service 在 K8s 中协作完成了应用程序的访问和服务发现。Ingress 负责处理集群外部到集群内部的 HTTP/HTTPS 流量路由,Service 提供了应用程序的访问入口和四层负载均衡功能,Endpoints 则记录了提供服务的 Pod或 IP信息。它们共同实现了 K8s 中应用程序的访问和部署。

以下是给多个外部静态IP作负载均衡、反向代理,先创建 Service+Endpoints:

apiVersion: v1
kind: Service
metadata:name: zl-lbnamespace: wetwin
spec:#type: ExternalName # 可用于单IP#externalName: "10.254.18.46" type: ClusterIPports:- port: 80protocol: TCPtargetPort: 80---
apiVersion: v1
kind: Endpoints
metadata:name: zl-lbnamespace: wetwin
subsets:
- addresses: #单机IP时不需要- ip: 10.254.18.46- ip: 10.254.18.47ports:- port: 80protocol: TCP

 

再创建 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/proxy-body-size: 500Mnginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/server-snippet: | #防爬if ($http_user_agent ~* (Scrapy|Go-http-client|HttpClient|curl)) {return 403;}name: xxx.your-domain.comnamespace: wetwin #自定义spec:ingressClassName: nginxrules:- host: xxx.your-domain.com #自定义http:paths:- backend:service:name: zl-lbport:number: 80path: /lb/(zl/.*) #自定义pathType: Prefixtls: #可选- hosts:- xxx.your-domain.comsecretName: xxx.com
status:loadBalancer:ingress:- ip: 10.254.18.55 #出口IP

 

在这个示例中:

  1. nginx.ingress.kubernetes.io/rewrite-target: /$1 注解告诉 Ingress 控制器将匹配到的 URL 路径中的捕获组 $1 重写到后端服务的实际路径。
  2. path: /xxx/(.*) 定义了一个前缀匹配路径 /xxx/,并使用一个捕获组 (.*) 来捕获后面的任意路径。
  3. 当用户访问 /xxx/anything 时,Ingress 控制器会将请求重写为 /anything,并转发到后端的服务。

通过这种方式,您可以灵活地将传入的 URL 路径映射到后端服务的正确路径,而无需在后端服务中硬编码这些路径。这对于迁移或重构现有应用程序非常有用。

除了 rewrite-target 注解,Ingress 还支持其他一些路径重写相关的注解,如 nginx.ingress.kubernetes.io/app-rootnginx.ingress.kubernetes.io/use-regex 等,您可以根据需求进行配置。

 

效果如下 :

 

 

 

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

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

相关文章

nuxt3项目自定义环境变量,typescript全局提示

最近使用nuxt3框架来写项目,其中有一点就是 typescript 语法提示让人闹心,使用 vscode 编辑器,如果有语法提示进行编码,工作效率可以提升一个档次。本篇文章说的就是如何在 vscode 中使用 nuxt3 框架,自定义环境变量,支持 typescript 语法提示。列出当前使用的环境版本no…

STM32与Linux串口双向通信

STM32 与 linux 双向串口通信实验本文记录STM32 与 linux 双向串口通信,包含stm32发送、Linux阻塞式接收;Linux发送,STM32阻塞式接收;本实验的目的在于调通数据链路,为之后使用奠定基础。 实验平台为:STM32方面用的是STM32H723ZGT6为核心的开发板;开发环境为 VSCode + AC…

Java基础-学习笔记14

Collection、Map 类实现14 集合 Collection、Map 第一部分 Collection的框架体系 1) 可以动态保存任意多个对象,使用比较方便 2) 提供了一系列方便的操作对象的方法:add、remove、set、get等 3) 使用集合添加、删除新元素简单便捷。 集合 Collection 主要是两组:单列集合…

Apache SeaTunnel技术架构演进及其在AI领域的应用

随着数据集成需求的增长,Apache SeaTunnel作为新一代的数据同步引擎,不仅在技术架构上不断演进,也在AI领域展现出其独特的应用价值。在CommunityOverCode Asia 2024大会上,Apache SeaTunnel PMC Chair 高俊 深入探讨SeaTunnel的技术演进路径,分析其在AI领域的应用案例,并…

Windows 系统 局域网文件夹共享无法访问的终极解决方法

先介绍 Win10 无法访问其他电脑的解决方法首先,Win10 能成功访问共享文件夹,必须有安装 SMB1 协议,否则会提示找不到网络名称的提示。 方法很简单,点击 微软小娜 Cortana 输入 启用或关闭 Windows 功能(或者直接输入 功能 也能找到),打开 启用或关闭 Windows 功能 对话框…

使用 updateAppConfig 更新 Nuxt 应用配置

title: 使用 updateAppConfig 更新 Nuxt 应用配置 date: 2024/8/27 updated: 2024/8/27 author: cmdragon excerpt: 通过使用 updateAppConfig,你可以轻松地在应用运行时更新配置,而无需重新启动应用。这对于需要在运行时调整设置的应用场景非常有用。 categories:前端开发…

AtCoder Beginner Contest 051

A - Haiku 直接模拟。 #include <bits/stdc++.h>using namespace std; using i64 = long long;int main() {ios::sync_with_stdio(false), cin.tie(nullptr);string s;cin >> s;string a, b, c;a = s.substr(0, 5);b = s.substr(6, 7);c = s.substr(14);cout <&…

PEP 508:为不同版本Python指定不同依赖

如果使用Python第三方包的某一个版本有问题,而不同版本Python所对应的软件最新版本又不一致,这种情况下如何在requirements.txt文件中指定软件最高版本是非常重要的。这里根据PEP 508的规范,做了一个Numpy版本要求numpy<=1.21.6 || 1.28>numpy>=1.23的示例。问题背…