kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问
首先,配置 Docker 鏡像加速服務
登錄阿里云賬號,進入控制臺 -> 容器鏡像服務
(不需要有阿里云的服務器,只要注冊賬號即可)
在兩臺 node 節(jié)點上配置好阿里云的鏡像加速。
重啟一下 docker
sudo systemctl restart docker
重啟一下 k8s
systemctl start kubelet
部署Tomcat集群
關(guān)于 k8s 的安裝,看我上一篇博客:
https://blog.csdn.net/sinat_42483341/article/details/107283742
默認已經(jīng)安裝好三臺 k8s 的集群,主機規(guī)劃:
| 角色 | master | node | node |
| IP 地址 | 10.0.0.131 | 10.0.0.132 | 10.0.0.133 |
方法1:使用可視化界面部署 tomcat 集群
dashboard -> 工作負載 -> 創(chuàng)建 -> 創(chuàng)建應用
稍等幾分鐘之后,可以看到容器自動幫我們下載好了tomcat鏡像,并且已經(jīng)運行起來了。
怎么訪問各個節(jié)點 tomcat 的內(nèi)部端口?
- 用 node02 的 ip:32656 訪問 node02 上的 tomcat
- 用 node03 的 ip:32656 訪問 node03 上的 tomcat
注意這里的端口號是 k8s 隨機生成的,你要去副本集里面,查看你自己的端口號。
方法2:使用 Deployment 腳本創(chuàng)建并部署 Tomcat 集群
Deployment 腳本范本
與部署相關(guān)的常用命令
創(chuàng)建yaml文件
cd /usr/local/ mkdir k8s cd k8s mkdir tomcat-deploy cd tomcat-deploy vim tomcat-deploy.yml# 配置文件如下 apiVersion: extensions/v1beta1 kind: Deployment metadata:name: tomcat-deploy spec: replicas: 2template:metadata:labels:app: tomcat-clusterspec:containers:- name: tomcat-clusterimage: tomcat:8ports:- containerPort: 8080# 根據(jù)配置文件創(chuàng)建 kubectl create -f ./tomcat-deploy.yml查看部署后的信息
名稱為 tomcat-deploy 的實例就是剛剛部署的 tomcat
my-tomcat 是之前用圖形化方式創(chuàng)建的,不用管它
可以用 kubectl describe tomcat-deploy-698fd7bd4f-98gc8查看更詳細的描述信息
外部訪問 Tomcat 集群(NodePort方式)
Service 服務用于對外暴露應用
增加 tomcat-service,它也是一個 pod,是訪問內(nèi)部容器的統(tǒng)一入口
查看 service 的更詳細配置信息
然后,就可以利用宿主機上向外暴露的 32500 端口(10.0.0.132:32500,10.0.0.133:32500),從瀏覽器訪問 tomcat 應用了~
關(guān)于(2020.01.05)后的所有版本,tomcat 首頁 404 的原因:
個人猜測:因為docker推薦將webapps下的文件掛載在宿主機下,否則刪除tomcat容器的時候服務文件會全部丟失,為了讓大家主動將webapps掛載出來,可能維護者將以后的tomcat鏡像全部改成webapps為空,需要使用者手動將webapps.dist目錄復制出來并掛載使用
參考:https://www.cnblogs.com/jying/p/12176107.html
基于 NFS 協(xié)議的文件集群共享:解決集群中節(jié)點的docker容器內(nèi)部的文件同步問題
什么是 NFS?
- NTFS解決了發(fā)布項目時,不同節(jié)點的文件需要同步問題。
安裝 NTFS
# 在master上安裝 yum install -y nfs-utils rpcbind# 在兩個node上安裝 yum install -y nfs-utils集群文件共享
可以將node3看成文件共享服務器,保存了這個集群中所有要共享的文件數(shù)據(jù),通過目錄掛載,進行遠程的文件目錄映射。
- 只要一個發(fā)生改變,全局所有的文件都會發(fā)生改變。
- 一次性解決所有容器之間的文件共享問題。
我們將 master 作為文件共享服務器。
在master上進行以下設置:
mkdir -pv /usr/local/data/www-data && cd /usr/local/data/www-data && vim /etc/exports# 配置如下,設置了共享文件夾 /usr/local/data/www-data 10.0.0.131/24(rw,sync) # rw表示可讀可寫,sync表示同步寫入# 啟動nfs服務、設置開機啟動 systemctl start nfs.service systemctl enable nfs.service# 啟動rpc綁定服務、設置開機啟動 systemctl start rpcbind.service systemctl enable rpcbind.service檢測是否配置成功
exportfs在兩臺node上進行以下設置:
1、查看master上的共享文件夾
showmount -e 10.0.0.131
2、掛載
設置完之后,要重新進入 mnt 目錄才能看到效果
# 將 master 上的/usr/local/data/www-data,掛載到本機的/mnt下 mount 10.0.0.131:/usr/local/data/www-data /mnt3、測試掛載效果
(注意,在兩個node上是沒有權(quán)限對文件進行修改的)
把原有的部署刪除,我們要創(chuàng)建新的部署
1、刪除原有的部署
kubectl get deployment kubectl delete deployment tomcat-deploy刪除之后:
2、刪除原有的service
3、調(diào)整原來的腳本
cd /usr/local/k8s/tomcat-deploy/ vim tomcat-deploy.yml# 調(diào)整如下 apiVersion: extensions/v1beta1 kind: Deployment metadata:name: tomcat-deploy spec:replicas: 2template:metadata:labels:app: tomcat-clusterspec:volumes:- name: web-apphostPath:path: /mntcontainers:- name: tomcat-clusterimage: tomcat:8ports:- containerPort: 8080volumeMounts:- name: web-appmountPath: /usr/local/tomcat/webapps4、創(chuàng)建部署
kubectl create -f tomcat-deploy.yml5、檢查一下吧,我們來驗證node02這臺機器
進入 docker 容器,檢查掛載目錄是否成功
在master中修改文件,可以看到,在docker容器中,能夠隨時同步master對文件的修改。
至此,我們通過一個節(jié)點,管理了整個集群要共享的文件!
上面這是個笨辦法,需要手動進入docker容器才行。
那么,如何在master服務器上,對全局的docker容器進行觀察呢?
在 master 上使用命令:
kubectl get pod -o wide # 查看所有的pod kubectl exec -it tomcat-deploy-6659b6749b-8xwhq /bin/bash # 直接進入某個pod的容器內(nèi)部交互Service 提供負載均衡實現(xiàn):由 Master 上面的 tomcat-service 進行自動請求轉(zhuǎn)發(fā)
統(tǒng)一應用入口,至于后端有幾個tomcat,我們不用去關(guān)心,一切交由服務進行配置和轉(zhuǎn)發(fā)。
查看并刪除已經(jīng)部署的服務
查看服務的詳細信息
kubectl get service kubectl describe service tomcat-service
發(fā)送get請求
測試負載均衡的效果
# 新建一個頁面 cd /usr/local/data/www-data && mkdir test vim index.jsp# index.jsp 當前服務器ip:<%=request.getLocalAddr()%>發(fā)送多次請求curl 10.108.170.161:8000/test,你看,請求被隨機發(fā)送到兩臺節(jié)點上了,k8s幫我們做了負載均衡
10.108.170.161:8000 這個 url,在外部的瀏覽器是無法訪問的。在集群外側(cè),只能通過主機的網(wǎng)卡ip進行訪問。
那么如何做地址映射呢?可以使用 Linux 中的端口轉(zhuǎn)發(fā)工具:Rinetd
使用 Linux 中的端口轉(zhuǎn)發(fā)工具:Rinetd
wget https://boutell.com/rinetd/http/rinetd.tar.gz # 這個已經(jīng)訪問不到了,需要自行下載離線包 tar -xvf rinetd.tar.gz cd rinetd sed -i 's/65536/65535/g' rinetd.c mkdir -p /usr/man/ # rinetd的要求目錄,需要手動創(chuàng)建 yum install -y gcc # 沒有g(shù)cc的話安裝一下 make && make installvi /etc/rinetd.conf # 配置文件格式很簡單:[Source Address] [Source Port] [Destination Address] [Destination Port] # 簡單翻譯一下:源IP 源端口 目標IP 目標端口 # 每行一條轉(zhuǎn)發(fā)規(guī)則.# 配置文件這樣寫: # 0.0.0.0表示允許所有ip發(fā)送請求,8000表示master對外開放8000端口 # 每當 master 的 8000 端口接收到請求后,都轉(zhuǎn)發(fā)到內(nèi)部的 10.108.170.161:8000 0.0.0.0 8000 10.108.170.161 8000啟動和關(guān)閉轉(zhuǎn)發(fā)程序:
啟動:rinetd -c /etc/rinetd.conf
關(guān)閉:killall rinetd
檢驗端口轉(zhuǎn)發(fā)程序是否正確運行:netstat -tanulp|grep rinetd
瀏覽器訪問 master 的 ip:8000,可以順利訪問了,并且自帶負載均衡
集群配置調(diào)整與資源限定
1、更新集群配置
比如,你想把tomcat的數(shù)量由原來的3臺調(diào)整為4臺。修改配置文件后,執(zhí)行:
kubectl apply -f yml文件路徑2、刪除已有的部署/服務
# 刪除已有部署 bubectl delete deployment 部署的名稱# 刪除已有服務 bubectl delete service 服務的名稱3、對資源進行限定
在tomcat-deploy.yml文件中,限定創(chuàng)建的容器可以使用多少 CPU/ 內(nèi)存 等資源
- 需要滿足 requests 需要,才能在這個節(jié)點上進行容器的部署(限定了基本需要)
- 容器最多可以使用這個節(jié)點上的 limits 限制(限定了最大資源i)
CPU 的單位可以不是整數(shù),例如,0.5
apiVersion: extensions/v1beta1 kind: Deployment metadata:name: tomcat-deploy spec: replicas: 3template:metadata:labels:app: tomcat-clusterspec:volumes: - name: web-apphostPath: path: /mntcontainers:- name: tomcat-clusterimage: tomcat:8resources:requests:cpu: 0.5memory: 200Milimits:cpu: 1memory: 512Miports:- containerPort: 8080volumeMounts:- name: web-appmountPath: /usr/local/tomcat/webappskubectl apply -f tomcat-deploy.yml 更新集群配置
可以看到原來的 2 個 tomcat 變成了現(xiàn)在的 3 個 tomcat,那么,k8s 是以什么依據(jù)選擇的節(jié)點?
可用資源優(yōu)先原則:哪個機器的負載低,就優(yōu)先把新的 pod 部署在這個節(jié)點上。
另外,我們也可以指定將容器放在哪個節(jié)點上。
至此,關(guān)于 k8s 的配置與使用,我們講完啦!
使用 k8s 在集群中部署項目
1、項目拓撲
2、部署需要的所有文件
全部文件都在這里:
- dist:包含 springboot 打包的 jar
- sql:數(shù)據(jù)庫導出的 sql,配置好掛載后,mysql 啟動時,會自動導入數(shù)據(jù)文件
總結(jié)
以上是生活随笔為你收集整理的kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubernetes入门到精通(一):内
- 下一篇: leetcode 107. 二叉树的层次