環境准備
一台部署節點,一台master節點,還有兩台節點node1,node2
完好的k8s集群環境
思路一:
在node1和node2節點上通過宿主機與容器之間目錄映射和端口映射上線靜態網站(或動態),然后將映射的目錄做成hostpath,通過nfs共享出去。
思路二:
在node1和node2節點上通過拷貝宿主機存放靜態資源的目錄到容器的apache根目錄內實現靜態網站的上線,並且能通過部署nodeport靜態端口訪問后端節點的靜態網站。
這里我演示第二種方法:
部署節點操作:
1)編排httpd.yml文件
容器端口為80,副本數為3.
這里因為我是上線的apache服務,所以使用httpd的鏡像,當然也可以使用nginx或者tomcat,但需要注意的是各自的根目錄不一樣。
2)然后執行如下命令創建deployment,生成pod。
kubectl apply -f httpd.yml
查看pod狀態
[root@dlp yml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE httpd-deployment-784d567c4d-2fxb2 1/1 Running 0 10m 172.20.104.29 192.168.253.22 httpd-deployment-784d567c4d-bl4zk 1/1 Running 0 44m 172.20.166.163 192.168.253.21 httpd-deployment-784d567c4d-pdkhh 1/1 Running 0 45m 172.20.104.28 192.168.253.22
node節點:
3)根據pod的name在分別在22和21節點查找容器。
4)創建目錄/usr/local/apache2/htdocs ,然后上傳一個靜態資源包,我這里上傳一個飛機大戰的小游戲。 #這里我們需要知道的是,這也是httpd容器的根目錄。
[root@node1 htdocs]# ls game.zip [root@node1 htdocs]# unzip game.zip
解壓后是這個樣子
[root@node1 htdocs]# ls
game jquery-1.8.3.min.js readme.xls sky_fight.html sky.php
5)將以上文件全部拷貝到 3)步驟的容器里面的/usr/local/apache2/htdocs目錄下。
[root@node2 apache2]# docker cp htdocs/ 9b20bb037dd8:/usr/local/apache2/htdocs
6)進入容器的/usr/local/apache2/htdocs目錄,查看文件是否拷貝成功,並且將原本的index,html文件移走或者刪除。
否則訪問的就是此文件下的內容。—————》it work
[root@node2 apache2]# docker exec -it 9b20bb037dd8 /bin/bash
root@httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2# ls bin build cgi-bin conf error htdocs icons include logs modules root@httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2# cd htdocs/ root@httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2/htdocs# ls htdocs index.html tml @httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2/htdocs# rm -rf index.ht root@httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2/htdocs# cd htdocs/ root@httpd-deployment-784d567c4d-2fxb2:/usr/local/apache2/htdocs/htdocs# ls game images readme.xls sky_fight.html game.zip jquery-1.8.3.min.js sky.php
7) 以上步驟成功后又回到部署節點編寫一個service的編排文件。
節點的靜態端口設置為26055,service端口為8080.注意框內的run: httpd。要與1)步驟的編排文件的label name對應。
8)啟動編排文件,生成service。
kubectl apply -f svc.yml
9)查看service的狀態
[root@dlp yml]# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR httpd-svc NodePort 10.68.90.148 <none> 8080:26055/TCP 22h run=httpd kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 1d <none> nginx-svc2 NodePort 10.68.26.208 <none> 8081:30001/TCP 21h run=nginx
10)在不屬於k8s集群的任意主機上訪問。格式為nodeip + nodeport 。例如:
因為是靜態網站,所以我們去web瀏覽器上訪問效果更好。
11) 但是這樣只是做了一個節點的可用,我們要想將21節點加入服務端。需要將/usr/local/apache/htdocs目錄當成nfs的共享目錄掛載到其他節點上。並且通過將此目錄下的資源拷貝到節點容器內,而不是通過目錄映射,為什么呢?
因為通過目錄映射的方式會重新生成一個容器,而不是1)步驟通過編排文件生成的pod容器。這樣通過nodeport就無法訪問靜態資源而是通過宿主機映射的端口來訪問。
12)在21節點上執行3、4、5、6步驟,然后訪問瀏覽器,顯示效果如下:
可以看到集群的節點都實現了靜態網站上線,如果集群內的pod down掉k8s集群會根據副本數自動生成新的pod,實現高可用。