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

news2025/3/26 13:42:57

关于如何让同一个局域网内的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  # 或 ExternalName
  ports:
  - protocol: TCP
    port: 80       # Service 监听的端口
    targetPort: 8080  # 外部服务的端口
---
# 如果是手动指定 Endpoints(推荐):
apiVersion: v1
kind: Endpoints
metadata:
  name: external-service
subsets:
  - addresses:
      - ip: 192.168.1.100  # 外部服务的局域网 IP
    ports:
      - 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: mycontainer
    image: 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: TCP
      port: 80
      targetPort: 8080
  externalIPs:
    - 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: NodePort
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 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  # 外部服务的局域网 IP
    ports:
      - 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: TCP
      port: 5433
      targetPort: 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.77
    ports:
      - 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.77
      ports:
        - port: 5433
正确的配置
apiVersion: v1
kind: Endpoints
metadata:
  name: external-postgres
subsets:  # 直接定义 subsets,无需 spec
  - addresses:
      - ip: 10.210.200.77
    ports:
      - 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: TCP
      port: 5433
      targetPort: 5433
Endpoints 定义(external-postgres-endpoints.yaml)
apiVersion: v1
kind: Endpoints
metadata:
  name: external-postgres  # 必须与 Service 同名
subsets:
  - addresses:
      - ip: 10.210.200.77  # 外部服务 IP
    ports:
      - 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.coloradmin.cn/o/2320839.html

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

相关文章

ccfcsp3302相似度计算

//相似度计算 #include<iostream> #include<set>//不重复 #include<string> using namespace std; int main() {int n, m;cin >> n >> m;set<string>str1;set<string>str2;for(int i0;i<n;i){string s;cin>>s;for(int j0;…

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具&#xff0c; DeepSeek:DeepSeek Kimi: Kimi - 会推理解析&#xff0c;能深度思考的AI助手 1、提示词&#xff1a; 你能帮我生成一个知识图谱吗&#xff0c;等一下我会给你一篇文章&#xff0c;帮我从内容中提取关键要素&#xff0c;然后以N…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

剑指小米特斯拉:秦L EV上市11.98万起

3月23日&#xff0c;比亚迪王朝网推出全新中级纯电轿车秦L EV&#xff0c;价格区间为11.98万-13.98万元&#xff0c;瞬间火爆市场。 依托e平台3.0 Evo技术赋能&#xff0c;秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势&#xff0c;直击年轻用户痛…

蓝桥杯高频考点——并查集(心血之作)

并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1&#xff08;50分&#xff09;solution 2&#xff08;100分&#xff09; 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是&#xff0c;合并&a…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

Redisson 分布式锁原理

加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey&#xff0c;itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…

【STM32】SPI通信外设硬件SPI读写W25Q64

SPI通信协议和W25Q64存储器芯片解读笔记&#xff1a; 【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&…

Spring JDBC Template与事务管理:基于XML与注解的实战指南

摘要 本文深入解析Spring JDBC Template与事务管理的核心技术&#xff0c;结合XML配置与注解方式两种主流方案&#xff0c;通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议&#xff0c;帮助开发…

【Keil5-开发技巧】

Keil5-开发技巧 ■ Keil5利用AStyle插件格式化代码第一步:下载AStyle插件第二步:添加AStyle插件第三步:AStyle插件介绍■ 一键转UTF-8编码■ Keil5利用AStyle插件格式化代码 第一步:下载AStyle插件 AStyle下载 第二步:添加AStyle插件 解压后 astyle-3.6.7-x64 在重命…

电脑上不了网普通用户排除方法

1&#xff1a;首先通过电脑的运行/CMD/ipconfig /all 命令查看电脑的ip地址是否正常如图&#xff1a; 2&#xff1a;在命令行中运行&#xff1a;ping 127.0.0.1 如图则正常&#xff0c;否则要重新安装网卡驱动 程序。 3&#xff1a;用ping命令&#xff0c;ping一下同网段的电…

【C#】WinForm自定义控件及窗体

前言 WinForm&#xff08;Windows Forms&#xff09;是Microsoft.NET框架中的技术&#xff0c;用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…

基于虚拟知识图谱的语义化决策引擎

在数字化转型浪潮中&#xff0c;企业数据资产的价值释放面临两大挑战&#xff1a;海量异构数据的整合困局与业务-技术语义鸿沟。本文解析飞速创软灵燕智能体平台的创新解决方案——通过构建业务语义驱动的虚拟知识图谱系统&#xff0c;实现企业数据的智能认知与决策赋能。 一、…

HarmonyOS:@AnimatableExtend 装饰器自学指南

在最近的项目开发中&#xff0c;我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中&#xff0c;我发现了 AnimatableExtend 装饰器&#xff0c;它为实现动画效果提供了一种非常灵活且强大的方式。然而&#xff0c;在学习这个装饰器的过程中&#xff0c;我发现相关的…

kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署

一、 前言和写作原因 本文做一个kubernetes集群部署记录&#xff0c;实在是部署的东西太多了&#xff0c;害怕忘记&#xff0c;kubernetes集群的部署又细节比较多&#xff0c;因此&#xff0c;在这里做一个尽量详细的记录 三个VMware虚拟机&#xff0c;IP分别为192.168.123.…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器&#xff0c;需要解析mp3文件&#xff0c;于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

新能源汽车充换站如何实现光储充一体化管理?

长三角某换电站光伏板晒到发烫&#xff0c;却因电网限电被迫切机&#xff1b;北京五环充电站每月多缴6万超容费&#xff1b;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局&#xff0c;安科瑞用一组真实数据撕开行业潜规则&#…

【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年平均值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年平均值。&#xff01;该数据来源于NASA定期发布的MOD13A3数据集&#xff01;很多小伙伴拿到数据后…

【leetcode题解】链表

目录 链表 两数相加 两两交换链表中的节点 重排链表 合并 K 个升序链表&#xff08;困难&#xff09; K 个一组翻转链表 链表 1. 常用技巧 画图&#xff01;&#xff01;&#xff01;&#xff08;直观形象&#xff0c;便于我们理解&#xff09;引入虚拟“头”节点&#xf…

Windows打开ftp局域网共享

前提是windows已经设置好开机账号密码了&#xff0c;否则教程不适用 第一先打开电脑ftp共享配置 点击保存即可 2.设置要共享到其他电脑的文件路径&#xff08;如果你要共享整个盘你就设置整个盘&#xff0c;如果是共享盘中某文件就设置某文件&#xff0c;这里是某文件&#x…