介绍
介绍
上一课福哥带着大家费了九牛二虎之力终于把基于rancher/rancher的k8s环境的给搭建起来了!下一步就是要根据我们的需求设计项目和命名空间了!那么什么是项目,什么又是命名空间呢?
按照k8s的设计理念,命名空间就是把我们的各种服务进行一个分类,例如:数据库类,web服务类,统计类,监控类等等。然后下面就是把这些分类再次进行一个分组,例如:系统功能,用户功能,生产功能,灰度功能等等。
按照k8s的设计理念,我们之前部署的各种服务在k8s里面叫做工作负载,在k8s里面各种服务是部署在具体的命名空间下面的。
那么今天福哥就带着大家学习一下如何使用rancher配置我们的项目和命名空间,以及如何使用rancher部署我们的工作负载!
环境
镜像版本 | rancher/rancher:v2.5.17-rc4 |
操作系统 | CentOS 7 x86_64 2009 |
服务器 | TFCentOS7x64、TFCentOS7x64Node1 |
IP | 192.168.168.68、192.168.168.69 |
端口 | 9443 |
安装
关闭NetworkManager
在CentOS7操作系统里有个NetworkManager服务,它会在系统的/etc/resolv.conf里面添加search选项,而这个search选项会被k8s继承起来,最终会导致k8s上面部署的服务无法正常工作。
解决办法有两个,或者在网卡配置里使用DOMAIN参数设置可用的DNS服务器地址,或者把NetworkManager服务直接关掉,福哥选择的是直接把它关掉。
cat /etc/resolv.conf systemctl stop NetworkManager systemctl disable NetworkManager systemctl restart network cat /etc/resolv.conf
无论是设置DOMAIN参数,还是关闭NetworkManager服务,最后都是需要重新启动TFCentOS7x64Node1服务器才能使更改生效的。
reboot
vm.max_map_count
为了Elasticsearch服务,我们还要在TFCentOS7x64Node1服务器上加大vm.max_map_count的值。
echo "vm.max_map_count=262144" >> /etc/sysctl.conf sysctl -p
使用
设计项目和命名空间
福哥打算设计一个简单的集群结构。
项目就建立两个,一个Data(数据)、一个App(应用)。
Data项目下面建立两个命名空间,一个database(数据库)、一个cache(缓存);App项目下面建立一个命名空间web(Web程序)。
创建项目
点击“项目/命名空间”菜单进入项目/命名空间管理界面。
点击“添加项目”按钮创建项目。
项目名称“Data”。
点击“创建”按钮完成项目的创建。可以看到项目Data创建出来了,现在还是一个空项目。
再把另一个项目App也创建出来。
创建命名空间
点击项目App右边的“添加命名空间”按钮创建命名空间。
名称“web”。
点击“创建”按钮完成命名空间的创建。可以看到在项目App下面有了web命名空间了。
再把剩下的命名空间也都创建出来。
部署工作负载
现在我们来把前面使用docker-compose部署的服务都在k8s里面再部署一套!
根据前面设计的命名空间,服务tfphp部署到web里面,服务tfmysql、tfelasticsearch部署到database里面,服务tfredis部署到cache里面。
从顶部菜单里展开找到“Data”菜单,点击“Data”菜单进入Data项目管理界面。
部署tfmysql服务
默认就是在“工作负载”选项卡下面,点击“部署服务”按钮开始部署服务。
名称“tfmysql”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfmysql:5.7-1.0.0”,命名空间“database”。
设置端口映射,容器端口3306,绑定集群IP,主机端口与容器端口相同。
设置环境变量“MYSQL_ROOT_PASSWORD=abcdef”。
设置数据卷,先在TFCentOS7x64Node1上面创建MySQL的数据目录。
mkdir -p /tongfu.net/data/docker/data/tfmysql/ chown 999.999 /tongfu.net/data/docker/data/tfmysql/
展开“数据卷”,点击“添加卷”选择“映射主机目录”。
卷名“data”,主机路径“/tongfu.net/data/docker/data/tfmysql”,容器路径“/var/lib/mysql”。
点击最下面的“启动”按钮启动tfmysql服务。
这个时候服务还无法启动起来,因为用到的镜像还没有推送到私有镜像仓库里面。
推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。
docker push registry.tongfu.net:5000/tfmysql:5.7-1.0.0
等了一会儿,启动起来了!
点击右边的“三个点”选择“执行命令行”进入tfmysql的容器里面。
通过mysql终端测试一下,没有问题!
部署tfelasticsearch服务
现在把tfelasticsearch服务也启动起来。
名称“tfelasticsearch”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfelasticsearch:6-1.0.0”,命名空间“database”。
设置端口映射,容器端口9200,绑定集群IP,主机端口与容器端口相同。
设置数据卷,先在TFCentOS7x64Node1上面创建Elasticsearch的数据目录。
mkdir -p /tongfu.net/data/docker/data/tfelasticsearch chown 1000.1000 /tongfu.net/data/docker/data/tfelasticsearch
卷名“data”,主机路径“/tongfu.net/data/docker/data/tfelasticsearch”,容器路径“/usr/share/elasticsearch/data”。
推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。
docker push registry.tongfu.net:5000/tfelasticsearch:6-1.0.0
启动服务,成功了!
进入容器里面用curl测试一下,没有问题!
部署tfredis服务
现在把tfredis服务也启动起来。
名称“tfredis”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfredis:6.0-1.0.0”,命名空间“cache”。
设置端口映射,容器端口6379,绑定集群IP,主机端口与容器端口相同。
设置数据卷,先在TFCentOS7x64Node1上面创建Redis的数据目录。
mkdir -p /tongfu.net/data/docker/data/tfredis chown 999.999 /tongfu.net/data/docker/data/tfredis
卷名“data”,主机路径“/tongfu.net/data/docker/data/tfredis”,容器路径“/var/lib/redis”。
推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。
docker push registry.tongfu.net:5000/tfredis:6.0-1.0.0
启动服务,成功了!
进入容器里面用redis-cli终端测试一下,没有问题!
部署tfphp服务
因为tfphp需要部署在web下面,所以先切换到App项目下面。
现在我们来启动tfphp服务。
名称“tfphp”,工作负载类型“Deployment”,Docker镜像“registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0”,命名空间“web”。
设置端口映射,容器端口80,使用NodePort,主机端口随机。
设置数据卷,先在TFCentOS7x64Node1上面创建PHP的程序目录,然后使用scp命令把TFCentOS7x64上的那些PHP程序文件复制过来。
mkdir -p /tongfu.net/data/docker/data/tfphp/html/ cd /tongfu.net/data/docker/data/tfphp/html/ scp root@192.168.168.68:/tongfu.net/data/docker/data/tfphp/html/* .
卷名“data”,主机路径“/tongfu.net/data/docker/data/tfphp/html”,容器路径“/var/www/html”。
推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。
docker push registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0
启动服务,成功了!k8s给我们随机了一个31209端口!
测试tfmysql联通
打开浏览器访问http://192.168.168.69:31209/tfmysql.php,唉?报错啦!
后来福哥想起来了,现在tfphp和tfmysql在不同的命名空间下面,直接访问当然是行不通的了!需要加上tfmysql所在的命名空间database才行!
在TFCentOS7x64Node1的tfphp数据目录下面修改tfmysql.php,将tfmysql改成tfmysql.database。
<?php header("Content-Type: text/html; charset=utf-8"); try{ // 连接数据库 $pdo = new \PDO("mysql:host=tfmysql.database;dbname=tfmysql", "root", "abcdef", [\PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8mb4"]); $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // 获取数据库列表 $rs = $pdo->prepare("show databases"); $rs->execute(); $dbs = $rs->fetchAll(\PDO::FETCH_ASSOC); // 获取数据表列表 $rs = $pdo->prepare("show tables"); $rs->execute(); $tables = $rs->fetchAll(\PDO::FETCH_ASSOC); // 获取数据表数据 $rs = $pdo->prepare("select * from user"); $rs->execute(); $data = $rs->fetchAll(\PDO::FETCH_ASSOC); // 数据库 echo "<table border=\"1\"><tbody>"; echo "<tr><th>Database</th></tr>"; foreach ($dbs as $db){ echo "<tr><td>". $db['Database']. "</td>"; } echo "</tbody></table>"; // 数据表 echo "<table border=\"1\"><tbody>"; echo "<tr><th>Table</th></tr>"; foreach ($tables as $table){ echo "<tr><td>". $table['Tables_in_tfmysql']. "</td>"; } echo "</tbody></table>"; // 数据 echo "<table border=\"1\"><tbody>"; echo "<tr>"; foreach ($data[0] as $field => $value){ echo "<th>". $field. "</th>"; } echo "</tr>"; foreach ($data as $row){ echo "<tr>"; foreach ($row as $field => $value){ echo "<td>". $value. "</td>"; } echo "</tr>"; } echo "</tbody></table>"; } catch (\PDOException $e){ echo $e->getMessage(); }
再次访问tfmysql.php试试!唉?这回提示找不到数据库tfmysql了!
哦,对了!k8s环境里面的MySQL还没有数据呢!只能手动往里面放一些数据了!
create database tfmysql default charset utf8mb4; use tfmysql; CREATE TABLE user ( userId INT NOT NULL AUTO_INCREMENT, userName VARCHAR(45) NOT NULL, userPwd CHAR(32) NOT NULL, createDT DATETIME, updateDT DATETIME, lastLoginDT DATETIME, PRIMARY KEY (userId), KEY u_userName (userName) ); INSERT INTO user (userName, userPwd, createDT) VALUES ('k8s.tongfu.net', md5('abcdef'), now()); INSERT INTO user (userName, userPwd, createDT) VALUES ('tfmysql.k8s.tongfu.net', md5('abcdef'), now());
再次访问tfmysql.php看看?好了!
测试tfredis联通
现在我们来调试联通Redis数据库!这次有经验了,先改配置,再添数据!
在TFCentOS7x64Node1的tfphp数据目录下面修改tfredis.php,将tfredis改成tfredis.cache。
<?php $redis = new \Redis(); $redis->connect("tfredis.cache", 6379); $redis->auth("tongfu.net"); echo "<b>String</b><br>"; print_r($redis->get("userNick")); echo "<br><br><b>Hash</b><br>"; print_r($redis->hgetall("user")); echo "<br><br><b>Set inter</b><br>"; print_r($redis->sinter("userTags", "userTags2")); echo "<br><br><b>Set diff</b><br>"; print_r($redis->sdiff("userTags", "userTags2")); echo "<br><br><b>Set union</b><br>"; print_r($redis->sunion("userTags", "userTags2")); echo "<br><br><b>ZSet</b><br>"; print_r($redis->zrevrange("hotSubDomains", 0, -1));
现在往k8s环境的Redis里放一些数据吧!
set userNick "福哥k8s" hmset user nick "福哥k8s" gender male age 35 hset user descript "现在我们开始玩k8s了!" sadd userTags "福哥k8s" tongfu tongfu.net "项目" "命名空间" sadd userTags2 tongfu k8s.tongfu.net zadd hotSubDomains 1 tongfu.net 1 k8s.tongfu.net 1 project.k8s.tongfu.net 1 namespace.k8s.tongfu.net 1 rancher.tongfu.net zincrby hotSubDomains 1 tongfu.net save
打开浏览器访问http://192.168.168.69:31209/tfredis.php,一次通过啦!
总结
今天福哥带着大家学习了k8s的项目Project/命名空间Namespace的设计技巧,还学会了在k8s里面部署工作负载Workload。然后我们还把前面学习的tfmysql、tfredis、tfelasticsearch和tfphp都在我们的k8s环境里面又都部署了一遍,体验了一把图形化部署运维环境的感觉!
后面福哥会陆续地把k8s的一些基础使用技巧一点点地教给大家,敬请期待吧~