使用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
- 下载 Kubernetes
- 参与Kubernetes项目 的GitHub
- 发表问题(或回答问题) 堆栈溢出
- 与社区联系 松弛
- 跟随 @Kubernetesio 在Twitter上获取最新更新