基于minikube的kubernetes集群部署及Vitess最佳实践
简介
minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用;minikube在Linux下是部署需要依赖VirtualBox或者KVM,本文中所说的是基于KVM驱动搭建单机集群环境。
minikube运行的大致结构如下:
minikube环境搭建
minikube安装
Minikube使用go语言编写,发布形式是一个独立的二进制文件,因此只需要下载,然后放到对应的位置即可正常使用。
# 下载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语言编写, 发布形式是一个独立的二进制文件,我们只需要下载该文件就可以正常使用。
# 下载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的驱动程序,二进制发布,可以直接下载使用。
# 下载驱动
$ 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驱动
以下是我个人整理的需要安装的内容:
# centos 系统
# 安装驱动
$ yum install libvirt-daemon-kvm kvm # 安装驱动相关工具
$ yum install libguestfs libguestfs-tools libvirt # ubuntu 系统
# 安装驱动和相应的工具
$ sudo apt install libvirt-bin qemu-kvm
启动kvm相关服务
kvm安装好后需要启动相应的服务才能保证虚拟机正常启动使用
$ libvirtd -d
$ systemctl start virtlogd.socket
启动minikube
通过上面的安装下面我们就可以正常启动minikube了,由于minikube启动参数比较多,以下我们只列出两条,简单说明下,需要详细了解请自行阅读minikube帮助文档,帮助信息可以通过以下命令查看:
$ minikube -h
正常启动命令
# 正常启动minikube服务,指定驱动;不开启日志
# --vm 参数指定了需要使用的驱动程序, linux下默认使用的是virtualbox程序来启动, 由于virtualbox操作安装问题较多,所以这里选用了kvm
# 可以借助kvm强大的命令行工具集合来操作, 方便快捷
$ minikube start --vm-driver=kvm
开启日志启动命令
# 启动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系统下请参阅官方说明。
经过上面的步骤我就可以正常使用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
```
修改本地配置
运行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中;这样我们就可以很方便的备份了。
启动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 1mKubernetes节点第一次下载需要的Docker镜像的时候会耗费较长的时间, 在下载镜像的过程中Pod的状态是Pending状态。
注意: 本例中, 每个以
-up.sh
结尾的脚本都有一个以-down.sh
结尾的脚本相对应。 你可以用来停止Vitess集群中的某些组件,而不会关闭整个集群;例如:移除etcd
的部署可以使用一下命令:vitess/examples/kubernetes$ ./etcd-down.sh
启动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使用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/
界面截图如下:
同时,还可以通过proxy进入Kubernetes Dashboard, 监控nodes, pods和服务器状态:
http://localhost:8001/ui 控制台截图如下:
启动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_keyspace
的keyspace,其中有一个名为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 []初始化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
中配置。创建表
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-0000000100
是ListAllTablets
命令显示 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"
# ],
# ...执行备份
现在, 数据库初始化已经应用, 可以开始执行第一次备份了。在他们连上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初始化Vitess路由
在本例中, 我们只使用了没有特殊配置的单节点数据库。因此,我们只需要确保当前配置的服务处于可用状态。 我们可以通过运行以下命令完成:
vitess/examples/kubernetes$ ./kvtctl.sh RebuildVSchemaGraph
(此命令执行完成后将不显示任何输出)
启动vtgate
Vitess通过使用vtgate来路由每个客户端的查询到正确的
vttablet
。 在KubernetesIn中vtgate
服务将连接分发到一个vtgate
pods池中。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说明
到目前位置,我们整体的Vitess环境就搭建好了,可以使用命令连接服务进行测试,也可以自己部署对应的应用进行测试。 测试用例可以参考官方提供的测试用例。
其他
基础环境的搭建完全是依赖于Kubernetes, 以下列出了对应的Kubernetes文档, 有需要的可以根据需要进行查阅。
[Kubernetes中文文档](https://www.kubernetes.org.cn/k8s)
[Kubernetes官方文档](https://kubernetes.io/docs/)
基于minikube的kubernetes集群部署及Vitess最佳实践的更多相关文章
- 基于Kubernetes集群部署skyDNS服务
目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...
- Kubernetes集群部署关键知识总结
Kubernetes集群部署需要安装的组件东西很多,过程复杂,对服务器环境要求很苛刻,最好是能连外网的环境下安装,有些组件还需要连google服务器下载,这一点一般很难满足,因此最好是能提前下载好准备 ...
- kubernetes集群部署
鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试.kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,c ...
- 为Kubernetes集群部署本地镜像仓库
目录贴:Kubernetes学习系列 经过之前两篇文章:Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应用了 ...
- kubernetes 集群部署
kubernetes 集群部署 环境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152 ...
- linux运维、架构之路-Kubernetes集群部署
一.kubernetes介绍 Kubernetes简称K8s,它是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部 ...
- Kubernetes 集群部署(2) -- Etcd 集群
Kubenetes 集群部署规划: 192.168.137.81 Master 192.168.137.82 Node 192.168.137.83 Node 以下在 Master 节点操作. ...
- Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目
在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...
- Docker学习-Kubernetes - 集群部署
Docker学习 Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通搭建 Docker学习-Docker搭建Consul集群 Docker学习-简单的私有Dock ...
随机推荐
- FTP软件发送"AUTH TLS"提示 无法连接到服务器
响应: 220-FileZilla Server version 0.9.24 beta 响应: 220-written by Tim Kosse (Tim.Kosse@gmx.de) 响应: 220 ...
- 关于wxpy,使用Python玩转微信的问题
在github上下载了,安装了之后在idle上运行,好像是说Python不能上网.新手求助.现在问题已经解决,是ssl 证书的问题,不能用最新的 复制内容到剪贴板 代码: sudo pip unins ...
- 深入研究memcache 特性和限制
深入研究memcache 特性和限制在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 .Memcached 单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个M ...
- zookeeper(三):java操作zookeeper
引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...
- nekohtml转换html时标签变大写的问题
public static Document transferByNeko(InputStream stream, String charset) { if (stream == null) retu ...
- loongson官方PMON使用
目录 [隐藏] 1 PMON使用介绍 1.1 进入PMON控制界面 1.2 Pmon的图形界面 1.3 Pmon的基本命令 1.3.1 Boot and Load 启动与加载内核 1.3.2 MyC ...
- Windows编程总结之 DLL
+-- 版本 --+-- 编辑日期 --+-- 作者 -------------+ | V1. | | yin_caoyuan@.com | +----------+--------------+-- ...
- php中Http请求方法和响应状态码整理教程
HTTP请求报文由请求行(request line).请求头部(header).空行和请求数据4个部分组成,格式如下 可见请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格 ...
- Highcharts 图表js框架
纯js图表框架 ,图表传入Json数据 设置等等 , 如没特定要求可以考虑使用 优点 : 减轻服务器脚本运行负重 ,纯js执行,特效 缺点: 已知兼容性不高 帮助地址: http://w ...
- 【Python】分享使用的插件文件链接(实时更新)
链接:https://pan.baidu.com/s/1o7AgHtw Python工具实时更新.