Kubernetes 訪問集群上運行的服務(wù)

2022-06-16 09:39 更新

訪問集群上運行的服務(wù)

本文展示了如何連接 Kubernetes 集群上運行的服務(wù)。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:

要獲知版本信息,請輸入 ?kubectl version?。

訪問集群上運行的服務(wù)

在 Kubernetes 里,節(jié)點、 Pod 和 服務(wù) 都有自己的 IP。 許多情況下,集群上的節(jié)點 IP、Pod IP 和某些服務(wù) IP 是路由不可達的, 所以不能從集群之外訪問它們,例如從你自己的臺式機。

連接方式 

你有多種可選方式從集群外連接節(jié)點、Pod 和服務(wù):

  • 通過公網(wǎng) IP 訪問服務(wù)
    • 使用類型為 ?NodePort ?或 ?LoadBalancer ?的服務(wù),可以從外部訪問它們。
    • 取決于你的集群環(huán)境,你可以僅把服務(wù)暴露在你的企業(yè)網(wǎng)絡(luò)環(huán)境中,也可以將其暴露在 因特網(wǎng)上。需要考慮暴露的服務(wù)是否安全,它是否有自己的用戶認證?
    • 將 Pod 放置于服務(wù)背后。如果要訪問一個副本集合中特定的 Pod,例如用于調(diào)試目的, 請給 Pod 指定一個獨特的標簽并創(chuàng)建一個新服務(wù)選擇該標簽。
    • 大部分情況下,都不需要應(yīng)用開發(fā)者通過節(jié)點 IP 直接訪問節(jié)點。
  • 通過 Proxy 動詞訪問服務(wù)、節(jié)點或者 Pod
    • 在訪問遠程服務(wù)之前,利用 API 服務(wù)器執(zhí)行身份認證和鑒權(quán)。 如果你的服務(wù)不夠安全,無法暴露到因特網(wǎng)中,或者需要訪問節(jié)點 IP 上的端口, 又或者出于調(diào)試目的,可使用這種方式。
    • 代理可能給某些應(yīng)用帶來麻煩
    • 此方式僅適用于 HTTP/HTTPS
    • 從集群中的 node 或者 pod 訪問。
  • 從集群中的一個節(jié)點或 Pod 訪問
    • 運行一個 Pod,然后使用 kubectl exec 連接到它的 Shell。從那個 Shell 連接其他的節(jié)點、Pod 和 服務(wù)
    • 某些集群可能允許你 SSH 到集群中的節(jié)點。你可能可以從那兒訪問集群服務(wù)。 這是一個非標準的方式,可能在一些集群上能工作,但在另一些上卻不能。 瀏覽器和其他工具可能已經(jīng)安裝也可能沒有安裝。集群 DNS 可能不會正常工作。

發(fā)現(xiàn)內(nèi)置服務(wù) 

典型情況下,kube-system 名字空間中會啟動集群的幾個服務(wù)。 使用 ?kubectl cluster-info? 命令獲取這些服務(wù)的列表:

kubectl cluster-info

輸出類似于:

Kubernetes master is running at https://192.0.2.1
elasticsearch-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kibana-logging/proxy
kube-dns is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy

這一輸出顯示了用 proxy 動詞訪問每個服務(wù)時可用的 URL。例如,此集群 (使用 Elasticsearch)啟用了集群層面的日志。如果提供合適的憑據(jù),可以通過 ?https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/? 訪問,或通過一個 ?kubectl proxy? 來訪問: ?http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/?。

手動構(gòu)建 API 服務(wù)器代理 URLs

如前所述,你可以使用 ?kubectl cluster-info? 命令取得服務(wù)的代理 URL。 為了創(chuàng)建包含服務(wù)末端、后綴和參數(shù)的代理 URLs,你可以在服務(wù)的代理 URL 中添加: ?http://kubernetes_master_address/api/v1/namespaces/namespace_name/services/service_name[:port_name]/proxy ?

如果還沒有為你的端口指定名稱,你可以不用在 URL 中指定 port_name。 對于命名和未命名端口,你還可以使用端口號代替 port_name。

默認情況下,API 服務(wù)器使用 HTTP 為你的服務(wù)提供代理。 要使用 HTTPS,請在服務(wù)名稱前加上 ?https:?: ?http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy? URL 的 ?<service_name>? 段支持的格式為:

  • ?<service_name>? - 使用 http 代理到默認或未命名端口
  • ?<service_name>:<port_name>? - 使用 http 代理到指定的端口名稱或端口號
  • ?https:<service_name>:? - 使用 https 代理到默認或未命名端口(注意尾隨冒號)
  • ?https:<service_name>:<port_name>? - 使用 https 代理到指定的端口名稱或端口號
示例 
  • 如要訪問 Elasticsearch 服務(wù)末端 ?_search?q=user:kimchy?,你可以使用:
  • http://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy
    
  • 如要訪問 Elasticsearch 集群健康信息?_cluster/health?pretty=true?,你會使用:
  • https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true
    

    健康信息與下面的例子類似:

    {
      "cluster_name" : "kubernetes_logging",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 1,
      "number_of_data_nodes" : 1,
      "active_primary_shards" : 5,
      "active_shards" : 5,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 5
    }
  • 要訪問 https Elasticsearch 服務(wù)健康信息 ?_cluster/health?pretty=true?,你會使用:
  • https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging:/proxy/_cluster/health?pretty=true
    

通過 Web 瀏覽器訪問集群中運行的服務(wù) 

你或許能夠?qū)?nbsp;API 服務(wù)器代理的 URL 放入瀏覽器的地址欄,然而:

  • Web 服務(wù)器通常不能傳遞令牌,所以你可能需要使用基本(密碼)認證。 API 服務(wù)器可以配置為接受基本認證,但你的集群可能并沒有這樣配置。
  • 某些 Web 應(yīng)用可能無法工作,特別是那些使用客戶端 Javascript 構(gòu)造 URL 的 應(yīng)用,所構(gòu)造的 URL 可能并不支持代理路徑前綴。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號