同福

Rancher(k8s)的项目Project/命名空间Namespace的设计和工作负载Workload的部署

介绍

介绍

上一课福哥带着大家费了九牛二虎之力终于把基于rancher/rancher的k8s环境的给搭建起来了!下一步就是要根据我们的需求设计项目和命名空间了!那么什么是项目,什么又是命名空间呢?

按照k8s的设计理念,命名空间就是把我们的各种服务进行一个分类,例如:数据库类,web服务类,统计类,监控类等等。然后下面就是把这些分类再次进行一个分组,例如:系统功能,用户功能,生产功能,灰度功能等等。

按照k8s的设计理念,我们之前部署的各种服务在k8s里面叫做工作负载,在k8s里面各种服务是部署在具体的命名空间下面的。

那么今天福哥就带着大家学习一下如何使用rancher配置我们的项目和命名空间,以及如何使用rancher部署我们的工作负载!

环境

镜像版本
rancher/rancher:v2.5.17-rc4
操作系统CentOS 7 x86_64 2009
服务器TFCentOS7x64、TFCentOS7x64Node1
IP192.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

home/topic/2023/0902/22/f14722933abd156c39dbf7ac94f9cc1f.png

无论是设置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

home/topic/2023/0902/22/62d21dc335f84a878bf5a9f70efa7f3d.png

使用

设计项目和命名空间

福哥打算设计一个简单的集群结构。

项目就建立两个,一个Data(数据)、一个App(应用)。

Data项目下面建立两个命名空间,一个database(数据库)、一个cache(缓存);App项目下面建立一个命名空间web(Web程序)。

创建项目

点击“项目/命名空间”菜单进入项目/命名空间管理界面。

home/topic/2023/0902/22/b61599ff116a4e6111874fa9af6a6159.png点击“添加项目”按钮创建项目。

home/topic/2023/0902/22/3814bcd0165f4bef136203eff5c1dca3.png项目名称“Data”。

home/topic/2023/0902/22/145fe505e0e480e94319506e09cac4ae.png

点击“创建”按钮完成项目的创建。可以看到项目Data创建出来了,现在还是一个空项目。

home/topic/2023/0902/22/3d532f78221b1f4faad5fe864ef42a30.png再把另一个项目App也创建出来。

home/topic/2023/0902/22/122b276f9b30ac4982922d539587a927.png

创建命名空间

点击项目App右边的“添加命名空间”按钮创建命名空间。

home/topic/2023/0902/22/0ffb09f25ea0bad5e493f89bf12dab88.png

名称“web”。

home/topic/2023/0902/22/8190e08ff4f8c408287bd98612b22a06.png

点击“创建”按钮完成命名空间的创建。可以看到在项目App下面有了web命名空间了。

home/topic/2023/0902/22/6602f96acf4ea49f95c12ffaebd87a2f.png

再把剩下的命名空间也都创建出来。

home/topic/2023/0902/22/f95267c90e8e789642fe4319f9ec4914.png

部署工作负载

现在我们来把前面使用docker-compose部署的服务都在k8s里面再部署一套!

根据前面设计的命名空间,服务tfphp部署到web里面,服务tfmysql、tfelasticsearch部署到database里面,服务tfredis部署到cache里面。

从顶部菜单里展开找到“Data”菜单,点击“Data”菜单进入Data项目管理界面。

home/topic/2023/0902/22/9e8ac0a9de4ea1dc2414aad647866123.png

部署tfmysql服务

默认就是在“工作负载”选项卡下面,点击“部署服务”按钮开始部署服务。

home/topic/2023/0902/22/3a5e8d67ddfc24c7ef59b7832c0e1668.png名称“tfmysql”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfmysql:5.7-1.0.0”,命名空间“database”。
home/topic/2023/0902/22/7f37ac7bcdc3d1e5955cee1868b96067.png

设置端口映射,容器端口3306,绑定集群IP,主机端口与容器端口相同。

home/topic/2023/0902/22/8b915eeb5a63c4ea9fd80eea4bcfe285.png设置环境变量“MYSQL_ROOT_PASSWORD=abcdef”。

home/topic/2023/0902/22/8a6157b924fdbb0cb5e82d9ca4c53da7.png

设置数据卷,先在TFCentOS7x64Node1上面创建MySQL的数据目录。

mkdir -p /tongfu.net/data/docker/data/tfmysql/
chown 999.999 /tongfu.net/data/docker/data/tfmysql/

home/topic/2023/0902/22/78e371a094b18d897a401d7221dec2b2.png

展开“数据卷”,点击“添加卷”选择“映射主机目录”。

home/topic/2023/0902/22/ca0ec064d7dbee88bc48bd856f91fbdb.png

卷名“data”,主机路径“/tongfu.net/data/docker/data/tfmysql”,容器路径“/var/lib/mysql”。

home/topic/2023/0902/22/571f21baebef856137906396a11d47bc.png

点击最下面的“启动”按钮启动tfmysql服务。

这个时候服务还无法启动起来,因为用到的镜像还没有推送到私有镜像仓库里面。

home/topic/2023/0902/22/d7bcf2886b12c694dd0018f204fc85f2.png

推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。

docker push registry.tongfu.net:5000/tfmysql:5.7-1.0.0

home/topic/2023/0902/22/590f54e9b55d61531078a8c84cf4ff8a.png

等了一会儿,启动起来了!

home/topic/2023/0902/22/facec909593578b764977c86ac82c8e1.png

点击右边的“三个点”选择“执行命令行”进入tfmysql的容器里面。

home/topic/2023/0902/22/7df2874b98cc111a90b6745d3bd45bb5.png

通过mysql终端测试一下,没有问题!

home/topic/2023/0902/22/a3bb7a9551e182c7020177945443836f.png

部署tfelasticsearch服务

现在把tfelasticsearch服务也启动起来。

名称“tfelasticsearch”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfelasticsearch:6-1.0.0”,命名空间“database”。

设置端口映射,容器端口9200,绑定集群IP,主机端口与容器端口相同。

home/topic/2023/0902/22/c15c006b6f5393e4dd7bbd34d4604bb6.png

设置数据卷,先在TFCentOS7x64Node1上面创建Elasticsearch的数据目录。

mkdir -p /tongfu.net/data/docker/data/tfelasticsearch
chown 1000.1000 /tongfu.net/data/docker/data/tfelasticsearch

home/topic/2023/0902/22/fad60117ff777d49a397afc09bc5a9a8.png

卷名“data”,主机路径“/tongfu.net/data/docker/data/tfelasticsearch”,容器路径“/usr/share/elasticsearch/data”。

home/topic/2023/0902/22/834eeaee99912ccf3d27af27553e3635.png

推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。

docker push registry.tongfu.net:5000/tfelasticsearch:6-1.0.0

home/topic/2023/0902/22/2683eccfc655027131ac6fad8b5fdb34.png

启动服务,成功了!

home/topic/2023/0902/22/40bcd0a3b2021ff82716a40a50054dbe.png

进入容器里面用curl测试一下,没有问题!

home/topic/2023/0902/22/d52c337ffde5d354a40eb1ce7b6c41b0.png

部署tfredis服务

现在把tfredis服务也启动起来。

名称“tfredis”,工作负载类型“StatefulSet”,Docker镜像“registry.tongfu.net:5000/tfredis:6.0-1.0.0”,命名空间“cache”。

设置端口映射,容器端口6379,绑定集群IP,主机端口与容器端口相同。

home/topic/2023/0902/23/ef374f1bfe65648cd718e541f1250a8c.png

设置数据卷,先在TFCentOS7x64Node1上面创建Redis的数据目录。

mkdir -p /tongfu.net/data/docker/data/tfredis
chown 999.999 /tongfu.net/data/docker/data/tfredis

home/topic/2023/0902/23/bf1e49e3649a779d7255d1ed6c57365b.png

卷名“data”,主机路径“/tongfu.net/data/docker/data/tfredis”,容器路径“/var/lib/redis”。

home/topic/2023/0902/23/7528c802138e065a71b05d98929207c7.png

推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。

docker push registry.tongfu.net:5000/tfredis:6.0-1.0.0

home/topic/2023/0902/23/aa896f9e74a0b7efa1b63439b6e98b85.png

启动服务,成功了!

home/topic/2023/0902/23/a1c0ec0759c1e61040baa9e4e7f4b126.png

进入容器里面用redis-cli终端测试一下,没有问题!

home/topic/2023/0902/23/02257b3c0c7c654b81bc89d8809d5733.png

部署tfphp服务

因为tfphp需要部署在web下面,所以先切换到App项目下面。

home/topic/2023/0902/23/dbc64907f349668c81c2e0b189f879a5.png现在我们来启动tfphp服务。

名称“tfphp”,工作负载类型“Deployment”,Docker镜像“registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0”,命名空间“web”。

home/topic/2023/0902/23/200ff4dbb639473bc91b85993c87d578.png

设置端口映射,容器端口80,使用NodePort,主机端口随机。

home/topic/2023/0902/23/6d6d83684096d32e5d724f2ac7fe35dc.png

设置数据卷,先在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/* .

home/topic/2023/0902/23/9bf16343bce77dd4357046e6d85e1861.png

卷名“data”,主机路径“/tongfu.net/data/docker/data/tfphp/html”,容器路径“/var/www/html”。

home/topic/2023/0902/23/7004e31daffcf9e2386b4938fde03d7e.png

推送镜像到私有镜像仓库,在TFCentOS7x64上面把需要的镜像推送到私有镜像仓库里面。

docker push registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0

启动服务,成功了!k8s给我们随机了一个31209端口!

home/topic/2023/0902/23/215251a73a7a6df7551cc89b20aa24ce.png

测试tfmysql联通

打开浏览器访问http://192.168.168.69:31209/tfmysql.php,唉?报错啦!

home/topic/2023/0902/23/3a8f245538045552a94951661df472f3.png

后来福哥想起来了,现在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了!

home/topic/2023/0902/23/b6f371cec2d3e6a64276f62100461ecf.png

哦,对了!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());

home/topic/2023/0902/23/6bd98833fea2c793bc2962958b46be08.png

再次访问tfmysql.php看看?好了!

home/topic/2023/0902/23/1c85149230ef1384152b71cd9219aa0e.png

测试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

home/topic/2023/0902/23/79006cf441c00fcbdb8397b2ddb3dc71.png

打开浏览器访问http://192.168.168.69:31209/tfredis.php,一次通过啦!

home/topic/2023/0902/23/434869553b9ed47d9dc6f41756e9baf9.png

总结

今天福哥带着大家学习了k8s的项目Project/命名空间Namespace的设计技巧,还学会了在k8s里面部署工作负载Workload。然后我们还把前面学习的tfmysql、tfredis、tfelasticsearch和tfphp都在我们的k8s环境里面又都部署了一遍,体验了一把图形化部署运维环境的感觉!

后面福哥会陆续地把k8s的一些基础使用技巧一点点地教给大家,敬请期待吧~