Nutanix超”容”合之ACS Docker Volume Plugin的使用和数据持久化测试

在《Nutanix超”容”合之ACS(下)实战篇01》中,我们完成了环境的准备并且使用ACS在Nutanix AHV虚拟化环境中快速生成了两台Docker宿主机。实战篇02主要是使用和验证ACS的容器数据持久化功能。

激活Nutanix Volume Plugin

Nutanix Volume Plugin在ACS作为Docker宿主机的容器和ABS iSCSI存储的桥梁。简单点说就是它将容器的数据直接放到了存储上并允许多个虚拟机中的容器访问,这样就解决了把容器数据放在本地且无法持久化的问题。

docanix01和docanix02两台宿主机我们已经创建完毕,下面我们来试试如何将不同主机间容器的数据进行持久化。

本文中两台宿主机均在客户端(CentOS)上使用docker-machine ssh进行远程连接。

[root@dm ~]# docker-machine ssh docanix01  
[root@dm ~]# docker-machine ssh docanix02

但不仅限于此种方式,直接用putty或者xshell这样的工具连接也是一样。

拉取最新的Nutanix Volume Plugin镜像

Nutanix Volume Plugin是作为一个容器运行在docker host上面的

[root@docanix01 ~]# docker pull orionapps/vol-plugin
Using default tag: latest
latest: Pulling from orionapps/vol-plugin
a3ed95caeb02: Pull complete 
252d14f3318a: Pull complete 
5f1ff6e864de: Pull complete 
Digest: sha256:0cacc3ca875770975afbf26cef9386b34d031665a36331bf1aeb60a06e5a9901
Status: Downloaded newer image for orionapps/vol-plugin:latest

[root@docanix01 ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
orionapps/vol-plugin   latest              515e5d45cf17        6 weeks ago         196.8 MB

(两台宿主机均需执行)

启动Plugin容器

运行/root目录下的start-volume-plugin.sh脚本

[root@docanix01 ~]# ./start-volume-plugin.sh 
Starting Nutanix volume plugin container...
Updating volume plugin...
Using default tag: latest
latest: Pulling from orionapps/vol-plugin
a3ed95caeb02: Already exists 
a3ed95caeb02: Already exists 
252d14f3318a: Already exists 
Digest: sha256:0cacc3ca875770975afbf26cef9386b34d031665a36331bf1aeb60a06e5a9901
Status: Image is up to date for orionapps/vol-plugin:latest
Redirecting to /bin/systemctl restart  docker.service
Enter prism ip address: 192.168.2.21
Enter Dataservices ip address: 192.168.2.23
Enter prism username: admin
Enter prism password: 
Enter nutanix container where you want persistent volumes: docker_vol01
prism ip address      : 192.168.2.21
dataservice ip address: 192.168.2.23
prism username        : admin
default container     : docker_vol01
99191ccaf656ea19ad09f0684cac107c695974fed82ce046deb1774b10a7967e
  • prism ip address:Prism的IP地址
  • Dataservices ip address:ABS数据服务的IP地址,上章中已配置
  • prism username:Prism的用户名
  • prism password:Prism用户的密码
    (两台宿主机均需执行)

监控Plugin容器

[root@docanix01 ~]# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
99191ccaf656        orionapps/vol-plugin   "/code/scripts/docker"   7 seconds ago       Up 6 seconds                            NutanixVolumePlugin  

[root@docanix01 ~]# docker logs -f NutanixVolumePlugin  
.
.
.
\+ exec /code/main.py --prism-ip 192.168.2.21 --dataservices-ip 192.168.2.23 --prism-username admin --prism-password Admin4NCE --default-container docker_vol01

我们可以通过docker ps看到容器已经是启动的,但plugin的激活还需要几分钟。当我们看到上面最后的日志内容且没有任何报错的时候即可判定Nutanix Volume Plugin启动成功。
注:该plugin激活过程涉及到一些软件包(如iscsi-initiator)的yum安装,所以再次强调虚拟机必须要能够访问互联网。

至此两台宿主机上的Nutanix Volume Plugin功能已成功激活,下面我们实践一下数据的持久化是怎么做的。

数据持久化测试

本文中测试方法基于Nutanix Volume Driver:

  • 在docanix01宿主机上运行一个MySQL数据库容器,并在创建名为docanix_db的数据库后干掉(停止并删除)该容器。
  • 在docanix02宿主机上运行一个MySQL数据库容器,并挂载先前docanix01的volume验证数据是否可用。

运行一个MySQL测试容器

在doncanix01上执行

[root@docanix01 ~]# docker run -d --name mysqldb --volume-driver nutanix -v data01:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zaq12wsx mysql:latest
1dbd3ce7282b6a73b9263592ae3fd55d2db5f7e79def7e354ef20caaa2ddea5f
  • –volume-driver指定为nutanix,启动的容器会调用plugin
  • -v后面的VOLUME:/PATH比较有讲究:
    • 当VOLUME不存在的时候,plugin会调用prism去创建一个volume并挂载到容器上
    • 当VOLUME已存在的时候,plugin会直接挂载到容器上
    • VOLUME的名字需要用小写,这个是ACS目前的一个bug

到了这里我们去Prism里面看看,这个volume到底是啥?
Home–>Storage–>Table–>Volume Group

可以看到一个名为data01volume已被自动创建,它就是我们在启动容器的时候指定的volume

选中data01并点击update

Share across multiple iSCSI initiators or multiple VMs勾选
因为docanix01和docanix02都需要访问该volume。

检查容器是否成功运行

[root@docanix01 ~]# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
1dbd3ce7282b        mysql:latest           "docker-entrypoint.sh"   24 seconds ago      Up 8 seconds        3306/tcp            mysqldb
345a6ee80d16        orionapps/vol-plugin   "/code/scripts/docker"   9 minutes ago       Up 9 minutes                            NutanixVolumePlugin

可以看到名为MySQL的容器已正常运行

变更MySQL数据库的数据

以创建一个名为docanix_db的数据库为例

[root@docanix01 ~]# docker-enter mysqldb  

root@1dbd3ce7282b:~# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database docanix_db;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| docanix_db         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> exit
Bye
root@1dbd3ce7282b:~# exit
logout

docker-enter是一个很好用的登录容器的工具,秒杀docker attach
安装方式:

wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc

停止并销毁MySQL容器

[root@docanix01 ~]# docker stop mysqldb
mysqldb
[root@docanix01 ~]# docker rm mysqldb
mysqldb

[root@docanix01 ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
345a6ee80d16        orionapps/vol-plugin   "/code/scripts/docker"   3 days ago          Up 3 days                               NutanixVolumePlugin

[root@docanix01 ~]# exit
logout

可以看到docanix01主机中已经没有MySQL容器在运行

运行新的MySQL容器

在doncanix02主机上操作

[root@dm ~]# docker-machine ssh docanix02
Last login: Thu Aug 18 02:09:38 2016 from 192.168.2.151  
  
[root@docanix02 ~]# docker run -d --name mysqldb --volume-driver nutanix -v data01:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zaq12wsx mysql:latest
4b030e43adf60607cdc4170386cabf33e5fa8903956e2c14d69b3f3e2402433b  
  
[root@docanix02 ~]# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
4b030e43adf6        mysql:latest           "docker-entrypoint.sh"   14 seconds ago      Up 3 seconds        3306/tcp            mysqldb
33f8ea27c746        orionapps/vol-plugin   "/code/scripts/docker"   7 minutes ago       Up 7 minutes                            NutanixVolumePlugin
  • -v 参数中的volume指定为data01,新容器直接挂载之前被销毁的容器的volume。

数据检查和操作

[root@docanix02 ~]# docker-enter mysqldb
root@4b030e43adf6:~# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| docanix_db         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

可以看到我们先前在doncaix01上创建的docanix_db数据库在docanix02上也可以看到。

会不会是看不中用?我们创建一个Table测试一下

mysql> create table users (UID int primary key,name varchar(20));
Query OK, 0 rows affected (0.05 sec)

mysql> show tables;
+----------------------+
| Tables_in_docanix_db |
+----------------------+
| users                |
+----------------------+
1 row in set (0.00 sec)

可以看到名为users的表已被成功创建到docanix_db数据库中。

到这里我们就可以确定了,之前在docanix01上的MySQL容器虽然被销毁了,但是容器中MySQL数据库的数据经过Nutanix Volume Plugin做了持久化之后,我们在docanix02上运行一个新的容器依然可以使用。

这说明了什么?排除高可用的场景,试想一下如果在一台虚拟机上面跑的一个MySQL数据库,然后这台虚拟机被误删除了,我们需要重新生成另外一台虚拟机并重新部署MySQL的环境并恢复数据,这个过程得要多长时间?

而在这个实验场景当中,我们只用

  • 重新provision一台Docker Host(大约10分钟的样子)
  • 运行Nutanix Volume Plugin(大概5分钟的样子)
  • 运行docker run在5秒内重新启动一个MySQL实例
    整个被误删的数据库环境在20分钟之内绝对可以起来…而且在不需要重新生成Docker宿主机的情况下,5秒钟就可以恢复一个MySQL环境!

这仅仅只是Docker容器化和Nutanix超融合结合之后最基本的实践,Docanix(Docker+Nutanix)还有无穷尽的功能需要我们去挖掘和尝试…

好了,实战篇就到这里了,希望大家关注多多关注微信订阅号’小张烤茄’一起学习交流。


讲真,由于NCE的环境比较吃资源,我4vcpu和32GB的内存的Homelab有一半资源都分给了Nutanix的Control VM,先前觉得特别奢侈和浪费,所以有尝试用KVM虚拟化+Btier分层存储的方案来替换到NCE,目的为节省更多的硬件资源。

但是在最终,我还是选择了NCE。尽管NCE也可以被认为是一个开源版,但是相对于CentOS的KVM和Btier这种开源软件来说,实在是强大和稳定得太多…

能理解花了快一个月搭建起来的环境因为Btier分层存储的问题导致所有KVM虚拟机都起不来的痛楚吗?…

不是为Nutanix打广告,真心是前车之鉴。如果有环境和兴趣的朋友完全可以用NCE来作为虚拟化平台,因为NCE自身的AHV虚拟化就是基于KVM来做的,命令行操控过度很平滑,Prism的一键式Web UI也方便易用。而且CVM的资源分配并非是定值,不会一口气全吃掉,用多少是多少,剩余的还是会跟整个环境的虚机共享的。

K8S中文社区微信公众号
分享到:更多 ()