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

使用 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 实现自动化,集群创建被拆分为“主”和“工作”副本控制器 (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

此配置文件创建了一个 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

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

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

等待约 3 分钟,让负载均衡器准备好接收请求。 Couchbase Web 控制台可通过 <ip>: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 控制台的“待重新平衡”选项卡显示现在已将 3 个服务器添加到集群中,并且需要重新平衡。

重新平衡 Couchbase 集群

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

所有节点重新平衡后,Couchbase 集群即可处理您的请求

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

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

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