訪問叢集上執行的服務
本頁面介紹如何連線到 Kubernetes 叢集上執行的服務。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。 建議在至少有兩個不作為控制平面主機的節點組成的叢集上執行本教程。 如果你還沒有叢集,你可以使用 minikube 建立一個,或者你可以使用這些 Kubernetes 操場:
要檢查版本,請輸入 kubectl version
。
訪問叢集上執行的服務
在 Kubernetes 中,節點、Pod 和服務都有自己的 IP。在許多情況下,叢集上的節點 IP、Pod IP 和某些服務 IP 不可路由,因此無法從叢集外部的機器(例如你的桌面機器)訪問它們。
連線方式
你有多種選擇,可以從叢集外部連線到節點、Pod 和服務。
- 透過公共 IP 訪問服務。
- 使用型別為
NodePort
或LoadBalancer
的服務,使服務可在叢集外部訪問。 請參閱 服務和 kubectl expose 文件。 - 根據你的叢集環境,這可能只會將服務暴露給你的公司網路,或者將其暴露給網際網路。 請考慮暴露的服務是否安全。它是否進行自己的身份驗證?
- 將 Pod 放置在服務後面。要從一組副本中訪問一個特定的 Pod(例如用於除錯),請在該 Pod 上放置一個唯一的標籤,然後建立一個選擇此標籤的新服務。
- 在大多數情況下,應用程式開發人員不需要透過其 nodeIP 直接訪問節點。
- 使用型別為
- 使用代理動詞訪問服務、節點或 Pod。
- 在訪問遠端服務之前進行 apiserver 身份驗證和授權。如果服務不夠安全,無法暴露給網際網路,或者為了訪問節點 IP 上的埠,或者為了除錯,請使用此方法。
- 代理可能會導致某些 Web 應用程式出現問題。
- 僅適用於 HTTP/HTTPS。
- 此處有說明。
- 從叢集中的節點或 Pod 訪問。
- 執行一個 Pod,然後使用 kubectl exec 連線到它的 shell。從該 shell 連線到其他節點、Pod 和服務。
- 一些叢集可能允許你透過 SSH 連線到叢集中的節點。從那裡你可能可以訪問叢集服務。這不是一個標準方法,在某些叢集上可以工作,但在其他叢集上可能不行。瀏覽器和其他工具可能已安裝,也可能未安裝。叢集 DNS 可能無法工作。
發現內建服務
通常,kube-system 會在叢集上啟動多個服務。使用 kubectl cluster-info
命令獲取這些服務的列表:
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
這顯示了訪問每個服務的代理動詞 URL。例如,這個叢集啟用了叢集級日誌記錄(使用 Elasticsearch),可以透過 https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
訪問(如果傳遞了合適的憑據),或者透過 kubectl 代理訪問,例如:https://:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
。
注意
有關如何傳遞憑據或使用 kubectl 代理的資訊,請參閱使用 Kubernetes API 訪問叢集。手動構建 API 伺服器代理 URL
如上所述,你可以使用 kubectl cluster-info
命令來檢索服務的代理 URL。要建立包含服務端點、字尾和引數的代理 URL,你需要將它們附加到服務的代理 URL: http://
kubernetes_master_address
/api/v1/namespaces/
namespace_name
/services/
[https:]service_name[:port_name]
/proxy
如果你沒有為埠指定名稱,則無需在 URL 中指定 port_name。你還可以使用埠號代替 port_name,這適用於已命名和未命名的埠。
預設情況下,API 伺服器使用 HTTP 代理你的服務。要使用 HTTPS,請在服務名稱前加上 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 服務端點
_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 服務健康資訊
_cluster/health?pretty=true
,你可以使用https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging:/proxy/_cluster/health?pretty=true
使用 Web 瀏覽器訪問叢集上執行的服務
你可以在瀏覽器的位址列中輸入 API 伺服器代理 URL。但是,
- 網頁瀏覽器通常無法傳遞令牌,因此你可能需要使用基本(密碼)身份驗證。API 伺服器可以配置為接受基本身份驗證,但你的叢集可能未配置為接受基本身份驗證。
- 有些 Web 應用可能無法正常工作,特別是那些客戶端 JavaScript 以不瞭解代理路徑字首的方式構造 URL 的應用。