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

使用 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 伺服器叢集通常部署在標準伺服器上。Couchbase Server 具有對等拓撲,其中所有節點都是對等的,並依需求互相溝通。沒有主節點、從節點、配置節點、名稱節點、前端節點等概念,且每個節點上載入的所有軟體都相同。它允許新增或移除節點,而無需考慮它們的「類型」。此模型特別適用於一般的雲端基礎架構。對於 Kubernetes,這表示我們可以為所有 Couchbase 節點使用完全相同的容器映像檔。

典型的 Couchbase 叢集建立流程如下所示

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

為了使用 Kubernetes 自動化,叢集建立被分割成「master」和「worker」複製控制器 (RC)。

master RC 只有一個副本,並且也發布為服務。這提供了一個單一參考點來啟動叢集建立。預設情況下,服務僅在叢集內部可見。此服務也作為負載平衡器公開。這允許從叢集外部存取 Couchbase Web Console

worker RC 使用與 master RC 完全相同的映像檔。這保持了叢集的同質性,從而可以輕鬆擴展叢集。

此部落格中使用的組態檔案在此處提供。讓我們建立 Kubernetes 資源以建立 Couchbase 叢集。

建立 Couchbase「master」複製控制器

可以使用以下組態檔案建立 Couchbase master 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 是 worker 還是 master
  • AUTO_REBALANCE:定義叢集是否需要重新平衡
  • COUCHBASE_MASTER:master 服務的名稱

對於第一個組態檔案,TYPE 環境變數設定為 MASTER,因此 Couchbase 映像檔上未進行額外配置。

讓我們建立並驗證工件。

建立 Couchbase master 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。

取得所有 Pods

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 數量與目前的數量相符。

描述服務

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

在其他細節中,LoadBalancer Ingress 旁邊顯示的位址與我們相關。此位址用於存取 Couchbase Web Console。

等待約 3 分鐘,讓負載平衡器準備好接收請求。Couchbase Web Console 可在 <ip>:8091 存取,看起來像

組態檔案中使用的映像檔已配置管理員使用者名稱和密碼 password。輸入憑證以查看主控台

點擊 [Server Nodes] 以查看叢集中有多少 Couchbase 節點。如預期,它只顯示一個節點

點擊 [Data Buckets] 以查看作為映像檔一部分建立的範例桶

這顯示已建立 travel-sample 桶,並包含 31,591 個 JSON 文件。

建立 Couchbase「worker」複製控制器
現在,讓我們建立一個 worker 複製控制器。可以使用組態檔案建立它

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。這會新增一個 worker Couchbase 節點以新增至叢集。
  • COUCHBASE_MASTER 環境變數傳遞 couchbase-master-service 的值。這使用 Kubernetes 內建的服務發現機制,以便 worker 和 master 中的 Pods 進行通訊。
  • AUTO_REBALANCE 環境變數設定為 false。這確保節點僅新增至叢集,但叢集本身不會重新平衡。需要重新平衡以在叢集的多个節點之間重新分配資料。這是建議的方式,因為可以先新增多個節點,然後可以使用 Web Console 手動重新平衡叢集。讓我們建立一個 worker
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,其中所需的執行個體數量與目前的數量相符。

取得所有 Pods

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 名稱作為前綴。例如,worker Pod 的前綴為 couchbase-worker-rc。

Couchbase Web Console 已更新,顯示已新增新的 Couchbase 節點。在 [Pending Rebalance] 標籤上的紅色圓圈和數字 1 中可見這一點。

點擊標籤會顯示需要重新平衡的節點的 IP 位址

擴展 Couchbase 叢集

現在,讓我們通過擴展 worker RC 的副本來擴展 Couchbase 叢集

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

RC 的更新狀態顯示已建立 3 個 worker Pods

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

可以通過再次取得 Pods 列表來驗證這一點

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 的 [Pending Rebalance] 標籤顯示現在已將 3 個伺服器新增至叢集,並且需要重新平衡。

重新平衡 Couchbase 叢集

最後,點擊 [Rebalance] 按鈕以重新平衡叢集。顯示訊息視窗,顯示重新平衡的目前狀態

一旦所有節點都重新平衡,Couchbase 叢集就可以為您的請求提供服務

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

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

如需更多資訊,請查看 Couchbase 開發人員入口網站論壇,或查看 Stack Overflow 上的問題。