天天看點

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

作者:同福程式設計

1. 介紹

1.1 介紹

上一課福哥帶着大家費了九牛二虎之力終于把基于rancher/rancher的k8s環境的給搭建起來了!下一步就是要根據我們的需求設計項目和命名空間了!那麼什麼是項目,什麼又是命名空間呢?

按照k8s的設計理念,命名空間就是把我們的各種服務進行一個分類,例如:資料庫類,web服務類,統計類,監控類等等。然後下面就是把這些分類再次進行一個分組,例如:系統功能,使用者功能,生産功能,灰階功能等等。

按照k8s的設計理念,我們之前部署的各種服務在k8s裡面叫做工作負載,在k8s裡面各種服務是部署在具體的命名空間下面的。

那麼今天福哥就帶着大家學習一下如何使用rancher配置我們的項目和命名空間,以及如何使用rancher部署我們的工作負載!

1.2 環境

鏡像版本 rancher/rancher:v2.5.17-rc4
作業系統 CentOS 7 x86_64 2009
伺服器 TFCentOS7x64、TFCentOS7x64Node1
IP 192.168.168.68、192.168.168.69
端口 9443

2. 安裝

2.1 關閉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           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

無論是設定DOMAIN參數,還是關閉NetworkManager服務,最後都是需要重新啟動TFCentOS7x64Node1伺服器才能使更改生效的。

reboot           

2.2 vm.max_map_count

為了Elasticsearch服務,我們還要在TFCentOS7x64Node1伺服器上加大vm.max_map_count的值。

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3. 使用

3.1 設計項目和命名空間

福哥打算設計一個簡單的叢集結構。

項目就建立兩個,一個Data(資料)、一個App(應用)。

Data項目下面建立兩個命名空間,一個database(資料庫)、一個cache(緩存);App項目下面建立一個命名空間web(Web程式)。

3.2 建立項目

點選“項目/命名空間”菜單進入項目/命名空間管理界面。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

點選“添加項目”按鈕建立項目。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

項目名稱“Data”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

點選“建立”按鈕完成項目的建立。可以看到項目Data建立出來了,現在還是一個空項目。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

再把另一個項目App也建立出來。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.3 建立命名空間

點選項目App右邊的“添加命名空間”按鈕建立命名空間。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

名稱“web”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

點選“建立”按鈕完成命名空間的建立。可以看到在項目App下面有了web命名空間了。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

再把剩下的命名空間也都建立出來。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.4 部署工作負載

現在我們來把前面使用docker-compose部署的服務都在k8s裡面再部署一套!

根據前面設計的命名空間,服務tfphp部署到web裡面,服務tfmysql、tfelasticsearch部署到database裡面,服務tfredis部署到cache裡面。

從頂部菜單裡展開找到“Data”菜單,點選“Data”菜單進入Data項目管理界面。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.5 部署tfmysql服務

預設就是在“工作負載”頁籤下面,點選“部署服務”按鈕開始部署服務。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

名稱“tfmysql”,工作負載類型“StatefulSet”,Docker鏡像“registry.tongfu.net:5000/tfmysql:5.7-1.0.0”,命名空間“database”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定端口映射,容器端口3306,綁定叢集IP,主機端口與容器端口相同。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定環境變量“MYSQL_ROOT_PASSWORD=abcdef”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定資料卷,先在TFCentOS7x64Node1上面建立MySQL的資料目錄。

mkdir -p /tongfu.net/data/docker/data/tfmysql/
chown 999.999 /tongfu.net/data/docker/data/tfmysql/           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

展開“資料卷”,點選“添加卷”選擇“映射主機目錄”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

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

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

點選最下面的“啟動”按鈕啟動tfmysql服務。

這個時候服務還無法啟動起來,因為用到的鏡像還沒有推送到私有鏡像倉庫裡面。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

推送鏡像到私有鏡像倉庫,在TFCentOS7x64上面把需要的鏡像推送到私有鏡像倉庫裡面。

docker push registry.tongfu.net:5000/tfmysql:5.7-1.0.0           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

等了一會兒,啟動起來了!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

點選右邊的“三個點”選擇“執行指令行”進入tfmysql的容器裡面。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

通過mysql終端測試一下,沒有問題!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.6 部署tfelasticsearch服務

現在把tfelasticsearch服務也啟動起來。

名稱“tfelasticsearch”,工作負載類型“StatefulSet”,Docker鏡像“registry.tongfu.net:5000/tfelasticsearch:6-1.0.0”,命名空間“database”。

設定端口映射,容器端口9200,綁定叢集IP,主機端口與容器端口相同。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定資料卷,先在TFCentOS7x64Node1上面建立Elasticsearch的資料目錄。

mkdir -p /tongfu.net/data/docker/data/tfelasticsearch
chown 1000.1000 /tongfu.net/data/docker/data/tfelasticsearch           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

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

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

推送鏡像到私有鏡像倉庫,在TFCentOS7x64上面把需要的鏡像推送到私有鏡像倉庫裡面。

docker push registry.tongfu.net:5000/tfelasticsearch:6-1.0.0           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

啟動服務,成功了!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

進入容器裡面用curl測試一下,沒有問題!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.7 部署tfredis服務

現在把tfredis服務也啟動起來。

名稱“tfredis”,工作負載類型“StatefulSet”,Docker鏡像“registry.tongfu.net:5000/tfredis:6.0-1.0.0”,命名空間“cache”。

設定端口映射,容器端口6379,綁定叢集IP,主機端口與容器端口相同。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定資料卷,先在TFCentOS7x64Node1上面建立Redis的資料目錄。

mkdir -p /tongfu.net/data/docker/data/tfredis
chown 999.999 /tongfu.net/data/docker/data/tfredis           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

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

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

推送鏡像到私有鏡像倉庫,在TFCentOS7x64上面把需要的鏡像推送到私有鏡像倉庫裡面。

docker push registry.tongfu.net:5000/tfredis:6.0-1.0.0           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

啟動服務,成功了!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

進入容器裡面用redis-cli終端測試一下,沒有問題!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.8 部署tfphp服務

因為tfphp需要部署在web下面,是以先切換到App項目下面。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

現在我們來啟動tfphp服務。

名稱“tfphp”,工作負載類型“Deployment”,Docker鏡像“registry.tongfu.net:5000/tfphp:7.4-nginx-1.0.0”,命名空間“web”。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定端口映射,容器端口80,使用NodePort,主機端口随機。

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

設定資料卷,先在TFCentOS7x64Node1上面建立PHP的程式目錄,然後使用scp指令把TFCentOS7x64上的那些PHP程式檔案複制過來。

mkdir -p /tongfu.net/data/docker/data/tfphp/html/
cd /tongfu.net/data/docker/data/tfphp/html/
scp [email protected]:/tongfu.net/data/docker/data/tfphp/html/* .           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

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

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

推送鏡像到私有鏡像倉庫,在TFCentOS7x64上面把需要的鏡像推送到私有鏡像倉庫裡面。

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

啟動服務,成功了!k8s給我們随機了一個31209端口!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.8.1 測試tfmysql聯通

打開浏覽器通路http://192.168.168.69:31209/tfmysql.php,唉?報錯啦!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

後來福哥想起來了,現在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了!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

哦,對了!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());           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

再次通路tfmysql.php看看?好了!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

3.8.2 測試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           
Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

打開浏覽器通路http://192.168.168.69:31209/tfredis.php,一次通過啦!

Rancher(k8s)項目Project/命名空間Namespace和工作負載Workload

4. 總結

今天福哥帶着大家學習了k8s的項目Project/命名空間Namespace的設計技巧,還學會了在k8s裡面部署工作負載Workload。然後我們還把前面學習的tfmysql、tfredis、tfelasticsearch和tfphp都在我們的k8s環境裡面又都部署了一遍,體驗了一把圖形化部署運維環境的感覺!

後面福哥會陸續地把k8s的一些基礎使用技巧一點點地教給大家,敬請期待吧~

https://m.tongfu.net/home/35/blog/514005.html

繼續閱讀