本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

使用 Kubernetes 建立 Couchbase 叢集

Couchbase Server是一個開源的分散式NoSQL面向文件資料庫。它提供了一個帶有託管快取的快速鍵值儲存,用於亞毫秒級資料操作,專門構建的索引器用於快速查詢,以及一個用於執行SQL查詢的查詢引擎。對於移動和物聯網(IoT)環境,Couchbase Lite在本地裝置上執行,並管理與Couchbase Server的同步。

Couchbase Server 4.5最近釋出,帶來了許多新功能,包括對Docker的生產認證支援。Couchbase支援各種Docker容器編排框架,如Kubernetes、Docker Swarm和Mesos,詳細資訊請訪問此頁面

這篇部落格文章將解釋如何使用Kubernetes建立Couchbase叢集。此設定已使用Kubernetes 1.3.3、Amazon Web Services和Couchbase 4.5企業版進行測試。

像所有美好的事物一樣,這篇文章也站在巨人的肩膀上。這篇部落格中使用的設計模式是在一個週五下午的駭客馬拉松中與@saturnism共同定義的。配置檔案的可行版本由@r_schmiddy貢獻

Couchbase 叢集

Couchbase Server 叢集通常部署在商用伺服器上。Couchbase Server 具有點對點拓撲結構,所有節點都是平等的,並按需相互通訊。沒有主節點、從節點、配置節點、名稱節點、頭節點等概念,並且每個節點上載入的所有軟體都是相同的。它允許在不考慮其“型別”的情況下新增或刪除節點。這種模型通常與雲基礎設施配合得非常好。對於 Kubernetes,這意味著我們可以為所有 Couchbase 節點使用完全相同的容器映象。

典型的 Couchbase 叢集建立過程如下:

  • 啟動 Couchbase:啟動 n 個 Couchbase 伺服器
  • 建立叢集:選擇任何伺服器,並將所有其他伺服器新增到其中以建立叢集
  • 重新平衡叢集:重新平衡叢集,使資料分佈在整個叢集中

為了使用 Kubernetes 自動化,叢集建立被分為“主”和“工作”複製控制器 (RC)。

主 RC 只有一個副本,並且也作為 Service 釋出。這提供了一個單一的參考點來啟動叢集建立。預設情況下,服務僅在叢集內部可見。此服務也作為負載均衡器暴露。這允許從叢集外部訪問 Couchbase Web 控制檯

工作 RC 使用與主 RC 完全相同的映象。這使叢集保持同構,從而可以輕鬆擴充套件叢集。

本部落格中使用的配置檔案可在此處獲取。讓我們建立 Kubernetes 資源來建立 Couchbase 叢集。

建立 Couchbase “主”複製控制器

Couchbase 主 RC 可以使用以下配置檔案建立

apiVersion: v1  
kind: ReplicationController  
metadata:  
  name: couchbase-master-rc  
spec:  
  replicas: 1  
  selector:  
    app: couchbase-master-pod  
  template:  
    metadata:  
      labels:  
        app: couchbase-master-pod  
    spec:  
      containers:  
      - name: couchbase-master  
        image: arungupta/couchbase:k8s  
        env:  
          - name: TYPE  
            value: MASTER  
        ports:  
        - containerPort: 8091  
----  
apiVersion: v1  
kind: Service  
metadata:   
  name: couchbase-master-service  
  labels:   
    app: couchbase-master-service  
spec:   
  ports:  
    - port: 8091  
  selector:   
    app: couchbase-master-pod  
  type: LoadBalancer

此配置檔案建立了一個 couchbase-master-rc 複製控制器。此 RC 包含一個使用 arungupta/couchbase:k8s 映象建立的 Pod 副本。此映象使用此處的 Dockerfile 建立。此 Dockerfile 使用配置指令碼來配置基礎 Couchbase Docker 映象。首先,它使用Couchbase REST API設定記憶體配額、設定索引、資料和查詢服務、安全憑據,並載入一個示例資料桶。然後,它呼叫適當的Couchbase CLI命令將 Couchbase 節點新增到叢集或新增節點並重新平衡叢集。這基於三個環境變數:

  • TYPE:定義加入的 Pod 是工作節點還是主節點
  • AUTO_REBALANCE:定義叢集是否需要重新平衡
  • COUCHBASE_MASTER:主服務的名稱

對於第一個配置檔案,TYPE 環境變數設定為 MASTER,因此不會對 Couchbase 映象進行額外配置。

讓我們建立並驗證這些工件。

建立 Couchbase 主 RC

kubectl create -f cluster-master.yml   
replicationcontroller "couchbase-master-rc" created  
service "couchbase-master-service" created

列出所有服務

kubectl get svc  
NAME                       CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE  
couchbase-master-service   10.0.57.201                 8091/TCP   30s  
kubernetes                 10.0.0.1      \<none\>        443/TCP    5h

輸出顯示 `couchbase-master-service` 已建立。

獲取所有 Pod

kubectl get po  
NAME                        READY     STATUS    RESTARTS   AGE  
couchbase-master-rc-97mu5   1/1       Running   0          1m

一個 Pod 是使用配置檔案中指定的 Docker 映象建立的。

檢查 RC

kubectl get rc  
NAME                  DESIRED   CURRENT   AGE  
couchbase-master-rc   1         1         1m

它顯示 RC 中期望的 Pod 數量和當前的 Pod 數量是匹配的。

描述服務

kubectl describe svc couchbase-master-service  
Name: couchbase-master-service  
Namespace: default  
Labels: app=couchbase-master-service  
Selector: app=couchbase-master-pod  
Type: LoadBalancer  
IP: 10.0.57.201  
LoadBalancer Ingress: a94f1f286590c11e68e100283628cd6c-1110696566.us-west-2.elb.amazonaws.com  
Port: \<unset\> 8091/TCP  
NodePort: \<unset\> 30019/TCP  
Endpoints: 10.244.2.3:8091  
Session Affinity: None  
Events:

  FirstSeen LastSeen Count From SubobjectPath Type Reason Message

  --------- -------- ----- ---- ------------- -------- ------ -------

  2m 2m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer

  2m 2m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer

在其他詳細資訊中,負載均衡器入口旁邊顯示的地址對我們來說是相關的。此地址用於訪問 Couchbase Web 控制檯。

等待約 3 分鐘,待負載均衡器準備好接收請求。Couchbase Web Console 可透過 :8091 訪問,介面如下所示:

配置檔案中使用的映象配置了管理員使用者名稱和密碼。輸入憑據以檢視控制檯

點選“伺服器節點”檢視叢集中有多少個Couchbase節點。正如預期的那樣,它只顯示一個節點

點選“資料桶”檢視作為映象一部分建立的示例桶

這表明 `travel-sample` 儲存桶已建立,幷包含 31,591 份 JSON 文件。

建立 Couchbase“工作節點”複製控制器
現在,讓我們建立一個工作複製控制器。它可以使用配置檔案建立

apiVersion: v1  
kind: ReplicationController  
metadata:  
  name: couchbase-worker-rc  
spec:  
  replicas: 1  
  selector:  
    app: couchbase-worker-pod  
  template:  
    metadata:  
      labels:  
        app: couchbase-worker-pod  
    spec:  
      containers:  
      - name: couchbase-worker  
        image: arungupta/couchbase:k8s  
        env:  
          - name: TYPE  
            value: "WORKER"  
          - name: COUCHBASE\_MASTER  
            value: "couchbase-master-service"  
          - name: AUTO\_REBALANCE  
            value: "false"  
        ports:  
        - containerPort: 8091

此 RC 也使用相同的 arungupta/couchbase:k8s 映象建立了一個 Couchbase 的單一副本。這裡的關鍵區別在於:

  • TYPE 環境變數設定為 WORKER。這將一個工作 Couchbase 節點新增到叢集中。
  • COUCHBASE_MASTER 環境變數傳入了 couchbase-master-service 的值。這利用了 Kubernetes 內建的服務發現機制,用於工作節點和主節點中的 Pod 進行通訊。
  • AUTO_REBALANCE 環境變數設定為 false。這確保節點只新增到叢集中,但叢集本身不會重新平衡。重新平衡是必需的,以在叢集的多個節點之間重新分發資料。這是推薦的方法,因為可以先新增多個節點,然後可以使用 Web 控制檯手動重新平衡叢集。讓我們建立一個工作節點
kubectl create -f cluster-worker.yml   
replicationcontroller "couchbase-worker-rc" created

檢查 RC

kubectl get rc  
NAME                  DESIRED   CURRENT   AGE  
couchbase-master-rc   1         1         6m  
couchbase-worker-rc   1         1         22s

一個新的 `couchbase-worker-rc` 被建立,其中所需的例項數和當前的例項數匹配。

獲取所有 Pod

kubectl get po  
NAME                        READY     STATUS    RESTARTS   AGE  
couchbase-master-rc-97mu5   1/1       Running   0          6m  
couchbase-worker-rc-4ik02   1/1       Running   0          46s

現在又建立了一個額外的 Pod。每個 Pod 的名稱都以相應的 RC 名稱為字首。例如,工作節點 Pod 的字首是 `couchbase-worker-rc`。

Couchbase Web 控制檯更新以顯示已新增新的 Couchbase 節點。這可以透過“待重新平衡”選項卡上帶有數字 1 的紅色圓圈來證明。

點選選項卡顯示需要重新平衡的節點IP地址

擴充套件 Couchbase 叢集

現在,讓我們透過擴充套件工作 RC 的副本數量來擴充套件 Couchbase 叢集

kubectl scale rc couchbase-worker-rc --replicas=3  
replicationcontroller "couchbase-worker-rc" scaled

RC 的更新狀態顯示已建立 3 個工作 Pod

kubectl get rc  
NAME                  DESIRED   CURRENT   AGE  
couchbase-master-rc   1         1         8m  
couchbase-worker-rc   3         3         2m

這可以透過獲取 Pod 列表再次驗證

kubectl get po  
NAME                        READY     STATUS    RESTARTS   AGE  
couchbase-master-rc-97mu5   1/1       Running   0          8m  
couchbase-worker-rc-4ik02   1/1       Running   0          2m  
couchbase-worker-rc-jfykx   1/1       Running   0          53s  
couchbase-worker-rc-v8vdw   1/1       Running   0          53s

Couchbase Web Console 的“待重新平衡”選項卡顯示,已有 3 臺伺服器新增到叢集中,需要進行重新平衡。

重新平衡 Couchbase 叢集

最後,點選“重新平衡”按鈕來重新平衡叢集。將顯示一個訊息視窗,顯示重新平衡的當前狀態。

一旦所有節點重新平衡,Couchbase 叢集即可準備好為您提供請求

除了建立叢集之外,Couchbase Server 還支援一系列高可用性和災難恢復(HA/DR)策略。大多數 HA/DR 策略都依賴於多管齊下的方法,即最大限度地提高可用性,增加資料中心內部和之間冗餘,以及執行定期備份。

既然您的 Couchbase 叢集已準備就緒,您可以執行您的第一個示例應用程式

如需更多資訊,請訪問 Couchbase 開發者門戶論壇,或在 Stack Overflow 上檢視相關問題。