存取叢集上執行的服務
本頁說明如何連線至 Kubernetes 叢集上執行的服務。
準備開始
您需要有一個 Kubernetes 叢集,且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未擔任控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或使用下列 Kubernetes 實驗環境
若要檢查版本,請輸入kubectl version
。存取叢集上執行的服務
在 Kubernetes 中,節點、Pod 和 服務 都有自己的 IP。在許多情況下,叢集上的節點 IP、Pod IP 和某些服務 IP 無法路由,因此無法從叢集外部的機器 (例如您的桌上型電腦) 連線。
連線方式
您有多個選項可從叢集外部連線至節點、Pod 和服務
- 透過公用 IP 存取服務。
- 使用類型為
NodePort
或LoadBalancer
的服務,讓服務可從叢集外部連線。請參閱 服務 和 kubectl expose 文件。 - 根據您的叢集環境,這可能只會將服務公開至您的企業網路,或可能將其公開至網際網路。請考量公開的服務是否安全。它是否執行自己的驗證?
- 將 Pod 放在服務後方。若要從一組複本存取特定 Pod (例如用於偵錯),請在 Pod 上放置唯一標籤,並建立新的服務來選取此標籤。
- 在大多數情況下,應用程式開發人員不應需要透過其節點 IP 直接存取節點。
- 使用類型為
- 使用 Proxy Verb 存取服務、節點或 Pod。
- 在存取遠端服務之前,執行 apiserver 驗證與授權。如果服務不夠安全而無法公開至網際網路,或要取得節點 IP 上連接埠的存取權,或用於偵錯,請使用此選項。
- Proxy 可能會對某些 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
這會顯示用於存取每個服務的 proxy-verb URL。例如,此叢集已啟用叢集層級記錄 (使用 Elasticsearch),如果傳遞適當的認證,則可透過 https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
存取,或透過 kubectl proxy 在例如:https://#:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
存取。
注意
請參閱 使用 Kubernetes API 存取叢集,以瞭解如何傳遞認證或使用 kubectl proxy。手動建構 apiserver proxy URL
如上所述,您可以使用 kubectl cluster-info
命令來擷取服務的 Proxy URL。若要建立包含服務端點、字尾與參數的 Proxy URL,請附加至服務的 Proxy URL:http://
kubernetes_master_address
/api/v1/namespaces/
namespace_name
/services/
[https:]service_name[:port_name]
/proxy
如果您未指定連接埠的名稱,則不必在 URL 中指定 port_name。您也可以使用連接埠號碼來取代 port_name,用於具名與未命名的連接埠。
依預設,API 伺服器會使用 HTTP Proxy 連線至您的服務。若要使用 HTTPS,請在服務名稱前面加上 https:
:http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy
URL 的 <service_name>
區段支援的格式為
<service_name>
- 使用 http Proxy 連線至預設或未命名的連接埠<service_name>:<port_name>
- 使用 http Proxy 連線至指定的連接埠名稱或連接埠號碼https:<service_name>:
- 使用 https Proxy 連線至預設或未命名的連接埠 (請注意結尾的冒號)https:<service_name>:<port_name>
- 使用 https Proxy 連線至指定的連接埠名稱或連接埠號碼
範例
若要存取 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 瀏覽器存取叢集上執行的服務
您或許可以將 apiserver Proxy URL 放入瀏覽器的網址列中。然而
- Web 瀏覽器通常無法傳遞 Token,因此您可能需要使用基本 (密碼) 驗證。Apiserver 可以設定為接受基本驗證,但您的叢集可能未設定為接受基本驗證。
- 有些 Web 應用程式可能無法運作,特別是那些使用用戶端 JavaScript 建構 URL,但未意識到代理路徑前綴的應用程式。