本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
使用 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 上的問題。
- 下載 Kubernetes
- 參與 GitHub 上的 Kubernetes 專案
- 在 Stack Overflow 上發布問題(或回答問題)
- 在 Slack 上與社群聯繫
- 在 Twitter 上關注 @Kubernetesio 以獲取最新更新