基于minikube的kubernetes集群部署及Vitess最佳实践

简介

minikube是一个能够很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,能够很方便的供Kubernetes平常开发使用;minikube在Linux下是部署须要依赖VirtualBox或者KVM,本文中所说的是基于KVM驱动搭建单机集群环境。
minikube运行的大体结构以下:
Alt texthtml

minikube环境搭建

minikube安装

Minikube使用go语言编写,发布形式是一个独立的二进制文件,所以只须要下载,而后放到对应的位置便可正常使用。node

# 下载minikube-linux-amd64文件 $ wget https://storage.googleapis.com/minikube/releases/v0.16.0/minikube-linux-amd64 # 增长可执行权限 $ chmod +x minikube-linux-amd64 # 将可执行文件移动到/usr/local/bin $ mv minikube-linux-amd64 /usr/local/bin/minikube # 查看版本确认是否安装成功 $ minikube version # minikube version: v0.16.0

kubectl安装

kubectl一样是go语言编写, 发布形式是一个独立的二进制文件,咱们只须要下载该文件就能够正常使用。mysql

# 下载kubectl文件 $ wget http://storage.googleapis.com/kubernetes-release/release/v1.3.0/bin/linux/amd64/kubectl # 增长可执行权限 $ chmod +x kubectl # 移动文件到/usr/local/bin下 $ mv kubectl /usr/local/bin # 查看版本确认安装成功 $ kubectl version

docker-machine-driver-kvm安装

docker-machine-driver-kvm是提供在kvm虚拟机上安装docker的驱动程序,二进制发布,能够直接下载使用。linux

# 下载驱动 $ wget https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.7.0/docker-machine-driver-kvm # 增长可执行权限 $ chmod +x docker-machine-driver-kvm # 移动文件到/usr/local/bin $ mv docker-machine-driver-kvm /usr/local/bin

kvm驱动安装

安装kvm驱动主要是为了在本机运行kvm虚拟机, kvm驱动须要根据本身系统到官网下载对应的驱动进行安装。 minikube官方对kvm驱动的安装说明请参考: kvm驱动
如下是我我的整理的须要安装的内容:git

# centos 系统 # 安装驱动 $ yum install libvirt-daemon-kvm kvm # 安装驱动相关工具 $ yum install libguestfs libguestfs-tools libvirt # ubuntu 系统 # 安装驱动和相应的工具 $ sudo apt install libvirt-bin qemu-kvm

启动kvm相关服务

kvm安装好后须要启动相应的服务才能保证虚拟机正常启动使用github

$ libvirtd -d
$ systemctl start virtlogd.socket

启动minikube

经过上面的安装下面咱们就能够正常启动minikube了,因为minikube启动参数比较多,如下咱们只列出两条,简单说明下,须要详细了解请自行阅读minikube帮助文档,帮助信息能够经过如下命令查看:web

$ minikube -h

正常启动命令sql

# 正常启动minikube服务,指定驱动;不开启日志 # --vm 参数指定了须要使用的驱动程序, linux下默认使用的是virtualbox程序来启动, 因为virtualbox操做安装问题较多,因此这里选用了kvm # 能够借助kvm强大的命令行工具集合来操做, 方便快捷 $ minikube start --vm-driver=kvm

开启日志启动命令docker

# 启动minikube而且开启日志, --v参数是能够指定minikube的日志级别 # --v=0 INFO level logs # --v=1 WARNING level logs # --v=2 ERROR level logs # --v=3 libmachine logging # --v=7 libmachine --debug level logging $ minikube start --v=7 --vm-driver=kvm

以上只说明了--v和--vm参数的使用说明,因为minikube涉及的参数比较多,使用的时候能够根据本身须要查看帮助文档,或者参考官方说明。本文只列出了linux下的部署说明,windows和mac系统下请参阅官方说明shell

通过上面的步骤我就能够正常使用minikube和kubectl来管理操做咱们的集群了。

集群操做经常使用命令

kubectl相关

# 命令会返回当前kubernetes 已经建立的pods列表,主要会显示如下信息 # NAME READY STATUS RESTARTS AGE $ kubectl get pod # NAME READY STATUS RESTARTS AGE # etcd-global-9002d 1/1 Running 0 2d # etcd-global-l3ph8 1/1 Running 0 2d # etcd-global-psj52 1/1 Running 0 2d
  • 查看pod详细信息
# 使用pod名称查看pod的详细信息, 主要是容器的详细信息 $ kubectl describe pod etcd-global-9002d
  • 查询部署列表
# 获取部署列表 $ kubectl get deployment
  • 删除部署
# 删除名称为etcd-minikube的部署 $ kubectl delete deployment etcd-minikube

容器相关

  • 拉取容器镜像
# 拉取远端名称为test的镜像 $ docker pull test # docker pull vitess/etcd:v2.0.13-lite # docker pull vitess/lite
  • 查看容器列表
# 查看当前启动的容器列表 $ docker ps # 返回如下信息 # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 登陆容器
# 经过容器ID登陆容器 $ docker exec -it 容器ID /bin/bash  # docker exec -it 66f92ed4befb /bin/bash
  • 保存容器镜像
# 保存已经下载下来的容器到文件,xxx是镜像名称(REPOSITORY)  $ docker save -o xxx.tar xxx 
  • 加载镜像
# 加载导出的镜像文件 $ docker load --input xxx.tar

若是有多个镜像文件,可使用脚本进行批量导入

$ ls -l | awk -F ' ' '{print "docker load --input="$NF}' | sh

kvm相关

kvm命令也不少,下面介绍部分命令,详细的命令信息能够参见virsh -h

  • 启动虚拟机
### 启动已经建立的虚拟机xxxx $ virsh start xxxx
  • 暂停虚拟机
# 暂停正在运行的虚拟机xxx $ virsh suspend xxxx
  • 设置虚拟机内存
# 修改内存 $ virsh setmem xxxxx 512000
  • 恢复挂起(暂停)的虚拟机
$ virsh resume xxxx
  • 修改虚拟机配置文件

    上面所说的修改内存还有一种方法是能够直接修改运行中的虚拟机的配置文件,以达到修改对应参数的效果,修改配置文件相对于其余命令来讲比较好用,kvm虚拟机配置都是以xml格式配置的,咱们可使用virsh edit直接修改。

    # 使用以下命令就会显示配置文件编辑窗口,对应的xml文件记录了虚拟机的各类参数, 修改完成重启虚拟机便可生效 $ virsh edit xxxx
  • 其余

    在使用minikube经过kvm建立虚拟机的时候,文件virbr1.status记录着对应的ip信息,若是出现ip冲突能够修改如下文件进行处理,保证如下文件只有一个惟一的ip便可。

$ vim /var/lib/libvirt/dnsmasq/virbr1.status

Vitess部署

本文假定用户已经具有本地部署Vitess的经验,须要将Vitess部署在Kubernetes,因此对于相关的环境依赖就不在作过多的说明; 若是有不明白的地方请先参阅官方文档。

编译安装vtctlclient

vtctlclient工具能够用来向Vitess发送命令, 因此安装环境前咱们须要先安装vtctlclient

  $ go get github.com/youtube/vitess/go/cmd/vtctlclient

该命令会在$GOPATH/src/github.com/youtube/vitess/目录下下载而且编译vtctlclient源码, 同时也会把编译好的vtctlclient二进制文件拷贝到目录$GOPATH/bin下。

本地kubectl

若是正常按照文档说明安装,本地`kubectl`就应该已经安装完成,这里咱们须要再次校验一下,确保`kubectl`处于正常可用状态。
检查`kubectl`是否已经正常安装并设置环境变量PATH:
``` sh
$ which kubectl
### example output:
# /usr/local/bin/kubectl
```

若是kubectl没有包含在$PATH环境变量中, 就须要设置`KUBECTL`环境变量,不然执行启动脚本的时候没法获取`kubectl`位置。

``` sh
$ export KUBECTL=/export/working/bin/kubectl
```

启动Vitess集群

1. 跳转到本地Vitess源代码目录

通过上面的步骤后,咱们就能够尝试着运行Vitess官方提供的实例了, 切换到$GOPATH/src/github.com/youtube/vitess/examples/kubernetes目录下:
``` sh
$ cd $GOPATH/src/github.com/youtube/vitess/examples/kubernetes
```
  1. 修改本地配置

    运行configure.sh脚原本生成config.sh文件,config.sh用于自定义的集群设置。对于备份官方支持两种方式file和gcs方式,咱们这里使用file方式建立备份。

    vitess/examples/kubernetes$ ./configure.sh
    ### example output: # Vitess Docker image (leave empty for default) []: # Backup Storage (file, gcs) [gcs]: file # Root directory for backups (usually an NFS mount): /backup # NOTE: You must add your NFS mount to the vtctld-controller-template # and vttablet-pod-template as described in the Kubernetes docs: # http://kubernetes.io/v1.0/docs/user-guide/volumes.html#nfs

    注意: 对于使用file方式备份的咱们须要在vttablet和vtctld pod中安装一个读写网络卷, 能够经过NFS(Network File System)将任何存 储服务mount到Kubernetes中;这样咱们就能够很方便的备份了。

  2. 启动etcd集群

    Vitess拓扑服务存储Vitess集群中全部服务器的协做元数据, 他将此数据存储在支持数据一致性的分布式存储系统中。本例中咱们使用etcd来存储,注意:咱们须要本身的etcd集群,与Kubernetes自己使用的集群分开。

    vitess/examples/kubernetes$ ./etcd-up.sh
    ### example output: # Creating etcd service for global cell... # service "etcd-global" created # service "etcd-global-srv" created # Creating etcd replicationcontroller for global cell... # replicationcontroller "etcd-global" created # ...

    这条命令建立了两个集群, 一个是全局数据中心集群,另外一个是本地数据中心集群。你能够经过运行如下命令来检查群集中pods的状态:

    $ kubectl get pods
    ### example output: # NAME READY STATUS RESTARTS AGE # etcd-global-8oxzm 1/1 Running 0 1m # etcd-global-hcxl6 1/1 Running 0 1m # etcd-global-xupzu 1/1 Running 0 1m # etcd-test-e2y6o 1/1 Running 0 1m # etcd-test-m6wse 1/1 Running 0 1m # etcd-test-qajdj 1/1 Running 0 1m

    Alt text

    Kubernetes节点第一次下载须要的Docker镜像的时候会耗费较长的时间, 在下载镜像的过程当中Pod的状态是Pending状态。

    注意: 本例中, 每一个以-up.sh结尾的脚本都有一个以-down.sh结尾的脚本相对应。 你能够用来中止Vitess集群中的某些组件,而不会关闭整个集群;例如:移除etcd的部署可使用一下命令:

    vitess/examples/kubernetes$ ./etcd-down.sh
  3. 启动vtctld vtctld提供了检查Vitess集群状态的相关接口, 同时还能够接收vtctlclient的RPC命令来修改集群信息。

    vitess/examples/kubernetes$ ./vtctld-up.sh
    ### example output: # Creating vtctld ClusterIP service... # service "vtctld" created # Creating vtctld replicationcontroller... # replicationcontroller "vtctld" create createdd
  4. 使用vtctld web界面

    在Kubernetes外面使用vtctld须要使用kubectl proxy在工做站上建立一个通道。

    注意: proxy命令是运行在前台, 因此若是你想启动proxy须要另外开启一个终端。

    $ kubectl proxy --port=8001
    ### example output: # Starting to serve on localhost:8001

    你能够在本地打开vtctld web界面:

    http://localhost:8001/api/v1/proxy/namespaces/default/services/vtctld:web/

    界面截图以下:
    Alt text

    同时,还能够经过proxy进入Kubernetes Dashboard, 监控nodes, pods和服务器状态:

    http://localhost:8001/ui 控制台截图以下:
    Alt text

  5. 启动vttablets

    tablet是Vitess扩展的基本单位。tablet由运行在相同的机器上的vttablet 和 mysqld组成。 咱们在用Kubernetes的时候经过将vttablet和mysqld的容器放在单个pod中来实现耦合。

    运行如下脚本以启动vttablet pod,其中也包括mysqld:

    vitess/examples/kubernetes$ ./vttablet-up.sh
    ### example output: # Creating test_keyspace.shard-0 pods in cell test... # Creating pod for tablet test-0000000100... # pod "vttablet-100" created # Creating pod for tablet test-0000000101... # pod "vttablet-101" created # Creating pod for tablet test-0000000102... # pod "vttablet-102" created # Creating pod for tablet test-0000000103... # pod "vttablet-103" created # Creating pod for tablet test-0000000104... # pod "vttablet-104" created

    启动后在vtctld Web管理界面中很快就会看到一个名为test_keyspacekeyspace,其中有一个名为0的分片。点击分片名称能够查看 tablets列表。当5个tablets所有显示在分片状态页面上,就能够继续下一步操做。注意,当前状态tablets不健康是正常的,由于在tablets上面尚未初始化数据库。

    tablets第一次建立的时候, 若是pod对应的node上还没有下载对应的Vitess镜像文件,那么建立就须要花费较多的时间。一样也能够经过命令行使用kvtctl.sh查看tablets的状态。

    vitess/examples/kubernetes$ ./kvtctl.sh ListAllTablets test
    ### example output: # test-0000000100 test_keyspace 0 spare 10.64.1.6:15002 10.64.1.6:3306 [] # test-0000000101 test_keyspace 0 spare 10.64.2.5:15002 10.64.2.5:3306 [] # test-0000000102 test_keyspace 0 spare 10.64.0.7:15002 10.64.0.7:3306 [] # test-0000000103 test_keyspace 0 spare 10.64.1.7:15002 10.64.1.7:3306 [] # test-0000000104 test_keyspace 0 spare 10.64.2.6:15002 10.64.2.6:3306 []

    Alt text

  6. 初始化MySQL数据库

    一旦全部的tablets都启动完成, 咱们就能够初始化底层数据库了。

    注意: 许多vtctlclient命令在执行成功时不返回任何输出。

    首先,指定tablets其中一个做为初始化的master。Vitess会自动链接其余slaves的mysqld实例,以便他们开启从master复制数据; 默认数据库建立也是如此。 由于咱们的keyspace名称为test_keyspace,因此MySQL的数据库会被命名为vt_test_keyspace

    vitess/examples/kubernetes$ ./kvtctl.sh InitShardMaster -force test_keyspace/0 test-0000000100
    ### example output: # master-elect tablet test-0000000100 is not the shard master, proceeding anyway as -force was used # master-elect tablet test-0000000100 is not a master in the shard, proceeding anyway as -force was used

    注意: 由于分片是第一次启动, tablets尚未准备作任何复制操做, 也不存在master。若是分片不是一个全新的分片,InitShardMaster命令增长-force标签能够绕过应用的完整性检查。

    tablets更新完成后,你能够看到一个 master, 多个 replica 和 rdonly tablets:

    vitess/examples/kubernetes$ ./kvtctl.sh ListAllTablets test
    ### example output: # test-0000000100 test_keyspace 0 master 10.64.1.6:15002 10.64.1.6:3306 [] # test-0000000101 test_keyspace 0 replica 10.64.2.5:15002 10.64.2.5:3306 [] # test-0000000102 test_keyspace 0 replica 10.64.0.7:15002 10.64.0.7:3306 [] # test-0000000103 test_keyspace 0 rdonly 10.64.1.7:15002 10.64.1.7:3306 [] # test-0000000104 test_keyspace 0 rdonly 10.64.2.6:15002 10.64.2.6:3306 []

    replica tablets一般用于提供实时网络流量, 而 rdonly tablets一般用于离线处理, 例如批处理做业和备份。 每一个tablet type的数量能够在配置脚本vttablet-up.sh中配置。

  7. 建立表

    vtctlclient命令能够跨越keyspace里面的全部tablets来应用数据库变动。如下命令能够经过文件create_test_table.sql的内容来建立表:

    # Make sure to run this from the examples/kubernetes dir, so it finds the file. vitess/examples/kubernetes$ ./kvtctl.sh ApplySchema -sql "$(cat create_test_table.sql)" test_keyspace

    建立表的SQL以下所示:

    CREATE TABLE messages ( page BIGINT(20) UNSIGNED, time_created_ns BIGINT(20) UNSIGNED, message VARCHAR(10000), PRIMARY KEY (page, time_created_ns) ) ENGINE=InnoDB

    咱们能够经过运行此命令来确认在给定的tablet上表是否建立成功,test-0000000100ListAllTablets命令显示 tablet列表中一个tablet的别名:

    vitess/examples/kubernetes$ ./kvtctl.sh GetSchema test-0000000100
    ### example output: # { # "DatabaseSchema": "CREATE DATABASE `{{.DatabaseName}}` /*!40100 DEFAULT CHARACTER SET utf8 */", # "TableDefinitions": [ # { # "Name": "messages", # "Schema": "CREATE TABLE `messages` (\n `page` bigint(20) unsigned NOT NULL DEFAULT '0',\n `time_created_ns` bigint(20) unsigned NOT NULL DEFAULT '0',\n `message` varchar(10000) DEFAULT NULL,\n PRIMARY KEY (`page`,`time_created_ns`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8", # "Columns": [ # "page", # "time_created_ns", # "message" # ], # ...
  8. 执行备份

    如今, 数据库初始化已经应用, 能够开始执行第一次备份了。在他们连上master而且复制以前, 这个备份将用于自动还原运行的任何其余副本。 若是一个已经存在的tablet出现故障,而且没有备份数据, 那么他将会自动从最新的备份恢复而且恢复复制。

    选择其中一个 rdonly tablets而且执行备份。由于在数据复制期间建立快照的tablet会暂停复制而且中止服务,因此咱们使用 rdonly 代替 replica。

    vitess/examples/kubernetes$ ./kvtctl.sh Backup test-0000000104

    备份完成后,能够经过一下命令查询备份列表:

    vitess/examples/kubernetes$ ./kvtctl.sh ListBackups test_keyspace/0
    ### example output: # 2017-02-21.142940.test-0000000104
  9. 初始化Vitess路由

    在本例中, 咱们只使用了没有特殊配置的单节点数据库。所以,咱们只须要确保当前配置的服务处于可用状态。 咱们能够经过运行如下命令完成:

    vitess/examples/kubernetes$ ./kvtctl.sh RebuildVSchemaGraph

    (此命令执行完成后将不显示任何输出)

  10. 启动vtgate

    Vitess经过使用vtgate来路由每一个客户端的查询到正确的vttablet。 在KubernetesIn中vtgate服务将链接分发到一个vtgatepods池中。pods由replication controller来制定。

    vitess/examples/kubernetes$ ./vtgate-up.sh
    ### example output: # Creating vtgate service in cell test... # service "vtgate-test" created # Creating vtgate replicationcontroller in cell test... # replicationcontroller "vtgate-test" created
  11. 说明

    到目前位置,咱们总体的Vitess环境就搭建好了,可使用命令链接服务进行测试,也能够本身部署对应的应用进行测试。 测试用例能够参考官方提供的测试用例

其余

基础环境的搭建彻底是依赖于Kubernetes, 如下列出了对应的Kubernetes文档, 有须要的能够根据须要进行查阅。
[Kubernetes中文文档](https://www.kubernetes.org.cn/k8s)
[Kubernetes官方文档](https://kubernetes.io/docs/)