这篇文章已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已失效。

使用 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 企业版上测试通过。

就像所有美好的事物一样,这篇文章也站在巨人的肩膀上。本文中使用的设计模式是在一个周五下午的 hackathon 中与 @saturnism 一起确定的。配置文件的可用版本由 @r_schmiddy 贡献

Couchbase 集群

Couchbase Server 集群通常部署在商用服务器上。Couchbase Server 采用点对点拓扑结构,其中所有节点都是平等的,并按需相互通信。没有主节点、从节点、配置节点、名称节点、头节点等概念,并且加载到每个节点上的软件是完全相同的。这使得可以在不考虑其“类型”的情况下添加或删除节点。这种模型尤其适用于一般的云基础设施。对于 Kubernetes 而言,这意味着我们可以为所有 Couchbase 节点使用完全相同的容器镜像。

典型的 Couchbase 集群创建流程如下:

  • 启动 Couchbase:启动 n 个 Couchbase 服务器
  • 创建集群:选择任一服务器,并将所有其他服务器添加到其中以创建集群
  • Rebalance 集群:Rebalance 集群,以便数据在集群中分布

为了使用 Kubernetes 进行自动化,集群创建被拆分为一个“主”和“工作”Replication Controller (RC)。

主 RC 只有一个副本,并且也被发布为一个 Service。这为启动集群创建提供了一个单一参考点。默认情况下,Service 只能在集群内部可见。该 Service 也作为负载均衡器暴露。这使得可以通过集群外部访问Couchbase Web 控制台

工作 RC 使用与主 RC 完全相同的镜像。这保持了集群的同质性,使得集群可以轻松扩展。

本文使用的配置文件可在此处获取。让我们创建 Kubernetes 资源来创建 Couchbase 集群。

创建 Couchbase“主”Replication Controller

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 的 Replication Controller。该 RC 有一个副本,使用了 arungupta/couchbase:k8s 镜像创建 Pod。该镜像使用此处的 Dockerfile 创建。该 Dockerfile 使用配置脚本来配置基础 Couchbase Docker 镜像。首先,它使用Couchbase REST API 设置内存配额、设置索引、数据和查询服务、安全凭据,并加载一个示例数据桶。然后,它调用相应的Couchbase CLI 命令将 Couchbase 节点添加到集群,或添加节点并重新平衡集群。这基于三个环境变量:

  • TYPE:定义加入的 pod 是 worker 还是 master
  • AUTO_REBALANCE:定义集群是否需要 rebalance
  • COUCHBASE_MASTER:主服务的名称

对于第一个配置文件,TYPE 环境变量设置为 MASTER,因此无需对 Couchbase 镜像进行额外配置。

让我们创建并验证这些资源。

创建 Couchbase 主 RC

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

列出所有 services

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

已使用配置文件中指定的 Docker 镜像创建了一个 pod。

检查 RC

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

它显示 RC 中期望的 pod 数量和当前 pod 数量匹配。

描述 service

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 控制台。

等待约 3 分钟,直到负载均衡器准备好接收请求。Couchbase Web 控制台可通过 <ip>:8091 访问,界面如下:

配置文件中使用的镜像已配置了管理员用户名 Administrator 和密码 password。输入凭据以查看控制台

单击“Server Nodes”(服务器节点)查看集群中有多少 Couchbase 节点。正如预期,它只显示一个节点

单击“Data Buckets”(数据桶)查看作为镜像一部分创建的示例桶

这显示 travel-sample 桶已创建,并包含 31,591 个 JSON 文档。

创建 Couchbase“工作”Replication Controller
现在,让我们创建一个工作 Replication Controller。可以使用以下配置文件创建:

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 内置的服务发现机制,使 worker 和 master 中的 pod 能够通信。
  • AUTO_REBALANCE 环境变量设置为 false。这确保节点只被添加到集群,但集群本身不进行 rebalance。Rebalance 需要将数据重新分布到集群的多个节点上。这是推荐的方式,因为可以先添加多个节点,然后通过 Web 控制台手动 rebalance 集群。让我们创建一个 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 控制台会更新,显示已添加了一个新的 Couchbase 节点。这在“Pending Rebalance”(待 Rebalance)标签页上的红色圆圈和数字 1 中可见。

单击该标签页会显示需要 rebalance 的节点的 IP 地址。

扩展 Couchbase 集群

现在,让我们通过扩展 worker RC 的副本来扩展 Couchbase 集群:

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

RC 的更新状态显示已创建了 3 个 worker 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 控制台的“Pending Rebalance”标签页显示已有 3 个服务器已添加到集群,需要进行 rebalance。

Rebalance Couchbase 集群

最后,单击“Rebalance”按钮进行集群 rebalance。将显示一个消息窗口,显示 rebalance 的当前状态。

一旦所有节点都完成 rebalance,Couchbase 集群即可准备好处理你的请求。

除了创建集群之外,Couchbase Server 还支持一系列高可用性和灾难恢复 (HA/DR) 策略。大多数 HA/DR 策略依赖于多管齐下的方法,包括最大化可用性、增加数据中心内部和跨数据中心的冗余,以及执行定期备份。

现在你的 Couchbase 集群已准备就绪,你可以运行你的第一个示例应用

欲了解更多信息,请查看 Couchbase 开发者门户论坛,或在Stack Overflow 上查看相关问题。