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.pswp.cn/news/898784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898784.shtml
英文地址,請注明出處:http://en.pswp.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、處理數據…