使用Kubernetes创建一个Couchbase集群

编者注:今天的嘉宾帖子是Couchbase开发人员关系副总裁Arun Gupta,展示了如何使用Kubernetes设置Couchbase集群。

Couchbase服务器 是一个开放源代码的分布式NoSQL面向文档的数据库。它公开了一个快速键值存储,该存储具有用于毫秒级数据操作的托管缓存,用于快速查询的专用索引器以及用于执行SQL查询的查询引擎。对于移动和物联网(IoT)环境, Couchbase Lite 在设备上运行本机并管理与Couchbase Server的同步。

Couchbase服务器 4.5原为 最近宣布,带来 许多新功能, 包含 生产认证对Docker的支持。 Couchbase在Docker容器的各种编排框架中受支持,例如Kubernetes,Docker Swarm和Mesos,有关详细信息,请访问 这一页.

这篇博客文章将解释如何使用Kubernetes创建Couchbase集群。使用Kubernetes 1.3.3,Amazon Web Services和Couchbase 4.5 Enterprise Edition测试了此设置。

像所有美好的事物一样,这个职位站在巨人的肩膀上。本博客中使用的设计模式是在 星期五下午骇客@铅中毒。配置文件的工作版本为 贡献了 通过 @r_schmiddy.

Couchbase集群

通常,将Couchbase服务器集群部署在商用服务器上。 Couchbase服务器具有点对点拓扑,其中所有节点都是平等的,并根据需要相互通信。没有主节点,从节点,配置节点,名称节点,头节点等概念,并且每个节点上加载的所有软件都是相同的。它允许在不考虑节点“类型”的情况下添加或删除节点。总体而言,此模型与云基础架构特别有效。对于Kubernetes,这意味着我们可以为所有Couchbase节点使用完全相同的容器映像。

典型的Couchbase群集创建过程如下所示:

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

为了自动使用Kubernetes,将集群创建分为``主''和``工作''复制控制器(RC)。

主RC仅具有一个副本,并且也作为服务发布。这提供了一个开始集群创建的参考点。默认情况下,服务仅在群集内部可见。此服务也作为负载平衡器公开。这允许 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

该配置文件创建了一个ouchbase-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:主服务的名称

对于此第一个配置文件,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

输出显示创建了ouchbase-master-service。

获取所有豆荚:

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

使用配置文件中指定的Docker映像创建容器。

检查RC:

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

它表明RC中所需的吊舱数量与当前吊舱数量匹配。

描述服务:

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

Wait for ~3 mins for the load balancer to be ready to receive requests. Couchbase Web控制台 is accessible at <ip>:8091 和 looks like:

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

单击服务器节点以查看集群中有多少个Couchbase节点。如预期的那样,它仅显示一个节点:

单击数据桶,以查看作为图像一部分创建的样本桶:

这显示旅行样本存储桶已创建,并且具有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 Console手动重新平衡群集。 让我们创建一个工人:
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。

获取所有广告连播:

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

现在将创建一个附加的窗格。每个广告连播的名称都以相应的RC名称为前缀。例如,工作人员吊舱的前缀为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个工作单元:

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台服务器添加到群集中,需要重新平衡。

重新平衡Couchbase群集

最后,单击“重新平衡”按钮以重新平衡集群。将显示一个消息窗口,显示当前的重新平衡状态:

重新平衡所有节点后,Couchbase集群即可满足您的请求:

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

现在您的Couchbase集群已准备就绪,您可以运行第一个 样品申请.

有关更多信息,请查看Couchbase 开发者门户论坛,或查看有关的问题 堆栈溢出.

-Couchbase开发人员关系副总裁Arun Gupta