本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
使用 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 可通过
配置文件中使用的镜像配置了管理员用户名和密码。输入凭据以查看控制台
点击“服务器节点”查看集群中有多少个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 上查看相关问题。
- 下载 Kubernetes
- 在 GitHub 上参与 Kubernetes 项目
- 在 Stack Overflow 上提问(或回答问题)
- 在 Slack 上与社区联系
- 在 Twitter 上关注 @Kubernetesio,获取最新更新。