本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

使用 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 上查看相关问题。