使用Kubernetes创建 Couchbase 集群

码途觅云人
• 阅读 2854

编者按:本文由Couchbase 的VP Arun Gupta 编写,展示了如何用Kubernetes 设置 Couchbase 集群。
Couchbase Server是一个开源的、分布式的文档型NoSQL数据库。它有低于毫秒级的快速键值对存储,为快速查询设计的专用索引和执行SQL语句的引擎。对于移动应用和物联网(IOT)环境,Couchbase Lite在能本地设备上运行并与Couchbase Server进行同步。

最近刚刚发布的Couchbase Server 4.5加入了许多新功能,包括对Docker的生产认证支持。Couchbase 支持Docker容器的各种编排框架,如Kubernetes,Docker Swarm 和 Mesos,详情访问这个页面(http://www.couchbase.com/cont...)。

本文将演示如何使用Kubernetes 创建 Couchbase 集群。本次将使用Kubernetes 1.3.3 ,AWS和Couchbase 4.5企业版进行测试。

像所有美好的东西一样,本篇文章站在巨人的肩膀上。这篇文章的结构是saturnism在一个周五下午确定的,配置文件则由r_schmiddy贡献。

Couchbase集群

Couchbase 服务的集群通常部署在商用服务器上。Couchbase Server 有一个对等的拓扑结构,在该拓扑结构上所有节点是平等的并能按需通信。

没有主节点,从节点,配置节点,名称节点,头节点等概念,所有节点上的软件都是相同的。它允许在不考虑他们“类型”的情况下添加或删除节点。

该模式通常能在云基础设施模型上工作的特别好。对于 kubernetes,这意味着我们可以为所有Couchbase 节点使用完全相同的容器镜像。

一个典型的Couchbase 集群创建过程如下:

● 启动Couchbase:启动n个 Couchbase 服务器

● 创建集群:选择任一服务器,并添加所有其他服务器来创建集群

● 再平衡集群:重新平衡集群,使数据跨集群分布

为了使用Kubernetes,集群创建分为“master” 和 “worker”的Replication Controller(RC)。

master RC 只有一个副本并作为一个服务(service)发布。这样提供了一个单一的入口来开始集群创建。

默认情况下服务仅在集群内可见,但我们会将该服务作为一个负载均衡器暴露出去。这使得可从集群外部访问Couchbase Web控制台。

worker RC 跟master RC使用完全相同的镜像。这将保持集群的同质化,使得伸缩集群更加自如。

使用Kubernetes创建 Couchbase 集群

配置文件请查看这里(https://github.com/arun-gupta...)。让我们从创建 Kubernetes资源开始来创建Couchbase集群。

创建Couchbase master RC :

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

<hr />

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 镜像(https://github.com/arun-gupta...)创建了1个 pod 的副本。

该 Dockerfile使用配置脚本配置基础 Couchbase Docker 镜像。首先,它使用Couchbase REST API设置存储配额,设置索引、数据和查询服务,安全凭据,并加载样本数据桶(sample data bucket)。

然后,调用Couchbase CLI命令把Couchbase 节点添加到集群或添加节点并平衡集群。这是基于以下三个环境变量:

● TYPE:定义加入的 pod是worker还是 master

● AUTO_REBALANCE:定义集群是否需要重新平衡

● COUCHBASE_MASTER: master 服务的名称
第一个配置文件中,只将TYPE环境变量设置为MASTER。

让我们创建并验证。

创建 Couchbase master RC:

使用Kubernetes创建 Couchbase 集群

列出所有服务:

使用Kubernetes创建 Couchbase 集群

输出显示,couchbase-master-service 被创建。

列出所有pod:

使用Kubernetes创建 Couchbase 集群

配置文件中指定的Pod创建成功

查看 RC:

使用Kubernetes创建 Couchbase 集群

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: a94f1f286590c11e68e100283628 
cd6c-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

记下kubectl describe命令输出中LoadBalancer Ingress 的值。通过这个地址来访问 Couchbase Web控制台。

等待3 分钟左右让负载均衡器启动。然后通过<ip>:8091访问Couchbase Web控制台,如下:

使用Kubernetes创建 Couchbase 集群

配置文件指定的用户名是Administrator,密码是password,登录后页面如下:

使用Kubernetes创建 Couchbase 集群

点击Server Nodes,查看集群中有多少Couchbase节点。正如预期的那样,当前只显示一个节点:

使用Kubernetes创建 Couchbase 集群

点击 Data Buckets,查看作为镜像一部分的示例Bucket :

使用Kubernetes创建 Couchbase 集群

上图表明 travel-sample bucket被成功创建并有31591个 JSON文件。

创建一个Couchbase worker RC:

现在我们可以使用配置文件创建一个worker RC:



    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中的pod进行通信。

● AUTO_REBALANCE 环境变量设置为false。该环境变量确保了节点只添加到集群而集群本身不重新平衡。集群的再平衡用来在集群中的节点中重新分布数据。当多个节点首次被添加时推荐使用这种方式,之后集群可以使用Web 控制台来手动进行再平衡。

让我们创建 一个worker:

使用Kubernetes创建 Couchbase 集群

查看RC:

使用Kubernetes创建 Couchbase 集群

一个新的 couchbase-worker-rc 被创建,并且指定的pod数量与实际数量相同。

查看所有的pod:

使用Kubernetes创建 Couchbase 集群

worker的pod也创建成功。每个 pod 的名称前缀是了相应RC名称。例如,worker pod的名字前缀是couchbase-worker-rc。

刷新Couchbase Web控制台,能够看到一个新的Couchbase节点添加成功。在Pending Rebalance 标签能够看到一个明显的标记。

使用Kubernetes创建 Couchbase 集群

单击该标签查看需要重新平衡的节点IP地址:

使用Kubernetes创建 Couchbase 集群

伸缩 Couchbase 集群

现在,让我们通过调整worker RC的副本数量伸缩Couchbase 集群:

使用Kubernetes创建 Couchbase 集群

查看RC状态,发现pod数量修改为3个:

使用Kubernetes创建 Couchbase 集群

通过查看pod列表再次验证:

使用Kubernetes创建 Couchbase 集群

Couchbase Web控制台的Pending Rebalance 标签显示有3个服务被添加到集群并且需要重新平衡。

使用Kubernetes创建 Couchbase 集群

重新平衡 Couchbase 集群

最后,点击“Rebalance”按钮重新平衡集群。消息窗口显示重新平衡的当前状态:

使用Kubernetes创建 Couchbase 集群

一旦所有的节点重新平衡完成,Couchbase 集群将会随时响应请求:

使用Kubernetes创建 Couchbase 集群

除了创建集群, Couchbase Server 支持一系列高可用性和灾难恢复(HA / DR)策略。大多数的HA/DR 策略依赖于最大可用性,增加冗余,跨数据中心,定期备份等多种方法。

现在Couchbase 集群已就绪,你可以开始使用了。

更多信息请查看 Couchbase Developer Portal 和 Forums,或查看Stack Overflow上的问题。

本文由时速云翻译,如若转载,需注明转载自“时速云

原文链接: http://blog.kubernetes.io/201...

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Stella981 Stella981
3年前
Rancher 2.4.3
一、概述对于生产环境,需以高可用的配置安装Rancher,确保用户始终可以访问RancherServer。当安装在Kubernetes集群中时,Rancher将与集群的etcd集成,并利用Kubernetes调度实现高可用。为确保高可用,本文所部署的Kubernetes集群将专用于运行Rancher,Rancher运行
Stella981 Stella981
3年前
Rancher 2.2.2
对于生产环境,需以高可用的配置安装Rancher,确保用户始终可以访问RancherServer。当安装在Kubernetes集群中时,Rancher将与集群的etcd集成,并利用Kubernetes调度实现高可用。为确保高可用,本文所部署的Kubernetes集群将专用于运行Rancher,Rancher运行起来后,可再创建或导入
Stella981 Stella981
3年前
Kubernetes 集群日志管理
Kubernetes开发了一个Elasticsearch附加组件来实现集群的日志管理。这是一个Elasticsearch、Fluentd和Kibana的组合。Elasticsearch是一个搜索引擎,负责存储日志并提供查询接口;Fluentd负责从Kubernetes搜集日志并发送给Elasticsearch;Kibana提供了一个
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Couchbase 中的分布式储存
概述Couchbase是一个具有高性能、可扩展性和可用性强的数据库引擎。它可以让开发人员通过 NoSQL 的键值存储(二进制或者JSON)或者使用N1QL的形式对数据进行操作(N1QL是非常类似于SQL的一种语法操作JSON数据的方式)。以现在整体架构来看,Couchbase是往分布式数据库的方向发展下去。分布式数据库一
Stella981 Stella981
3年前
Kubernetes
1、Kubernetes中的用户所有的系统都存在访问和使用其的用户,Kubernetes也一样,在Kubernetes集群中有存在两类用户:serviceaccounts:由Kubernetes进行管理的特殊用户;普通用户:普通用户是由外部应用进行管理的用户。对于普通用户,
3A网络 3A网络
2年前
数据库系统设计:分区
数据库系统设计:分区术语澄清分区(partition),对应MongoDB、ES中的shard,HBase的Region,Bigtable的tablet,Cassandra的vnode,Couchbase的vBucket。但分区(partitioning)是最普遍的。定义每条数据(或每条记录,每行或每个文档)属于且仅属于某特定