邓丹和格雷格韦伯是PingCAP的云产品工程师。
Kubernetes的兴起极大地简化了云原生应用程序的部署和操作。 经验的重要部分是轻松运行像TiDB这样的云原生分布式数据库。 TiDB是一个开源的,MySQL兼容的“ NewSQL”数据库,它支持混合事务处理和分析处理(HTAP)。
在本教程中,我们将讨论如何使用TiDB Operator ,这是PingCAP的新开源项目,以利用Kubernetes部署整个TiDB平台及其所有组件。 TiDB Operator允许您监视Kubernetes集群中的TiDB部署,并提供管理职责的网关。
在这一点上,就像Linux基金会执行董事Jim Zemlin所说的那样,也许Kubernetes是云原生应用程序的事实上的编排引擎,即“云的Linux ”,这也许已成定局。 Kubernetes不仅是一种成熟且有用的技术,而且对许多大公司的IT运营都具有战略价值。 2017年, 至少有54%的《财富》 500强公司正在招聘Kubernetes技能。
受CoreOS的Operator Framework流行的概念和模式的启发,大约一年前,我们开始构建TiDB Operator。 那时,Kubernetes不稳定或功能丰富,因此我们不得不实施许多变通办法以使我们的操作员...运转良好。 随着去年Kubernetes的迅猛发展,我们在将GitHub上的TiDB Operator开源之前,重构了旧代码,使其与当今Kubernetes的标准和风格保持一致。
Kubernetes的日益普及催生了一个庞大的云原生应用生态系统,这一点可以由Cloud Native Computing Foundation(CNCF)组装的大量云原生项目来证明。 那么TiDB在所有这些方面适合什么呢? 这些应用程序中的大多数可以被认为是无状态的 ,占据了任何云本机体系结构的一些核心部分,例如微服务,服务网格,消息传递/跟踪/监视等。但是,有状态应用程序(例如持久性分布式数据库)还有一个地方)。 这就是TiDB的适用范围。
如何使用TiDB运算符
让我们深入研究如何在笔记本电脑上使用Kubernetes部署TiDB,尽管这可以在任何Kubernetes集群上完成。 请注意,此本地部署仅是为了使您能够体会TiDB Operator的测试和试验能力,而不能用于生产。 我们的团队和开源社区仍在对其进行测试。 我们鼓励您参加。
首先,让我们快速概述一下TiDB集群中的内容以及它如何与Kubernetes架构相适应。 每个TiDB集群都有三个组件:
- TiDB无状态SQL层;
- TiKV,持久化数据的分布式事务键值存储层;
- 布局驱动程序(PD),一个控制TiKV的元数据集群。
在Kubernetes的上下文中,TiKV和PD在磁盘上维护数据库状态,因此被映射到具有持久卷声明的StatefulSet。 TiDB无状态SQL层也映射到StatefulSet,但不会进行任何持久卷声明。
安装Kubernetes集群
该安装已经过测试,可以在MacOS和Linux上运行,但是请注意,在笔记本电脑上运行Kubernetes正在进行中。
Minikube是在笔记本电脑上运行Kubernetes的流行选项。 但是,Minikube仅创建一个Kubernetes节点。 要运行TiDB,我们需要多个Kubernetes节点。 有一些选项,但是在本教程中,我们将使用DinD(Docker中的Docker)。
DinD允许在顶级Docker容器内运行Docker守护程序。 这意味着顶级容器可以模拟Kubernetes节点并在其中启动容器。 kubeadm-dind-cluster项目通过DinD在独立计算机上作为Kubernetes节点启动了多个Docker容器,然后通过使用Docker在这些节点上启动Kubernetes组件来启动Kubernetes集群。
TiDB先决条件
在将TiDB集群部署到Kubernetes之前,请确保满足以下要求:
- 资源需求:2+ CPU,4GB +内存
- 注意:对于MacOS,您需要为Docker分配2+ CPU和4GB +内存。 有关详细信息,请参阅适用于Mac的Docker配置
- Docker :17.03或更高版本
- Kubectl :1.10或更高版本
- 注意:不同版本的Kubectl的输出可能会略有不同。
- md5sha1sum
- 对于Linux,默认情况下已安装md5sha1sum。
- 对于MacOS,请确保已安装md5sha1sum。 如果不是,请运行
brew install md5sha1sum
进行安装。
使用DinD部署Kubernetes集群
使用DinD安装和部署多节点Kubernetes集群:
$ wget https://cdn.rawgit.com/kubernetes-sigs/kubeadm-dind-cluster/master/fixed/dind-cluster-v1.10.sh
$ chmod +x dind-cluster-v1.10.sh
$ CNI_PLUGIN=flannel NUM_NODES=4 ./dind-cluster-v1.10.sh up
注意:如果由于与防火墙相关的问题而无法提取Docker映像,则可以尝试以下方法(使用的Docker映像是从UCloud Docker Registry提取的):
$ git clone https://github.com/pingcap/kubeadm-dind-cluster
$ cd kubeadm-dind-cluster
$ NUM_NODES=4 tools/multi_k8s_dind_cluster_manager.sh rebuild e2e-v1.10
(此引导过程将花费5到10分钟。这是获取冷饮或拉伸的好时机。)
完成DinD集群引导后,使用以下命令验证Kubernetes集群已启动并正在运行:
$ kubectl get node,componentstatus
$ kubectl get po -n kube-system
您的输出应类似于以下屏幕截图,其中所有组件都在运行。 如果没有,给它更多的时间。
![安装kubernetes](https://i-blog.csdnimg.cn/blog_migrate/3287c48dcd41944249e90f69ee457b7f.png)
如果您想在Kubernetes仪表板中查看部署,则可以使用以下命令启动代理:
$ kubectl proxy
然后,您可以查看仪表板 。
![kubernetes仪表板](https://i-blog.csdnimg.cn/blog_migrate/fc37388f7e1f69bef2e4922c5857822d.png)
现在集群已启动并正在运行,您需要将Kubernetes软件包管理器Helm安装到集群中。 Helm将用于部署和管理TiDB Operator和TiDB集群。
$ os=`uname -s| tr ‘[:upper:]’ ‘[:lower:]’`
$ wget “https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-${os}-amd64.tar.gz”
$ tar xzf helm-v2.9.1-${os}-amd64.tar.gz
$ sudo mv ${os}-amd64/helm /usr/local/bin
$ git clone https://github.com/pingcap/tidb-operator
$ cd tidb-operator
$ kubectl apply -f manifests/tiller-rbac.yaml
$ helm init --service-account=tiller --upgrade
$ kubectl get po -n kube-system | grep tiller # verify Tiller is running; this should take only a few seconds
$ helm version # verify the Helm server is running
注意:如果由于防火墙导致图像拖拉失败导致分helm init --service-account=tiller --upgrade
盒无法启动,则可以使用以下命令替换helm init --service-account=tiller --upgrade
:
helm init --service-account=tiller --upgrade —tiller-image=uhub.ucloud.cn/pingcap/tiller:v2.9.1
在Kubernetes中配置本地持久卷
LocalPersistentVolume用于持久保存PD / TiKV数据。 本地持久卷配置程序无法在DinD中直接使用,因此您将需要修改其部署。 而Kubernetes不支持动态provisionin 摹呢,所以你需要手动安装的磁盘或目录挂载点。
为了简化此操作,请使用以下脚本来帮助配置开发环境:
$ # create directories for local volumes, this happens in the tidb-operator directory
$ ./manifests/local-dind/pv-hosts.sh
$ # deploy local volume provisioner
$ kubectl apply -f manifests/local-dind/local-volume-provisioner.yaml
$ # wait for local-volume-provisioner pods to run, which may take a few minutes
$ kubectl get po -n kube-system -l app=local-volume-provisioner
$ # verify pv created
$ kubectl get pv
您的输出应如下所示:
![配置本地卷](https://i-blog.csdnimg.cn/blog_migrate/0ab78c1f96d50213d90f630c15f0fb72.png)
在DinD Kubernetes集群中安装TiDB Operator
$ kubectl apply -f manifests/crd.yaml
$ # This command creates the custom resource for the cluster that the operator uses.
$ kubectl get customresourcedefinitions
$ # Install the TiDB Operator into Kubernetes
$ helm install charts/tidb-operator --name=tidb-operator --namespace=pingcap
$ # while waiting for operator to run, you can check its status with this command
$ kubectl get po -n pingcap -l app=tidb-operator
![安装tidb运算符](https://i-blog.csdnimg.cn/blog_migrate/2a158340aa28f750ce5251545e0c6fd4.png)
在DinD Kubernetes集群中部署TiDB集群
$ helm install charts/tidb-cluster --name=tidb-cluster --namespace=tidb
$ # you can watch the tidb cluster get created using this ‘watch’ command
$ watch kubectl get pods --namespace tidb -l cluster.pingcap.com/tidbCluster=demo -o wide
您的输出应如下所示:
![部署tidb集群](https://i-blog.csdnimg.cn/blog_migrate/14a7abe6a00fee76ac131e762d3e55d2.png)
$ # you can see all the services available to you now with your tidb cluster deployment and their port number to access them
$ kubectl get service -n tidb
![kubectl获得服务](https://i-blog.csdnimg.cn/blog_migrate/165eff4f7c34783257b516034c02b8bc.png)
$ # you can see the entire pod with this command
$ kubectl get pod -n tidb
![kubectl获取吊舱](https://i-blog.csdnimg.cn/blog_migrate/8f0794a0104588ca7e01d8a8616e87dc.png)
要访问TiDB集群,请使用kubectl port-forward
将服务公开给主机。
使用MySQL客户端访问TiDB:
- 使用Kubectl将主机端口转发到TiDB服务端口:
$ kubectl port-forward svc/demo-tidb 4000:4000 --namespace=tidb
- 要使用MySQL客户端连接到TiDB,请打开一个新的终端选项卡或窗口,然后运行以下命令:
$ mysql -h 127.0.0.1 -P 4000 -u root
![MySQL监视器](https://i-blog.csdnimg.cn/blog_migrate/26166e09b9af9737495d163eac6c196a.png)
查看监视器仪表板:
- 使用Kubectl将主机端口转发到Grafana服务端口:
$ kubectl port-forward svc/demo-grafana 3000:3000 --namespace=tidb
- 将您的Web浏览器指向http:// localhost:3000,以访问Grafana监视界面。
- 默认用户名:admin
- 默认密码:admin
![tidb cluster grafana lg](https://i-blog.csdnimg.cn/blog_migrate/a8dfd0201615f2c1a57cd816ac4f3161.png)
尝试扩展和升级TiDB
现在,您已经使用tidb-operator部署了一个可用的TiDB集群,下面是一些可以尝试的功能。
TiDB中的水平缩放
您只需修改副本数即可扩展或扩展TiDB集群。
首先配置图表/tidb-cluster/values.yaml文件。 例如,要扩展集群,可以将TiKV副本的数量从3修改为5,或将TiDB副本的数量从2修改为3。
然后运行以下命令以应用更改:
helm upgrade tidb-cluster charts/tidb-cluster --namespace=tidb
注意:如果您需要扩展TiKV,则消耗的时间取决于现有数据量,因为需要安全地迁移数据。
升级TiDB
首先配置图表/tidb-cluster/values.yaml文件。 例如,将PD / TiKV / TiDB映像的版本从v2.0.4更改为v2.0.5。
然后运行以下命令以应用更改:
helm upgrade tidb-cluster charts/tidb-cluster --namespace=tidb
销毁TiDB集群
完成测试后,请使用以下命令销毁TiDB集群:
$ helm delete tidb-cluster --purge
注意:这只会删除正在运行的Pod和其他资源。 数据保持不变。 如果不再需要数据,请运行以下命令来清理数据。 (请注意,这将永久删除数据。)
$ kubectl get pv -l cluster.pingcap.com/namespace=tidb -o name | xargs -I {} kubectl patch {} -p ‘{”spec”:{”persistentVolumeReclaimPolicy”:”Delete”}}’
$ kubectl delete pvc --namespace tidb --all
销毁DinD Kubernetes集群
如果您不再需要DinD Kubernetes集群,请切换到存储dind-cluster-v1.10.sh的目录并运行以下命令:
$ ./dind-cluster-v1.10.sh clean
TiDB的后续步骤
我们希望您现在已经成功地使用TiDB Operator来启动TiDB集群,并体验了与MySQL的无缝兼容性。 当然,云本机应用程序是为大型分布式系统中的许多机器而不是单个笔记本电脑设计的,因此TiDB Operator的许多方面在这里都无法展示。
TiDB运营商是TiDB正在进行的云原生之旅的重要一步。 但是,TiDB Operator仍是一个年轻的开源项目。 我们鼓励您关注它的发展,并通过您的贡献帮助我们改进它:错误报告,问题,PR等。下面是该项目的路线图 。
将来,我们将继续与Kubernetes社区一起发展,合并新功能,与各种云平台上的托管Kubernetes服务集成,并充分利用TiDB的部署和维护经验。 在Twitter , LinkedIn , Reddit上关注我们,并继续关注有关如何在生产级云环境中部署TiDB的更多教程。
邓丹和格雷格韦伯是PingCAP的云产品工程师。
-
新技术论坛提供了一个以前所未有的深度和广度探索和讨论新兴企业技术的场所。 选择是主观的,是基于我们对InfoWorld读者认为最重要和最感兴趣的技术的选择。 InfoWorld不接受发布的营销担保,并保留编辑所有贡献内容的权利。 将所有查询发送到 newtechforum@infoworld.com 。
From: https://www.infoworld.com/article/3297700/introducing-the-kubernetes-operator-for-tidb.html