同福

Rancher(k8s)的配置映射Config的使用方法

介绍

介绍

在上一节课里面福哥带着大家学会了使用k8s的持久存储卷Volumes(PV/PVC)的使用方法,今天我们要讲讲k8s的配置映射Config的使用方法!

福哥的tfphp服务里面使用PHP程序去操作MySQL数据库,这个MySQL数据库的服务器地址、用户名、密码都是直接写到PHP程序里面的,这样做是不规范的。规范的做法是将这些信息都写到一个配置文件里面,然后PHP程序再从配置文件里面去获取MySQL数据库的信息。

配置文件可以是任何格式的文件,早期的程序通常使用ini格式的文件、xml格式的文件,现在主流的程序更加喜欢用yaml格式的文件,PHP程序也可以直接使用PHP代码定义一个数组用来做配置文件。

环境

镜像版本
rancher/rancher:v2.5.17-rc4
操作系统CentOS 7 x86_64 2009
服务器TFCentOS7x64、TFCentOS7x64Node1
IP192.168.168.68、192.168.168.69
端口9443

使用

设计配置

tfphp服务会用到MySQL数据库和Redis数据库,后面还会用到Elasticsearch搜索引擎,所以我们要设计一个配置文件,把MySQL、Redis和Elasticsearch的相关参数都写到里面去才行。

因为tfphp是基于PHP语言的,所以福哥会使用PHP代码建立tfphp服务的配置文件。

config.php

福哥定义了一个数组,在数组里面设置了mysql、redis和elasticsearch的配置信息。

这个config.php配置文件大家先不用管它,后面福哥会以两种不同的方式部署它!

<?php

$CONFIG = [];

$CONFIG['mysql']['host'] = "tfmysql.database";
$CONFIG['mysql']['port'] = 3306;
$CONFIG['mysql']['username'] = "root";
$CONFIG['mysql']['password'] = "abcdef";
$CONFIG['mysql']['db'] = "tfmysql";
$CONFIG['mysql']['charset'] = "utf8mb4";

$CONFIG['redis']['host'] = "tfredis.cache";
$CONFIG['redis']['port'] = 6379;
$CONFIG['redis']['password'] = "tongfu.net";

$CONFIG['elasticsearch']['host'] = "tfelasticsearch.database";
$CONFIG['elasticsearch']['port'] = 9200;
$CONFIG['elasticsearch']['index'] = "tfes";

tfmysql.php

在TFCentOS7x64Node1的tfmysql.php最前面引入配置文件config.php,并且改造初始化PDO对象的代码,将直接写到代码里的MySQL参数改成变量。

<?php

header("Content-Type: text/html; charset=utf-8");

require("../config/config.php");

try{
    // 连接数据库
    $pdo = new \PDO("mysql:host=". $CONFIG['mysql']['host']. ";port=". $CONFIG['mysql']['port']. ";dbname=". $CONFIG['mysql']['db']. ";charset=". $CONFIG['mysql']['charset'], $CONFIG['mysql']['username'], $CONFIG['mysql']['password']);
    $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();
}

tfredis.php

在TFCentOS7x64Node1的tfredis.php最前面引入配置文件config.php,并且改造初始化Redis对象的代码,将直接写到代码里的Redis参数改成变量。

<?php

header("Content-Type: text/html; charset=utf-8");

require("../config/config.php");

$redis = new \Redis();
$redis->connect($CONFIG['redis']['host'], $CONFIG['redis']['port']);
$redis->auth($CONFIG['redis']['password']);

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));

映射主机目录方式

创建config.php

在TFCentOS7x64Node1服务器上建立/tongfu.net/data/docker/data/tfphp/config/目录,在下面建立config.php文件作为配置文件。

mkdir /tongfu.net/data/docker/data/tfphp/config/
vi /tongfu.net/data/docker/data/tfphp/config/config.php

home/topic/2023/0911/21/c295a95271ad09253c1f8695f9fa5220.png

然后把前面设计的config.php的代码粘贴进去,保存起来!

挂载config.php

现在我们需要把TFCentOS7x64Node1上面新建立的config目录挂载到tfphp服务上面,这样tfphp服务里的PHP程序才能找得到我们刚刚建立的config.php配置文件。

在tfphp服务里添加一个映射主机目录卷,名称“config”,工作路径“/tongfu.net/data/docker/data/tfphp/config”,容器路径“/var/www/config”。

home/topic/2023/0911/21/db117c8759aaf24d6df3794bc6cd5e89.png

测试

完成tfphp服务的升级之后,就可以用浏览器测试MySQL和Redis的联通情况了!

home/topic/2023/0911/21/8a12e75d7ea746f57bd94d228282ea10.png

MySQL没有问题!

home/topic/2023/0911/21/aadc993fdc2c5d30717b81aadc81e8f6.png

Redis也是OK的!

配置映射Config方式

创建Config

虽然映射主机目录的方式也可以实现项目配置文件,不过这里面存在一个问题。config.php配置文件我们是放到了TFCentOS7x64Node1服务器上面的,如果tfphp服务部署在其他服务器节点(比如:TFCentOS7x64Node2)的话,这个config.php配置文件就找不到了,而且到处复制这个config.php方案也不便于维护。为了解决这个问题,就要使用我们今天要讲到的技巧配置映射Config功能了~

点击“资源菜单”里面的“配置映射”子菜单进入配置映射管理界面。

home/topic/2023/0911/21/b75b5fe378c8cd1a75c558d2222cae25.png

点击“添加配置映射”按钮创建配置映射。

home/topic/2023/0911/21/7ceb5d86a3e1bee266a27904ed2ccd97.png

名称“tfphp-config”,键“config.php”,把前面设计的config.php的代码粘贴到值输入框里面去。
home/topic/2023/0911/21/45755be422230e81311ee1d0e9de5228.png

划到最下面点击“保存”按钮完成配置的创建。

home/topic/2023/0911/21/83730d6ce36ec3f9267ce280b862e202.png

挂载Config

先要把tfphp服务的数据卷里的config卷配置删除掉。

home/topic/2023/0911/21/6af1d8e9f8b56e48eb351d911093a79c.png

然后再添加一个“配置映射卷”。

home/topic/2023/0911/21/231aeec19b72b06aca1e30d88300453c.png

卷名“config”,默认模式“444”,可选“否”,配置映射名选择刚刚添加的“tfphp-config”,项目“所有键”,容器路径“/var/www/config”。

home/topic/2023/0911/21/73c0a968c9b57e11c71389e57c52e43d.png

测试

完成升级之后,我们再来测试一下MySQL和Redis的联通情况!

home/topic/2023/0911/21/562d8df2fd11f19f099d34e76eee7277.png

MySQL没问题!

home/topic/2023/0911/21/29e89fa7f85224bac041053a9c8d5725.png

Redis也没问题!

进入tfphp容器里面,看看配置文件路径。

ls -lha /var/www/config/

home/topic/2023/0911/21/46c1de0647ac24478efdcf66a78bf2ff.png

可以看到配置文件config.php的路径是配置映射动态建立的。

> /var/www/config/config.php

home/topic/2023/0911/21/2ec119fe9aca39fe1eb2fad40413c5a1.png

出于安全考虑配置映射建立的配置文件config.php是只读的。

总结

今天福哥带着大家学习了Rancher(k8s)的配置映射Config的使用方法,通过项目配置可以实现将项目程序和项目配置分开来管理,而k8s的配置映射可以把配置信息在部署的时候进行覆盖。不仅可以实现对项目配置进行集中管理,还对项目配置参数有一定的保密作用。

使用k8s的配置映射管理项目的配置信息,更加方便,更加安全!!!