簡體   English   中英

如何通過 Kubernetes 中的另一個 pod 訪問部署在一個 pod 上的服務?

[英]How to access the service deployed on one pod via another pod in Kubernetes?

誰能讓我知道我們如何通過 kubernetes 集群中的另一個 pod 訪問部署在一個 pod 上的服務?

例子:

有一個 nginx 服務部署在 Node1 上(pod 名稱為 nginx-12345)和另一個服務部署在 Node2 上(pod 名稱為 service-23456)。 現在如果'service'出於某種原因想要與'nginx'通信,那么我們如何訪問'service-23456' pod中的'nginx'呢?

有多種方法可以在kubernetes中訪問服務,您可以通過NodePort或LoadBalancer公開您的服務,並在集群外部訪問它。

請參閱有關如何訪問服務的官方文檔。

Kubernetes官方文件指出:

某些群集可能允許您ssh到群集中的節點。 從那里,您可以訪問群集服務。 這是一種非標准方法,適用於某些群集,但不適用於其他群集。 瀏覽器和其他工具可能安裝也可能不安裝。 群集DNS可能無法正常工作。

因此,直接從其他節點訪問服務取決於您正在使用的Kubernetes集群類型。

編輯:

在群集中部署服務后,您應該能夠使用其名稱聯系該服務, Kube-DNS將使用正確的ClusterIP進行回答,以便與最終的pod進行通信。 ClusterIP由在工作站上由kube-proxy創建的IPTables規則管理,這些規則將您對最終容器的IP請求NAT。

Kube-DNS命名約定是service.namespace.svc.cluster-domain.tld ,默認的群集域是cluster.local

例如,如果要從任何名稱空間聯系db命名空間中名為mysql的服務,只需與mysql.db.svc.cluster.local

如果這不起作用,那么群集中的kube-dns可能存在一些問題。 希望這可以幫助。

編輯2:在ubuntu中有一些已知的dns解決問題,Kubernetes官方文件指出

某些Linux發行版(例如Ubuntu)默認使用本地DNS解析器(systemd-resolved)。 Systemd-resolved移動並將/etc/resolv.conf替換為存根文件,該文件在解析上游服務器中的名稱時可能導致致命的轉發循環。 這可以通過使用kubelet的--resolv-conf標志手動修復,指向正確的resolv.conf(使用systemd-resolved,這是/run/systemd/resolve/resolv.conf)。 kubeadm 1.11自動檢測systemd-resolved,並相應地調整kubelet標志。

我遇到了類似的問題,以下鏈接可能會解決您的問題。 通常,集群中的所有服務都是可見和可訪問的。 將您的service-23456<\/code>服務公開到類型 ClusterIP 和端口 8080。然后您可以從 nginx 服務調用端點“http:\/\/service-23456:8080”。

無法在啟用了 Istio 的 GKE 集群中的 2 個節點、js 應用程序之間進行通信<\/a>

您是否將部署作為服務公開? 如果是這樣,只需通過它的dns名稱訪問它,例如http:// nginx-1234 - 或者如果它位於不同的命名空間中: http://nginx-1234.default.svc (將“default”更改為服務所在的命名空間in)或http://nginx-1234.default.svc.cluster.local

現在,如果您沒有公開服務,那么您可能應該這樣做。 您不需要將它暴露給外部世界,只是不要定義服務類型,它只能在您的集群中使用。

如果由於某種原因您不想公開服務(無法想到任何原因),您可以在api服務器中查詢pod IP。 您需要提供用於身份驗證的令牌,但這些令牌在pod中可用:

得到令牌:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

調用api服務器:

curl https://kubernetes.default.svc/api/v1/namespaces/default/pods--silent \
     --header "Authorization: Bearer $TOKEN" --insecure

您可以通過添加?fieldSelector=spec.nodeName%3Dtargetnodename或類似(僅使用json路徑)來優化查詢。 輸出可以使用https://stedolan.github.io/jq/或任何其他JSON實用程序進行解析。

這里回答了Simlar問題: Kubernetes - 如何通過休息請求從pod中的Web服務器訪問服務

只需將“ProductWebApp”替換為“nginx”,將“DashboardWebApp”替換為“service”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM