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 转发到外部服务。
关键注意事项
-
网络策略:
• 确保 Kubernetes 节点的防火墙允许 Pod 与外部服务的通信。
• 如果使用网络插件(如 Calico),检查是否配置了允许出站流量的 NetworkPolicy。 -
DNS 解析:
• 如果外部服务有域名,确保 Pod 的 DNS 配置(如/etc/resolv.conf)能解析该域名。 -
服务发现:
• 推荐使用方法 1(Service + Endpoints),因为可以利用 Kubernetes 的服务发现机制。 -
安全风险:
• 避免在生产环境使用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。
- 可能的原因一:
Endpoints的metadata.name是否与Service的名称完全一致?Kubernetes通过名称来关联Service和Endpoints,如果名称不匹配,Endpoints不会被正确关联,导致Service没有对应的Endpoints,因此subsets可能显示为空或者被系统自动清理。 - 可能的原因二:是否有其他控制器或进程
在修改Endpoints?例如,某些情况下,如果Service被错误地配置了selector,Kubernetes会尝试自动管理Endpoints,覆盖用户手动创建的配置。用户可能在创建Service时不小心添加了selector,导致系统自动生成Endpoints,覆盖了手动配置。 - 可能的原因三:
Endpoints的配置是否正确?比如缩进错误、端口定义不正确等YAML格式问题,可能导致Endpoints对象虽然被创建,但无法被正确识别,从而被系统忽略或删除。 - 可能的原因四:是否存在其
他资源冲突?例如,同名的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 要求 Endpoints 的 metadata.name 必须与 Service 的名称完全一致,否则两者无法关联,导致手动创建的 Endpoints 失效。
验证方法:
kubectl get endpoints <endpoints-name> -o yaml
检查 metadata.name 是否与 Service 名称一致。
修复方法:
确保 Endpoints 的 metadata.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
操作步骤总结
-
检查 Service 是否配置了 Selector:
kubectl describe service external-postgres -
检查 Endpoints 名称和格式:
kubectl get endpoints external-postgres -o yaml -
重新应用正确的配置:
kubectl apply -f external-postgres.yaml -
监控 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 应能正确持久化,不会自动消失。
相关文章:
k8s--集群内的pod调用集群外的服务
关于如何让同一个局域网内的Kubernetes服务的Pod访问同一局域网中的电脑上的服务。 可能的解决方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs,或者直接使用Pod网络。每种方法都有不同的适用场景,需要逐一分析。 例如&…...
AI比人脑更强,因为被植入思维模型【20】卡尼曼双系统理论
定义 卡尼曼双系统理论思维模型是由诺贝尔经济学奖得主丹尼尔卡尼曼提出的,该理论认为人类的思维系统可以分为两个相互关联但又具有不同特点的子系统,即系统1(快思考)和系统2(慢思考)。系统1是基于直觉、经…...
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;…...
jEasyUI 创建 RSS 阅读器
jEasyUI 创建 RSS 阅读器 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取所需信息,RSS 阅读器应运而生。jEasyUI 是一款流行的前端框架,具有丰富的组件和便捷的开发体验。本文将介绍如何使用 jEasyUI 创建一个功能齐…...
DeepSeek和Kimi在Neo4j中的表现
以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…...
【Java】TCP网络编程:从可靠传输到Socket实战
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
windows 平台编译openssl
文章目录 准备环境安装perl安装NASM获取源码 源码编译配置编译 准备环境 安装perl 下载Perl 5.40.0.1 Portable zip strawberryperl 解压后设置系统环境变量 测试安装是否成功 perl --versionThis is perl 5, version 40, subversion 0 (v5.40.0) built for MSWin32-x64-m…...
剑指小米特斯拉:秦L EV上市11.98万起
3月23日,比亚迪王朝网推出全新中级纯电轿车秦L EV,价格区间为11.98万-13.98万元,瞬间火爆市场。 依托e平台3.0 Evo技术赋能,秦L EV以“国潮设计、智能座舱、越级空间、高效安全、高阶智驾”五大核心优势,直击年轻用户痛…...
避雷 :C语言中 scanf() 函数的错误❌使用!!!
1. 返回值说明 scanf函数会返回成功匹配并赋值的输入项个数,而不是返回输入的数据。 可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。 #include <stdio.h>int main() {int num;if (scanf("%d", …...
Godot读取json配置文件
概述 在Godot 4.3中读取JSON配置文件,可以通过以下步骤实现: 步骤说明 读取文件内容:使用FileAccess类打开并读取JSON文件。 解析JSON数据:使用JSON类解析读取到的文本内容。 错误处理:处理文件不存在或JSON格式错…...
Hadoop 3.x中的zookeeper和JournalNode的作用
在Hadoop 3.x版本中,ZooKeeper 和 JournalNode 的作用有所变化和增强,尤其是在HDFS高可用性(HA)架构和其他Hadoop组件的协作方面。下面是它们在Hadoop 3.x中的具体作用: ZooKeeper 继续在Hadoop 3.x中为集群提供协调服务,尤其是在HDFS的高可用性和YARN资源管理器的管理中…...
蓝桥杯高频考点——并查集(心血之作)
并查集 TA Can Do What & why learningwhatwhy 原理和结构路径压缩例题讲解题解solution 1(50分)solution 2(100分) 按秩(树高)合并按大小合并 TA Can Do What & why learning 从字面意思上来理解就是,合并&a…...
基于概率图模型的蛋白质功能预测
标题:基于概率图模型的蛋白质功能预测 内容:1.摘要 蛋白质功能预测在生物学研究中具有重要意义,能够帮助理解生命过程和疾病机制。本研究的目的是利用概率图模型进行蛋白质功能预测。方法上,收集了大量已知功能的蛋白质数据构建数据集,运用贝…...
Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)
Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 一、简单介绍 二、conne…...
Redisson 分布式锁原理
加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey,itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…...
高频SQL50题 第四天 | 1251. 平均售价、620. 有趣的电影、1075. 项目员工 I、1633. 各赛事的用户注册率
知识点导览:日期大小比较;ifnull(字段,默认值)函数;取余操作;字符串比较like;逆序desc 1251. 平均售价 题目链接:https://leetcode.cn/problems/average-selling-price/description/?envTypest…...
【STM32】SPI通信外设硬件SPI读写W25Q64
SPI通信协议和W25Q64存储器芯片解读笔记: 【STM32】SPI通信协议&W25Q64Flash存储器芯片(学习笔记)-CSDN博客 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能&…...
风暴潮、潮汐潮流模拟:ROMS模型如何精准预测海洋现象?
海洋数值模拟的崛起与 ROMS 的关键角色 🌊在海洋科学的浪潮中,海洋数值模拟正以迅猛之势崛起,成为科研与实际应用领域不可或缺的利器。ROMS(Regional Ocean Modeling System)作为其中的佼佼者,凭借其高效、…...
Spring JDBC Template与事务管理:基于XML与注解的实战指南
摘要 本文深入解析Spring JDBC Template与事务管理的核心技术,结合XML配置与注解方式两种主流方案,通过转账案例完整演示数据库操作与事务管理的最佳实践。文章涵盖JDBC Template的核心用法、事务配置语法、常见问题及性能优化建议,帮助开发…...
【Keil5-开发技巧】
Keil5-开发技巧 ■ Keil5利用AStyle插件格式化代码第一步:下载AStyle插件第二步:添加AStyle插件第三步:AStyle插件介绍■ 一键转UTF-8编码■ Keil5利用AStyle插件格式化代码 第一步:下载AStyle插件 AStyle下载 第二步:添加AStyle插件 解压后 astyle-3.6.7-x64 在重命…...
Uniapp:基于 Vue.js 的高效跨平台开发框架
Uniapp 介绍 Uniapp(全称:Universal Application)是一款基于 Vue.js 的跨平台开发框架,由 DCloud 公司开发和维护。它允许开发者使用一套代码同时构建运行在多个平台(如 iOS、Android、Web、小程序、快应用等…...
form 表单内容序列化成一个字符串
html <form id"form1" action"http://localhost:8080/xxx" method"post"> <p >关键字1: <input type "text" name"keyword1" /></p> <p >关键字2: <input t…...
电脑上不了网普通用户排除方法
1:首先通过电脑的运行/CMD/ipconfig /all 命令查看电脑的ip地址是否正常如图: 2:在命令行中运行:ping 127.0.0.1 如图则正常,否则要重新安装网卡驱动 程序。 3:用ping命令,ping一下同网段的电…...
【C#】WinForm自定义控件及窗体
前言 WinForm(Windows Forms)是Microsoft.NET框架中的技术,用于开发Windows桌面应用程序。它提供了一套丰富的控件和组件。通过拖放控件、编写事件处理程序等方式快速构建用户界面。 通过属性窗口定制这些控件的外观和行为。 通过数据绑定&am…...
基于虚拟知识图谱的语义化决策引擎
在数字化转型浪潮中,企业数据资产的价值释放面临两大挑战:海量异构数据的整合困局与业务-技术语义鸿沟。本文解析飞速创软灵燕智能体平台的创新解决方案——通过构建业务语义驱动的虚拟知识图谱系统,实现企业数据的智能认知与决策赋能。 一、…...
七天免登录 为什么不能用seesion,客户端的http请求自动携带cookei的机制(比较重要)涉及HTTP规范
如果是七天免登录,和session肯定没关系,因为session不能持久化,主要是客户端一旦关闭,seesion就失效了/// 所以必须是能持久化的,这就清晰了,要莫在的服务器保存,要摸在客户端设置 cook机制 1. 使用Cookie实现七天免登录 前端(登…...
HarmonyOS:@AnimatableExtend 装饰器自学指南
在最近的项目开发中,我遇到了需要实现复杂动画效果的需求。在探索解决方案的过程中,我发现了 AnimatableExtend 装饰器,它为实现动画效果提供了一种非常灵活且强大的方式。然而,在学习这个装饰器的过程中,我发现相关的…...
主流NoSQL数据库类型及选型分析
在数据库领域,不同类型的数据库针对不同场景设计,以下是四类主流NoSQL数据库的对比分析: 一、核心特性对比 键值数据库(Key-Value) 数据模型:简单键值对存储 特点:毫秒级读写、高并发、无固定…...
kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署
一、 前言和写作原因 本文做一个kubernetes集群部署记录,实在是部署的东西太多了,害怕忘记,kubernetes集群的部署又细节比较多,因此,在这里做一个尽量详细的记录 三个VMware虚拟机,IP分别为192.168.123.…...
Qt 导入TagLib库
文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器,需要解析mp3文件,于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…...
