Kubernetes 服務(wù)目錄

2022-05-27 10:23 更新

服務(wù)目錄

服務(wù)目錄(Service Catalog)是 服務(wù)目錄是一種擴(kuò)展 API,它能讓 Kubernetes 集群中運(yùn)行的應(yīng)用易于使用外部托管的的軟件服務(wù),例如云供應(yīng)商提供的數(shù)據(jù)倉(cāng)庫(kù)服務(wù)。

服務(wù)目錄可以檢索、供應(yīng)、和綁定由 服務(wù)代理人(Service Brokers) 提供的外部托管服務(wù)(Managed Services), 而無(wú)需知道那些服務(wù)具體是怎樣創(chuàng)建和托管的。

服務(wù)代理(Service Broker)是由Open Service Broker API 規(guī)范定義的一組托管服務(wù)的端點(diǎn),這些服務(wù)由第三方提供并維護(hù),其中的第三方可以是 AWS、GCP 或 Azure 等云服務(wù)提供商。 托管服務(wù)的一些示例是 Microsoft Azure Cloud Queue、Amazon Simple Queue Service 和 Google Cloud Pub/Sub,但它們可以是應(yīng)用程序能夠使用的任何軟件交付物。

使用服務(wù)目錄,集群操作員 可以瀏覽某服務(wù)代理所提供的托管服務(wù)列表,供應(yīng)托管服務(wù)實(shí)例并與之綁定, 以使其可以被 Kubernetes 集群中的應(yīng)用程序使用。

示例用例

應(yīng)用開(kāi)發(fā)人員, 希望使用消息隊(duì)列,作為其在 Kubernetes 集群中運(yùn)行的應(yīng)用程序的一部分。 但是,他們不想承受構(gòu)造這種服務(wù)的開(kāi)銷,也不想自行管理。 幸運(yùn)的是,有一家云服務(wù)提供商通過(guò)其服務(wù)代理以托管服務(wù)的形式提供消息隊(duì)列服務(wù)。

集群操作員可以設(shè)置服務(wù)目錄并使用它與云服務(wù)提供商的服務(wù)代理通信,進(jìn)而部署消息隊(duì)列服務(wù)的實(shí)例 并使其對(duì) Kubernetes 中的應(yīng)用程序可用。 應(yīng)用開(kāi)發(fā)者于是可以不關(guān)心消息隊(duì)列的實(shí)現(xiàn)細(xì)節(jié),也不用對(duì)其進(jìn)行管理。 他們的應(yīng)用程序可以簡(jiǎn)單的將其作為服務(wù)使用。

架構(gòu) 

服務(wù)目錄使用Open Service Broker API 與服務(wù)代理進(jìn)行通信,并作為 Kubernetes API 服務(wù)器的中介,以便協(xié)商啟動(dòng)部署和獲取 應(yīng)用程序使用托管服務(wù)時(shí)必須的憑據(jù)。

它是基于 CRDs 架構(gòu)實(shí)現(xiàn)的。

service-catalog-architecture

API 資源

服務(wù)目錄安裝 ?servicecatalog.k8s.io? API 并提供以下 Kubernetes 資源:

  • ?ClusterServiceBroker?:服務(wù)目錄的集群內(nèi)表現(xiàn)形式,封裝了其服務(wù)連接細(xì)節(jié)。集群運(yùn)維人員創(chuàng)建和管理這些資源,并希望使用該代理服務(wù)在集群中提供新類型的托管服務(wù)。
  • ?ClusterServiceClass?:由特定服務(wù)代理提供的托管服務(wù)。當(dāng)新的 ?ClusterServiceBroker ?資源被添加到集群時(shí),服務(wù)目錄控制器將連接到服務(wù)代理以獲取可用的托管服務(wù)列表。然后為每個(gè)托管服務(wù)創(chuàng)建對(duì)應(yīng)的新 ?ClusterServiceClass? 資源。
  • ?ClusterServicePlan?:托管服務(wù)的特定產(chǎn)品。例如托管服務(wù)可能有不同的計(jì)劃可用,如免費(fèi)版本和付費(fèi)版本,或者可能有不同的配置選項(xiàng),例如使用 SSD 存儲(chǔ)或擁有更多資源。與 ?ClusterServiceClass ?類似,當(dāng)一個(gè)新的 ?ClusterServiceBroker ?被添加到集群時(shí),服務(wù)目錄會(huì)為每個(gè)托管服務(wù)的每個(gè)可用服務(wù)計(jì)劃創(chuàng)建對(duì)應(yīng)的新 ?ClusterServicePlan ?資源。
  • ?ServiceInstance?:?ClusterServiceClass? 提供的示例。由集群運(yùn)維人員創(chuàng)建,以使托管服務(wù)的特定實(shí)例可供一個(gè)或多個(gè)集群內(nèi)應(yīng)用程序使用。當(dāng)創(chuàng)建一個(gè)新的 ?ServiceInstance ?資源時(shí),服務(wù)目錄控制器將連接到相應(yīng)的服務(wù)代理并指示它調(diào)配服務(wù)實(shí)例。
  • ?ServiceBinding?:?ServiceInstance? 的訪問(wèn)憑據(jù)。由希望其應(yīng)用程序使用服務(wù) ?ServiceInstance ?的集群運(yùn)維人員創(chuàng)建。創(chuàng)建之后,服務(wù)目錄控制器將創(chuàng)建一個(gè) Kubernetes ?Secret?,其中包含服務(wù)實(shí)例的連接細(xì)節(jié)和憑據(jù),可以掛載到 Pod 中。

認(rèn)證 

服務(wù)目錄支持這些認(rèn)證方法:

使用方式

集群運(yùn)維人員可以使用服務(wù)目錄 API 資源來(lái)供應(yīng)托管服務(wù)并使其在 Kubernetes 集群內(nèi)可用。涉及的步驟有:

  1. 列出服務(wù)代理提供的托管服務(wù)和服務(wù)計(jì)劃。
  2. 配置托管服務(wù)的新實(shí)例。
  3. 綁定到托管服務(wù),它將返回連接憑證。
  4. 將連接憑證映射到應(yīng)用程序中。

列出托管服務(wù)和服務(wù)計(jì)劃

首先,集群運(yùn)維人員在 ?servicecatalog.k8s.io? 組內(nèi)創(chuàng)建一個(gè) ?ClusterServiceBroker ?資源。此資源包含訪問(wèn)服務(wù)代理終結(jié)點(diǎn)所需的 URL 和連接詳細(xì)信息。

這是一個(gè) ?ClusterServiceBroker ?資源的例子:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ClusterServiceBroker
metadata:
  name: cloud-broker
spec:
  # 指向服務(wù)代理的末端。(這里的 URL 是無(wú)法使用的。)
  url:  https://servicebroker.somecloudprovider.com/v1alpha1/projects/service-catalog/brokers/default
  #####
  # 這里可以添加額外的用來(lái)與服務(wù)代理通信的屬性值,
  # 例如持有者令牌信息或者 TLS 的 CA 包。
  #####

下面的時(shí)序圖展示了從服務(wù)代理列出可用托管服務(wù)和計(jì)劃所涉及的各個(gè)步驟:

service-catalog-list

  1. 一旦 ?ClusterServiceBroker ?資源被添加到了服務(wù)目錄之后,將會(huì)觸發(fā)一個(gè)到外部服務(wù)代理的 調(diào)用,以列舉所有可用服務(wù);
  2. 服務(wù)代理返回可用的托管服務(wù)和服務(wù)計(jì)劃列表,這些列表將本地緩存在 ?ClusterServiceClass ?和 ?ClusterServicePlan ?資源中。
  3. 集群運(yùn)維人員接下來(lái)可以使用以下命令獲取可用托管服務(wù)的列表:

kubectl get clusterserviceclasses \
  -o=custom-columns=SERVICE\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName

它應(yīng)該輸出一個(gè)和以下格式類似的服務(wù)名稱列表:

SERVICE NAME                           EXTERNAL NAME
4f6e6cf6-ffdd-425f-a2c7-3c9258ad2468   cloud-provider-service
...                                    ...

他們還可以使用以下命令查看可用的服務(wù)計(jì)劃:

kubectl get clusterserviceplans \
   -o=custom-columns=PLAN\ NAME:.metadata.name,EXTERNAL\ NAME:.spec.externalName

它應(yīng)該輸出一個(gè)和以下格式類似的服務(wù)計(jì)劃列表:

PLAN NAME                              EXTERNAL NAME
86064792-7ea2-467b-af93-ac9694d96d52   service-plan-name
...                                    ...

供應(yīng)一個(gè)新實(shí)例

集群運(yùn)維人員 可以通過(guò)創(chuàng)建一個(gè) ?ServiceInstance ?資源來(lái)啟動(dòng)一個(gè)新實(shí)例的配置。

下面是一個(gè) ?ServiceInstance ?資源的例子:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
  name: cloud-queue-instance
  namespace: cloud-apps
spec:
  # 引用之前返回的服務(wù)之一
  clusterServiceClassExternalName: cloud-provider-service
  clusterServicePlanExternalName: service-plan-name
  #####
  # 這里可添加額外的參數(shù),供服務(wù)代理使用
  #####

以下時(shí)序圖展示了配置托管服務(wù)新實(shí)例所涉及的步驟:

service-catalog-provision

  1. 創(chuàng)建 ?ServiceInstance ?資源時(shí),服務(wù)目錄將啟動(dòng)一個(gè)到外部服務(wù)代理的調(diào)用, 請(qǐng)求供應(yīng)一個(gè)實(shí)例。
  2. 服務(wù)代理創(chuàng)建一個(gè)托管服務(wù)的新實(shí)例并返回 HTTP 響應(yīng)。
  3. 接下來(lái),集群運(yùn)維人員可以檢查實(shí)例的狀態(tài)是否就緒。

綁定到托管服務(wù)

在設(shè)置新實(shí)例之后,集群運(yùn)維人員必須綁定到托管服務(wù)才能獲取應(yīng)用程序使用服務(wù)所需的連接憑據(jù)和服務(wù)賬戶的詳細(xì)信息。該操作通過(guò)創(chuàng)建一個(gè) ?ServiceBinding ?資源完成。

以下是 ?ServiceBinding ?資源的示例:

apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
  name: cloud-queue-binding
  namespace: cloud-apps
spec:
  instanceRef:
    name: cloud-queue-instance
  #####
  # 這里可以添加供服務(wù)代理使用的額外信息,例如 Secret 名稱或者服務(wù)賬號(hào)參數(shù),
  #####

以下順序圖展示了綁定到托管服務(wù)實(shí)例的步驟:

service-catalog-bind

  1. 在創(chuàng)建 ?ServiceBinding ?之后,服務(wù)目錄調(diào)用外部服務(wù)代理,請(qǐng)求綁定服務(wù)實(shí)例所需的信息。
  2. 服務(wù)代理為相應(yīng)服務(wù)賬戶啟用應(yīng)用權(quán)限/角色。
  3. 服務(wù)代理返回連接和訪問(wèn)托管服務(wù)示例所需的信息。這是由提供商和服務(wù)特定的,故返回的信息可能因服務(wù)提供商和其托管服務(wù)而有所不同。

映射連接憑據(jù)

完成綁定之后的最后一步就是將連接憑據(jù)和服務(wù)特定的信息映射到應(yīng)用程序中。這些信息存儲(chǔ)在 secret 中,集群中的應(yīng)用程序可以訪問(wèn)并使用它們直接與托管服務(wù)進(jìn)行連接。

service-catalog-map

Pod 配置文件

執(zhí)行此映射的一種方法是使用聲明式 Pod 配置。

以下示例描述了如何將服務(wù)賬戶憑據(jù)映射到應(yīng)用程序中。名為 ?sa-key? 的密鑰保存在一個(gè)名為 ?provider-cloud-key? 的卷中,應(yīng)用程序會(huì)將該卷掛載在 ?/var/secrets/provider/key.json? 路徑下。環(huán)境變量 ?PROVIDER_APPLICATION_CREDENTIALS ?將映射為掛載文件的路徑。

...
    spec:
      volumes:
        - name: provider-cloud-key
          secret:
            secretName: sa-key
      containers:
...
          volumeMounts:
          - name: provider-cloud-key
            mountPath: /var/secrets/provider
          env:
          - name: PROVIDER_APPLICATION_CREDENTIALS
            value: "/var/secrets/provider/key.json"

以下示例描述了如何將 Secret 值映射為應(yīng)用程序的環(huán)境變量。 在這個(gè)示例中,消息隊(duì)列的主題名從 Secret ?provider-queue-credentials? 中名為 ?topic ?的主鍵映射到環(huán)境變量 ?TOPIC ?中。

...
          env:
          - name: "TOPIC"
            valueFrom:
                secretKeyRef:
                   name: provider-queue-credentials
                   key: topic


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)