容器化是技术发展主流趋势之一,其中最具代表性之一就是Docker。通过Docker,用户可以非常方便和快速地搭建和跨平台移植应用。本期文章讲述怎样通过Docker和Kubernetes,部署和管理CockroachDB。
Docker
Dockerhub上有官方的CockroachDB镜像,用户通过拉取镜像,配置容器参数,生成和启动容器,即可快速方便搭建CockroachDB集群。
1、安装Docker
参考官方文档:https://docs.docker.com/engine/installation/
2、拉取镜像
CockroachDB的docker镜像版本信息,可参考:https://hub.docker.com/r/cockroachdb/cockroach/tags/
本文以v1.1.2为例
docker pull cockroachdb/cockroach:v1.1.2
3、配置网络
本文例子中,在同一台机器上启动3个节点容器,需配置网桥。
docker network create -d bridge roachnet
4、启动第一个节点
--name=roach1 \--hostname=roach1 \--net=roachnet \-p 26257:26257 -p 8080:8080 \-v "${PWD}/cockroach-data/roach1:/cockroach/cockroach-data" \cockroachdb/cockroach:v1.1.2 start --insecure
参数说明:
--name: 容器名字
--hostname: 节点主机名
--net: 网络配置
-p:容器端口映射
-v:把容器中CockroachDB数据和日志文件路径映射到本机文件路径,这样关闭或者删除容器后,数据库文件仍可保留。
cockroach/cockroach:v1.1.2:镜像名字和镜像版本
start –insecure: 以insecure模式启动CockroachDB节点
5、启动其他节点并加入到集群中
docker run -d \--name=roach2 \--hostname=roach2 \--net=roachnet \-v "${PWD}/cockroach-data/roach2:/cockroach/cockroach-data" \cockroachdb/cockroach:v1.1.2 start --insecure --join=roach1docker run -d \--name=roach3 \--hostname=roach3 \--net=roachnet \-v "${PWD}/cockroach-data/roach3:/cockroach/cockroach-data" \cockroachdb/cockroach:v1.1.2 start --insecure --join=roach1
大部分参数与上述启动第一个节点容器相同,唯一区别是CockroachDB节点启动命令使用了--join,意思是加入到第一个启动节点中。
6、检查容器
确保三个CockorachDB节点容器正常运行。
docker container ls

7、测试集群
通过docker exec – it 能以交互方式在Docker容器里执行命令。
首先,在其中一个节点容器中启动Cockoroach sql shell,并写入数据。

接着,在其他节点容器中以相同方式启动Cockroach sql shell,可正确查询刚才写入的数据。

8、监控
启动容器时,容器里8080端口被映射到本机8080端口。所以通过http://localhost:8080即可访问CockroachDB集群Admin UI进行监控。

9、关闭容器
docker stop roach1,roach2,roach3
Kubernetes
随着容器化的普及,出现了很多便捷部署和管理容器的工具。其中比较常用的有Kubernetes和Docker Swarm。本章节以Kubernetes为例子。
环境配置:OS X, Kubernetes v1.8.3,minikube v0.23.0, virtualbox v5.2.2
1、安装环境
参考官方文档,安装minikube和kubectl
https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/
Minikube支持如下驱动,默认使用Virtualbox,本文使用Virtualbox为例子。
virtualbox
vmwarefusion
KVM
Xhyve
Hyper-V
2、启动Minikube
通过Minikube和Kubectl创建Docker容器,需访问Google registry。因此,Minikube启动前,首先要确定是否需要经过Proxy进行访问。
测试命令:
curl --proxy “$http_proxy” https://cloud.google.com/container-registry/
如果使用Proxy,则启动Minikube命令如下。
minikube start --docker-env HTTP_PROXY=$http_proxy

启动Minikube后,可通过如下方式测试在VM中proxy是否正常工作。
echo $(minikube ip)ssh docker@$(minikube ip)# 密码是tcusercurl https://cloud.google.com/container-registry/exit
3、创建CockroachDB节点
kubectl create -f \
https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset.yaml
通过kubernetes,检查是否成功创建CockroachDB节点。
kubectl get pods

4、初始化CockroachDB集群
kubectl create -f \
https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init.yaml
检查集群初始化成功。
kubectl get job

5、检查集群状态
5.1、命令行
kubectl run cockroachdb -it --image=cockroachdb/cockroach \--rm --restart=Never \-- node status --all --insecure --host=cockroachdb-public
5.2、Admin UI
执行 kubectl port-forward cockroachdb-0 8080
访问 http://localhost:8080
6.模拟失败节点
创建节点时,StatefulSet指定replicas为3。所以当任一节点失败时,kubernetes会自动补齐以满足replicas指定值。
6.1、写入数据

6.2、杀掉其中一个节点
kubectl delete pod cockroachdb-2
6.3、检查集群状态
通过kubectl,发现3个CockroachDB节点pods仍在运行,cockroachdb-2 pods因为被自动补齐,运行时间比另外两个节点短。
kubectl get pods

6.4、查询数据

7、扩容
7.1、修改replicas参数,增加节点。
kubectl scale statefulset cockroachdb --replicas=4
7.2、检查节点数
7.2.1 kubectl
kubectl get pods

7.2.2 cockroach命令
kubectl run cockroachdb -it --image=cockroachdb/cockroach --rm --restart=Never --node atus --all --insecure --host=cockroachdb-public

8、关闭集群
kubectl delete \pods,statefulsets,services,persistentvolumeclaims,persistentvolumes,poddisruptionbudget,jobs \-l app=cockroachdb
Tips
1、pods启动失败,有两种调试方法:
ssh进入minikube VM,通过curl测试是否能访问Google registry。如果不能,则代表minikube启动参数没有配置proxy或者proxy在VM中不可用,需要修改配置参数并重新启动minikube。
执行如下命令,检查在minikube中docker能否正常使用。
eval $(minikube docker-env)docker pull hello-worldeval $(minikube docker-env -u)
2、CockroachDB集群初始化失败
通过kubectl执行CockroachDB集群初始化job,如果发现job一直没有成功,调试方式有:
查看节点和初始化job信息和日志
kubectl describe pods <pod_name>kubectl describe job <job_name>kubectl logs <pod_name>
查看kubectl创建CockroachDB节点pods的yaml配置文件,配置的端口是否被占用。
以上是对在Docker和Kubernetes中使用CockroachDB的简单描述,更多使用细则可参考Cockroach Labs官方文档。小编觉得,通过Docker搭建CockroachDB集群,还是非常便捷的。通过kubernetes管理CockroachDB部署,可以达到副本自动补齐,省下不少运维人力。
参考文档:
https://www.cockroachlabs.com/docs/stable/start-a-local-cluster-in-docker.html
https://www.cockroachlabs.com/docs/stable/orchestrate-cockroachdb-with-kubernetes-insecure.html
关于我们:我们是百度DBA团队,团队有两位CockroachDB PMC Member及一位Contributor, 目前正积极推动NewSQL在百度内部以及外部的发展。除了NewSQL, 我们在MySQL, PostgreSQL, GreenPlum有多年的内核开发经验及实践经验,对数据库和大数据领域有疑问或者需求欢迎联系我们,同时欢迎有志青年加入我们!
关注我们





