Kubernetes服務(wù)是集群中部署的一組 pod 的邏輯抽象(它們都執(zhí)行相同的功能)。由于 Pod 是短暫的,因此服務(wù)可以為一組提供特定功能(Web 服務(wù)、圖像處理等)的 Pod 分配一個名稱和唯一的 IP 地址(clusterIP)。只要服務(wù)正在運行該 IP 地址,它就不會改變。服務(wù)還為其訪問定義策略。
在 Kubernetes 中,服務(wù)和部署有什么區(qū)別?
在Kubernetes中,部署是一種使用容器化應(yīng)用程序啟動 pod 并確保集群上始終運行必要數(shù)量的副本的方法。另一方面,服務(wù)負(fù)責(zé)向這些 pod 公開接口,這使得可以從集群內(nèi)部或外部進(jìn)程與服務(wù)之間進(jìn)行網(wǎng)絡(luò)訪問。
Kubernetes 服務(wù)的組件有哪些?
Kubernetes 服務(wù)將一組 pod 連接到一個抽象的服務(wù)名稱和 IP 地址。服務(wù)提供 pod 之間的發(fā)現(xiàn)和路由。例如,服務(wù)將應(yīng)用程序前端連接到其后端,每個后端都在集群中的單獨部署中運行。服務(wù)使用標(biāo)簽和選擇器將 pod 與其他應(yīng)用程序匹配。Kubernetes 服務(wù)的核心屬性是:
- 定位 pod 的標(biāo)簽選擇器
- clusterIP IP 地址和分配的端口號
- 端口定義
- 傳入端口到 targetPort 的可選映射
可以在沒有 pod 選擇器的情況下定義服務(wù)。例如,將服務(wù)指向不同命名空間或集群中的另一個服務(wù)。
Kubernetes 服務(wù)有哪些類型?
- 集群IP。公開只能從集群內(nèi)部訪問的服務(wù)。
- 節(jié)點端口。通過每個節(jié)點 IP 上的靜態(tài)端口公開服務(wù)。
- 負(fù)載均衡器。通過云提供商的負(fù)載均衡器公開服務(wù)。
- 外部名稱。通過返回 CNAME 記錄的值將服務(wù)映射到預(yù)定義的 externalName 字段。
什么是 Kubernetes ClusterIP 服務(wù)?
ClusterIP 是默認(rèn)的服務(wù)類型,用于在集群內(nèi)部的 IP 地址上公開服務(wù)。僅允許從集群內(nèi)部訪問。
什么是 Kubernetes 無頭服務(wù)?
不需要負(fù)載平衡且僅公開單個 IP 的服務(wù)可以通過將 clusterIP 指定為“none”來創(chuàng)建“無頭”服務(wù)。可以使用選擇器定義無頭服務(wù),在這種情況下,端點記錄在 API 中創(chuàng)建,修改 DNS 以返回指向公開服務(wù)的 pod 的地址。沒有選擇器的無頭服務(wù)不會創(chuàng)建端點記錄。DNS 系統(tǒng)為與服務(wù)同名的端點配置 CNAME 記錄或記錄。
什么是 Kubernetes NodePort 服務(wù)?
NodePorts 是每個集群節(jié)點上的開放端口。Kubernetes 會將進(jìn)入 NodePort 的流量路由到服務(wù),即使該服務(wù)沒有在該節(jié)點上運行。NodePort 旨在作為其他更高級別的入口方法(例如負(fù)載平衡器)的基礎(chǔ),并且在開發(fā)中很有用。
什么是 Kubernetes ExternalName 服務(wù)?
ExternalName 服務(wù)與其他 Kubernetes 服務(wù)類似;但是,它不是通過 clusterIP 地址訪問,而是返回一個 CNAME 記錄,其值在創(chuàng)建服務(wù)時在 externalName: 參數(shù)中定義。
什么是 Kubernetes 負(fù)載均衡器服務(wù)?
對于在 AWS 或 Azure 等公共云提供商上運行的集群,創(chuàng)建負(fù)載 LoadBalancer 服務(wù)提供了與 clusterIP 服務(wù)等效的功能,將其擴(kuò)展到特定于云提供商的外部負(fù)載均衡器。Kubernetes 將自動創(chuàng)建負(fù)載均衡器,在需要時提供防火墻規(guī)則,并使用云提供商分配的外部 IP 地址填充服務(wù)。
Kubernetes 服務(wù)如何工作?
服務(wù)只是使用標(biāo)簽指向 pod。由于服務(wù)不是特定于節(jié)點的,因此服務(wù)可以指向一個 pod,而不管它在任何給定時刻在集群中的哪個位置運行。通過公開服務(wù) IP 地址和 DNS 服務(wù)名稱,只要服務(wù)存在,就可以通過任一方法訪問應(yīng)用程序。
您如何定義 Kubernetes 服務(wù)?
服務(wù)在 YAML 中定義,所有 Kubernetes 對象也是如此。假設(shè)您部署了運行后端服務(wù)的 pod,以處理來自 Web 前端的數(shù)據(jù)。要在部署“deployment-backend”上公開名為“service-backend”的服務(wù),您可以使用:
api版本: v1
種類:服務(wù)
元數(shù)據(jù):
名稱:服務(wù)后端
規(guī)格:
端口:
- 端口: 4000
協(xié)議: TCP
目標(biāo)端口: 333
選擇器:
運行:部署后端
類型:集群IP
將創(chuàng)建服務(wù)“service-backend”,集群中的任何 pod 都可以通過 http://service-backend:4000 在其端口 333 上訪問它,或者使用端口 4000 在集群的 IP 地址上訪問它。
Kubernetes 服務(wù)也可以使用“kubectl expose”命令創(chuàng)建,該命令不需要 YAML 文件。可以使用以下命令創(chuàng)建相同的服務(wù):
kubectl 暴露部署部署后端--端口=333--目標(biāo)端口=4000--名稱=服務(wù)后端
如何訪問 Kubernetes 服務(wù)?
有兩種方法可以發(fā)現(xiàn) Kubernetes 服務(wù):
DNS(最常見): DNS 方法是發(fā)現(xiàn)服務(wù)的推薦方法。要使用此方法,必須首先在集群上安裝 DNS 服務(wù)器。DNS 服務(wù)器監(jiān)控 Kubernetes API,當(dāng)一個新服務(wù)被創(chuàng)建時,它的名字就可以用于請求應(yīng)用程序的輕松解析。
ENV 變量:此方法依賴于 kubelet 為運行 pod 的每個節(jié)點的每個活動服務(wù)添加環(huán)境變量。