k8s--集群内的pod调用集群外的服务

关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。

可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs,或者直接使用Pod网络。每种方法都有不同的适用场景,需要逐一分析。

例如,ClusterIP是默认的,只能在集群内部访问,所以可能需要其他方式。NodePort会在每个节点上开放端口,用户可以通过节点的IP访问服务,但需要注意防火墙规则。HostNetwork让Pod共享节点的网络,可以直接访问节点的IP,但可能有安全隐患。ExternalIPs允许服务绑定外部IP,但需要确保IP在集群节点上可用。直接使用Pod网络的话,需要知道Pod的IP,但Pod重启后IP会变,这可能不太稳定。

另外,用户可能需要了解如何配置服务的Endpoints来指向外部服务的IP和端口,这样可以通过Kubernetes的服务发现机制来访问外部服务。这对于需要服务名解析的情况很有用,比如创建一个没有选择器的Service,然后手动定义Endpoints指向外部服务的地址。

还需要考虑网络策略和防火墙的问题,确保Kubernetes集群的节点和外部服务的电脑之间的网络是通的,端口没有被防火墙阻止。如果使用Calico等网络插件,可能需要调整网络策略。

然后,用户可能需要具体的步骤,比如如何创建Service和Endpoints,如何配置ExternalIPs或者HostNetwork。要给出示例的YAML配置,方便用户参考。

另外,用户可能不了解kube-proxy和网络插件的工作原理,是否需要深入解释?可能不需要太深入,但需要说明不同方法背后的原理,比如HostNetwork直接使用宿主机的网络命名空间,ExternalIPs需要由kube-proxy管理。

最后,可能需要总结各个方法的适用场景,帮助用户根据具体需求选择。比如如果外部服务变动频繁,使用Endpoints和Service可能更好;如果只是临时测试,用HostNetwork或NodePort更简单。

总结一下,我需要分步骤解释各种方法,给出配置示例,并提醒需要注意的网络连通性和安全问题。确保用户能够理解并选择适合他们的方案。

要让 Kubernetes 集群中的 Pod 访问同一局域网内的外部服务(例如你的物理机或虚拟机上的服务),可以通过以下几种方法实现。以下是具体步骤和注意事项:


方法 1:通过 Kubernetes Service 的 ExternalName 或手动 Endpoints

将外部服务抽象为 Kubernetes Service,使 Pod 通过 Service 名称访问外部服务。

步骤 1:创建指向外部服务的 Service
# external-service.yaml
apiVersion: v1
kind: Service
metadata:name: external-service
spec:type: ClusterIP  # 或 ExternalNameports:- protocol: TCPport: 80       # Service 监听的端口targetPort: 8080  # 外部服务的端口
---
# 如果是手动指定 Endpoints(推荐):
apiVersion: v1
kind: Endpoints
metadata:name: external-service
subsets:- addresses:- ip: 192.168.1.100  # 外部服务的局域网 IPports:- port: 8080         # 外部服务的端口
步骤 2:Pod 通过 Service 名称访问

在 Pod 中通过 external-service 这个 DNS 名称访问:

curl http://external-service:80

方法 2:直接通过局域网 IP 访问

如果外部服务的 IP 是固定的,Pod 可以直接通过局域网 IP 访问(需确保网络策略允许)。

步骤 1:确认 Pod 网络与局域网互通

• 确保 Kubernetes 集群的网络插件(如 Calico、Flannel)允许 Pod 与外部网络通信。
• 检查防火墙规则是否放行流量(尤其是 Node 的防火墙)。

步骤 2:在 Pod 中直接访问外部服务
curl http://192.168.1.100:8080

方法 3:使用 HostNetwork 模式

让 Pod 共享宿主机的网络命名空间,直接使用宿主机的 IP 和端口(慎用,存在安全隐患)。

步骤 1:配置 Pod 使用 HostNetwork
# pod.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:hostNetwork: true  # 共享宿主机网络containers:- name: mycontainerimage: nginx
步骤 2:访问外部服务

Pod 会直接使用宿主机的 IP(即 192.168.1.x),可以直接访问同一局域网的服务。


方法 4:配置 ExternalIPs

将外部服务的 IP 绑定到 Kubernetes Service,通过 Service 访问。

步骤 1:创建带有 externalIPs 的 Service
# external-ip-service.yaml
apiVersion: v1
kind: Service
metadata:name: external-ip-service
spec:ports:- protocol: TCPport: 80targetPort: 8080externalIPs:- 192.168.1.100  # 外部服务的 IP
步骤 2:通过 Service 的 ExternalIP 访问

在 Pod 中访问 192.168.1.100:80,流量会被转发到外部服务的 8080 端口。


方法 5:使用 NodePort 暴露外部服务

如果外部服务本身是 Kubernetes 集群外的服务,可以通过 NodePort 将流量转发到外部 IP。

步骤 1:创建 NodePort Service
apiVersion: v1
kind: Service
metadata:name: nodeport-external-service
spec:type: NodePortports:- port: 80targetPort: 8080nodePort: 30000  # 手动指定 NodePort 范围(默认 30000-32767)
步骤 2:通过任意节点的 IP + NodePort 访问

在 Pod 中访问 http://<任意节点IP>:30000,流量会通过 kube-proxy 转发到外部服务。


关键注意事项

  1. 网络策略
    • 确保 Kubernetes 节点的防火墙允许 Pod 与外部服务的通信。
    • 如果使用网络插件(如 Calico),检查是否配置了允许出站流量的 NetworkPolicy。

  2. DNS 解析
    • 如果外部服务有域名,确保 Pod 的 DNS 配置(如 /etc/resolv.conf)能解析该域名。

  3. 服务发现
    • 推荐使用方法 1(Service + Endpoints),因为可以利用 Kubernetes 的服务发现机制。

  4. 安全风险
    • 避免在生产环境使用 hostNetwork: true,可能导致端口冲突或安全漏洞。


总结

推荐方案:使用方法 1(Service + Endpoints)或方法 4(ExternalIPs),保持 Kubernetes 原生配置。
临时测试:使用方法 3(HostNetwork)或直接通过 IP 访问。

根据你的具体场景(如是否需要服务发现、是否允许直接暴露 IP)选择最合适的方案。

异常:

我个人的场景是跑了一个后但服务的pod,但是数据库,redis在我自己的电脑上,在公司我的电脑和集群的电脑是可以直接通信的,所以使用方法1来解决。但是似乎当我后端的pod重启之后,给外部服务创建的endpoint的以下部分就没有了

subsets:- addresses:- ip: 192.168.1.100  # 外部服务的局域网 IPports:- port: 8080         # 外部服务的端口

解决办法:不要在service中加上selector

首先,用户提到当手动创建Endpoints时,subsets下的地址和端口可能会消失。这可能涉及到几个常见的问题。我需要回忆一下Kubernetes中Service和Endpoints的工作原理。Service通常由标签选择器(selector)自动关联到Pod,生成对应的Endpoints。但当Service没有selector时,用户需要手动创建Endpoints,这正是用户的情况,因为他们要指向外部IP。

  1. 可能的原因一:Endpoints的metadata.name是否与Service的名称完全一致?Kubernetes通过名称来关联Service和Endpoints,如果名称不匹配,Endpoints不会被正确关联,导致Service没有对应的Endpoints,因此subsets可能显示为空或者被系统自动清理。
  2. 可能的原因二:是否有其他控制器或进程在修改Endpoints?例如,某些情况下,如果Service被错误地配置了selector,Kubernetes会尝试自动管理Endpoints,覆盖用户手动创建的配置。用户可能在创建Service时不小心添加了selector,导致系统自动生成Endpoints,覆盖了手动配置。
  3. 可能的原因三:Endpoints的配置是否正确?比如缩进错误、端口定义不正确等YAML格式问题,可能导致Endpoints对象虽然被创建,但无法被正确识别,从而被系统忽略或删除。
  4. 可能的原因四:是否存在其他资源冲突?例如,同名的Endpoints被其他资源管理,或者用户误删了Endpoints对象。

在 Kubernetes 中,当通过 Service + Endpoints 方式将外部服务引入集群时,如果 Endpoints 中的 subsets 配置(如 IP 和端口)自动消失,通常是由以下原因导致的:


1. Service 意外配置了 Selector

如果 Service 中错误地配置了 selector 字段,Kubernetes 会认为该 Service 需要自动关联 Pod,并尝试根据 selector 自动生成和管理 Endpoints。此时手动创建的 Endpoints 会被系统覆盖,导致 subsets 消失。

验证方法
kubectl describe service <service-name>

检查输出中是否有 Selector 字段。如果存在类似以下内容,说明配置错误:

Selector: app=my-app  # 非空表示 Service 关联了 Pod
修复方法

确保 Service 没有 selector 字段

apiVersion: v1
kind: Service
metadata:name: external-postgres
spec:ports:- protocol: TCPport: 5433targetPort: 5433# 注意:此处不能有 selector!

2. Endpoints 名称与 Service 名称不匹配

Kubernetes 要求 Endpointsmetadata.name 必须与 Service 的名称完全一致,否则两者无法关联,导致手动创建的 Endpoints 失效。

验证方法
kubectl get endpoints <endpoints-name> -o yaml

检查 metadata.name 是否与 Service 名称一致。

修复方法

确保 Endpointsmetadata.name 与 Service 名称一致:

apiVersion: v1
kind: Endpoints
metadata:name: external-postgres  # 必须与 Service 名称相同
subsets:- addresses:- ip: 10.210.200.77ports:- port: 5433

3. Endpoints YAML 格式错误

Endpoints 的 YAML 格式必须严格符合规范。常见的错误包括:
• 错误地在 Endpoints 中添加了 spec 字段(实际不需要)。
subsets 的缩进或层级错误。

错误的配置示例
apiVersion: v1
kind: Endpoints
metadata:name: external-postgres
spec:  # 错误!Endpoints 不需要 spec 字段subsets:- addresses:- ip: 10.210.200.77ports:- port: 5433
正确的配置
apiVersion: v1
kind: Endpoints
metadata:name: external-postgres
subsets:  # 直接定义 subsets,无需 spec- addresses:- ip: 10.210.200.77ports:- port: 5433

4. 其他控制器或工具干扰

某些 Kubernetes 组件或第三方工具(如服务网格、监控组件)可能会监听并修改 Endpoints。例如:
Istio:如果启用了自动 Sidecar 注入,可能会修改 Endpoints
Kubernetes 事件控制器:某些异常事件可能导致 Endpoints 被重置。

验证方法

检查 Endpoints 的变更历史:

kubectl get endpoints <endpoints-name> -o yaml --watch
修复方法

• 如果使用了服务网格,检查其文档是否需要特殊配置。
• 通过 kubectl edit endpoints <name> 手动修复 subsets,观察是否再次被修改。


5. 网络策略或防火墙拦截

虽然与 Endpoints 配置无关,但如果 Kubernetes 节点无法访问外部服务的 IP 和端口,某些网络插件可能会错误地清理 Endpoints(极少见,但需排除)。

验证方法

在 Kubernetes 节点上测试外部服务的连通性:

# 在节点上执行
nc -zv 10.210.200.77 5433
nc -zv 10.210.200.77 6379

操作步骤总结

  1. 检查 Service 是否配置了 Selector

    kubectl describe service external-postgres
    
  2. 检查 Endpoints 名称和格式

    kubectl get endpoints external-postgres -o yaml
    
  3. 重新应用正确的配置

    kubectl apply -f external-postgres.yaml
    
  4. 监控 Endpoints 变更

    kubectl get endpoints external-postgres -w
    

最终解决方案

如果以上步骤仍无法解决,提供一个完整的正确配置模板:

Service 定义(external-postgres.yaml)
apiVersion: v1
kind: Service
metadata:name: external-postgres
spec:ports:- protocol: TCPport: 5433targetPort: 5433
Endpoints 定义(external-postgres-endpoints.yaml)
apiVersion: v1
kind: Endpoints
metadata:name: external-postgres  # 必须与 Service 同名
subsets:- addresses:- ip: 10.210.200.77  # 外部服务 IPports:- port: 5433  # 外部服务端口

应用配置:

kubectl apply -f external-postgres.yaml
kubectl apply -f external-postgres-endpoints.yaml

关键验证命令

• 查看 Service 和 Endpoints 是否关联成功:

kubectl get svc,ep -l <service-name>

• 查看 Endpoints 详细信息:

kubectl get endpoints external-postgres -o yaml

通过以上步骤,Endpoints 中的 subsets 应能正确持久化,不会自动消失。

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

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

相关文章

数据模型,数据建模,组件,核心价值,使用,意义

数据模型 一组由符号,文本组成的集合, 用以准确表达信息景观, 达到有效交流,沟通的目的 数据建模 是发现,分析和确定数据需求的过程,是一种称为数据模型的精确形式表示和传递这些需求 数据模型的组件 实体, 关系, 属性和域 数据模型的核心价值 交流性 精确性 数据模型的…

【QA】外观模式在Qt中有哪些应用?

1. QWidget及其布局管理系统 外观模式体现 QWidget 是Qt中所有用户界面对象的基类&#xff0c;而布局管理系统&#xff08;如 QVBoxLayout、QHBoxLayout、QGridLayout 等&#xff09;就像是一个外观类。客户端代码&#xff08;开发者编写的界面代码&#xff09;通常不需要直接…

解锁云原生后端开发新姿势:腾讯云大模型API实战攻略

目录 云原生后端与大模型融合的开篇之章​ 探秘云原生后端开发​ 云原生后端是什么​ 云原生后端架构核心要素​ 微服务架构​ 容器化技术​ 服务发现与配置管理​ Kubernetes 编排​ 走进腾讯云大模型知识引擎​ 引擎独特功能与优势​ DeepSeek - R1、V3 两款模型 …

AWS NoSQL解决方案全景图

&#xff08;技术架构对比表&#xff09; 服务名称数据模型协议兼容性核心架构特性适用场景DynamoDB键值/文档原生API分布式SSD、自动分片高并发事务处理DocumentDB文档型MongoDB 4.0存储计算分离、6副本日志体系JSON数据聚合分析MemoryDB键值流数据Redis 6.2多AZ持久化、微秒…

【拒绝算法PUA】LeetCode 2116. 判断一个括号字符串是否有效

目录 系列文章目录 专题总结&#xff1a; C刷题技巧总结&#xff1a; 题目 2116. 判断一个括号字符串是否有效 难度 描述 解题方法1 系列文章目录 专题总结&#xff1a; 【拒绝算法PUA】0x00-位运算【拒绝算法PUA】0x01- 区间比较技巧【拒绝算法PUA】0x02- 区间合并技…

常见中间件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;在首页抓取数据包&#xff0c;并发送到重放器 第三步&#xff1a;先上传尝试一个1.txt进行测试 第四步&#xff1a;上传后门程序 第五步&#xff1a;使用哥斯拉连接 二、后…

《精益创业》第十三章《尾声:杜绝浪费》总结

核心思想&#xff1a; “杜绝浪费”是精益创业的终极目标与核心理念&#xff0c;其本质是通过系统性识别并消除一切不创造用户价值的活动&#xff0c;将有限资源聚焦于真正驱动增长的“价值流”。浪费不仅指物质损耗&#xff0c;更包括时间、人力与机会成本的隐性流失。 一、精…

【nodejs】爬虫路漫漫,关于nodejs的基操

一.下载安装nodejs 官网地址&#xff1a;Node.js — 在任何地方运行 JavaScript 二.下载安装vscode代码编辑器 官网地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 三.修改本地脚本策略 1&#xff0c;windowsi 打开电脑设置 2&#xff0c;输入powersh…

图论 | 岛屿数量(深搜,广搜)

岛屿数量 acm模式&#xff1a;99.岛屿数量 核心代码模式&#xff1a; 200. 岛屿数量 思路 遍历grid&#xff0c;如果它是1&#xff0c;则通过bfs/dfs将这个小岛的grid变为0 dfs def dfs(grid,i,j):if i<0 or j<0 or i>len(grid) or j>len(grid[0]):returnif g…

CSS 文档流:元素排列的底层逻辑与布局控制

CSS 文档流:元素排列的底层逻辑与布局控制 一、文档流的核心概念 文档流(Normal Flow)作为浏览器默认的布局模式,从根本上决定了元素在页面上的自然排列顺序。**它的核心规则遵循从上到下依次堆叠的原则,其中块级元素会独占一行,行内元素则水平排列。**这种布局模式与书…

el-table表格toggleRowSelection方法选中无效

开发中会有对表格中进行默认选中的功能&#xff0c;element-plus官方有一个选中示例&#xff0c;如下 const toggleSelection (rows?: User[]) > {if (rows) {rows.forEach((row) > {multipleTableRef.value!.toggleRowSelection(row, undefined)})} else {multipleTa…

Java EE(16)——网络原理——TCP协议解析二

4.滑动窗口(效率机制) 上篇博客讲到的确认应答/超时重传/连接管理都是安全机制&#xff0c;但也会降低传输效率。滑动窗口就是在保证可靠传输的基础上&#xff0c;尽可能地提高传输效率。 根据确认应答机制&#xff0c;客户端每发送一个请求都需要收到服务器的确认应答报文后才…

从入门到精通【MySQL】 CRUD

文章目录 &#x1f4d5;1. Create 新增✏️1.1 单行数据全列插入✏️1.2 单行数据指定列插入✏️1.3 多行数据指定列插入 &#x1f4d5;2. Retrieve 检索✏️2.1 全列查询✏️2.2 指定列查询✏️2.3 查询字段为表达式✏️2.4 为查询结果指定别名✏️2.5 结果去重查询 &#x1f…

C++学习之云盘上传文件列表下载

1.上传打开文件操作 1. 注册 客户端 成功 {"code":"002"} 该用户已存在 {"code":"003"} 失败 {"code":"004"} 服务器 2. 登录 客户端 服务器 // url http: //127.0.0.1:80/reg // post 数据格式 …

OpenCV图像拼接(5)用于计算一组图像的特征点和描述符的函数computeImageFeatures()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::computeImageFeatures 是 OpenCV 中用于计算一组图像的特征点和描述符的函数&#xff0c;通常在图像拼接或类似的任务中使用。这个函…

详细解析格式化消息框的代码

书籍&#xff1a;《windows程序设计(第五版)》的开始 环境&#xff1a;visual studio 2022 内容&#xff1a;格式化消息框 说明&#xff1a;以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数&#xff0c;通过va_list机制&#xff0c…

【SpringSecurity】详细核心类与过滤器流程讲解和封装通用组件实战

Spring Security 全面介绍 1. 什么是 Spring Security&#xff1f; Spring Security 是一个功能强大且高度可定制的认证和访问控制框架&#xff0c;是保护基于 Spring 的应用程序的标准工具。它是一个专注于为 Java 应用程序提供认证和授权的框架&#xff0c;实际上它是 Spri…

浅谈Qt事件子系统——以可拖动的通用Widget为例子

浅谈Qt事件子系统——以可拖动的通用Widget为例子 这一篇文章是一个通过实现可拖动的通用Widget为引子简单介绍一下我们的事件对象子系统的事情 代码和所有的文档 1&#xff1a;Qt侧的API介绍和说明 ​ 这个是每一个小项目的惯例&#xff0c;我会介绍大部分Qt程序中使用到的…

[入门]NUC13配置Ubuntu20.04详细步骤

文章目录 1. 安装Ubuntu20.041.1 制作系统启动盘1.1.1 下载镜像文件1.1.2 配置启动盘 1.2 安装内存条、硬盘1.3 安装系统 2. 网卡驱动配置2.1 关闭安全启动2.2 安装intel官方网卡驱动backport2.2.1 第四步可能会出现问题 2.3 ubuntu官方的驱动2.4 重启 3. 软件安装3.1 录屏软件…

(七)Reactor响应式编程框架

一、简介 Reactor 是运行在 JVM 上的编程框架&#xff0c;最大特点是完全非阻塞&#xff0c;能高效控制 “背压”&#xff0c;简单来说就是处理数据传输时速度不匹配的问题 。它能和 Java 8 里的一些功能直接搭配使用&#xff0c;像处理异步结果的 CompletableFuture、处理数据…