單機版的K8s環(huán)境搭建及部署Java Web應(yīng)用
寫在前面

書里看到,這里單獨拿出整理一下
博文內(nèi)容包括:
K8s環(huán)境單機版搭建
Tomcat+mysql 一個簡單的Java Web APP 應(yīng)用實踐
傍晚時分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當(dāng)時我是個年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波
K8s環(huán)境單機版搭建
1. 環(huán)境準(zhǔn)備
# 關(guān)閉CentoS自帶的防火墻服務(wù): systemctl disable firewalld --now sed -i '/swap/d' /etc/fstab # 安裝etcd和Kubernetes軟件(會自動安裝Docker軟件): yum install -y etcd kubernetes #按順序啟動所有的服務(wù): systemctl start etcd systemctl start docker systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubelet systemctl start kube-proxy # 查看服務(wù)狀態(tài) systemctl status etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
至此,一個單機版的Kubernetes集群環(huán)境就安裝啟動完成了。接下來,我們可以在這個單機版的Kubernetes集群中上手練習(xí)了。
鏡像相關(guān)地址: https://hub.docker.com/u/kubeguide/.
一個簡單的Java Web APP 應(yīng)用實踐
1. 啟動MySQL服務(wù)
首先為MySQL服務(wù)創(chuàng)建一個RC定義文件:mysql-rc.yaml,文件的完整內(nèi)容和解釋;
apiVersion: v1 kind: ReplicationController #副本控制器RC metadata: # RC的名稱,全局唯一 name: mysql # Pod副本期待數(shù)量 spec: replicas: 1 selector: # 符合目標(biāo)的Pod擁有此標(biāo)簽 app: mysql # 根據(jù)此模板創(chuàng)建Pod的副本(實例). template: metadata: #Pod副本擁有的標(biāo)簽,對應(yīng)RC的Selector labels: app: mysql spec: containers: # Pod內(nèi)容器的定義部分 - name: mysql # 容器的名稱,容器對應(yīng)的Docker Image image: mysql ports: #容器應(yīng)用監(jiān)聽的端口號 - containerPort: 3306 env: #注入容器內(nèi)的環(huán)境變量 - name: MYSQL_ROOT_PASSWORD value: "123456"
yaml定義文件中
[root@liruilong k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created E:\docker>ssh root@39.97.241.18 Last login: Sun Aug 29 13:00:58 2021 from 121.56.4.34 Welcome to Alibaba Cloud Elastic Compute Service ! ^[[AHow would you spend your life?.I don t know, but I will cherish every minute to live. [root@liruilong ~]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 1d [root@liruilong ~]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d [root@liruilong ~]#
嗯,這里剛開始搞得的時候是有問題的,pod一直沒辦法創(chuàng)建成功,第一次啟動容器時,STATUS一直顯示CONTAINERCREATING,我用的是阿里云ESC單核2G+40G云盤,我最開始以為系統(tǒng)核數(shù)的問題,因為看其他的教程寫的需要雙核,但是后來發(fā)現(xiàn)不是,網(wǎng)上找了解決辦法,一頓操作猛如虎,后來不知道怎么就好了。
有說基礎(chǔ)鏡像外網(wǎng)拉不了,只能用 docker Hub的,有說 ,權(quán)限的問題,還有說少包的問題,反正都試了,這里列出幾個靠譜的解決方案
https://blog.csdn.net/gezilan/article/details/80011905
https://www.freesion.com/article/8438814614/
K8s 根據(jù)mysqlde RC的定義自動創(chuàng)建的Pod。由于Pod的調(diào)度和創(chuàng)建需要花費一定的時間,比如需要一定的時間來確定調(diào)度到哪個節(jié)點上,以及下載Pod里容器的鏡像需要一段時間,所以一開始我們看到Pod的狀態(tài)將顯示為Pending。當(dāng)Pod成功創(chuàng)建完成以后,狀態(tài)最終會被更新為Running我們通過docker ps指令查看正在運行的容器,發(fā)現(xiàn)提供MySQL服務(wù)的Pod容器已經(jīng)創(chuàng)建并正常運行了,此外,你會發(fā)現(xiàn)MySQL Pod對應(yīng)的容器還多創(chuàng)建了一個來自谷歌的pause容器,這就是Pod的“根容器".
我們創(chuàng)建一個與之關(guān)聯(lián)的Kubernetes Service 的定義文件 mysql-sve.yaml
apiVersion: v1 kind: Service # 表明是Kubernetes Service metadata: name: mysql # Service的全局唯一名稱 spec: ports: - port: 3306 #service提供服務(wù)的端口號 selector: #Service對應(yīng)的Pod擁有這里定義的標(biāo)簽 app: mysql
我們通過kubectl create命令創(chuàng)建Service對象。運行kubectl命令:
[root@liruilong k8s]# kubectl create -f mysql-svc.yaml service "mysql" created [root@liruilong k8s]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql 10.254.155.86
注意到MySQL服務(wù)被分配了一個值為10.254.155.86的Cluster IP地址,這是一個虛地址,隨后, Kubernetes集群中其他新創(chuàng)建的Pod就可以通過Service的Cluster IP+端口號3306來連接和訪問它了。
在通常情況下, Cluster IP是在Service創(chuàng)建后由Kubernetes系統(tǒng)自動分配的,其他Pod無法預(yù)先知道某個Service的Cluster IP地址,因此需要一個服務(wù)發(fā)現(xiàn)機制來找到這個服務(wù)。
為此,最初時, Kubernetes巧妙地使用了Linux環(huán)境變量(Environment Variable)來解決這個問題,后面會詳細說明其機制。現(xiàn)在我們只需知道,根據(jù)Service的唯一名字,容器可以從環(huán)境變量中獲取到Service對應(yīng)的Cluster IP地址和端口,從而發(fā)起TCP/IP連接請求了。
2.啟動Tomcat應(yīng)用
創(chuàng)建對應(yīng)的 RC文件 myweb-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080
replicas: 2: 這里我們用兩個tomcat(Pod)提供服務(wù)
[root@liruilong k8s]# vim myweb-rc.yaml [root@liruilong k8s]# kubectl create -f myweb-rc.yaml replicationcontroller "myweb" created [root@liruilong k8s]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 1d myweb 2 2 0 20s [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d myweb-53r32 0/1 ContainerCreating 0 28s myweb-609w4 0/1 ContainerCreating 0 28s [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-q7802 1/1 Running 0 1d myweb-53r32 1/1 Running 0 1m myweb-609w4 1/1 Running 0 1m [root@liruilong k8s]#
最后,創(chuàng)建對應(yīng)的 Service 。以下是完整yaml定義文件 myweb-svc.yaml:
指定端口映射:30001:8080
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
[root@liruilong k8s]# vim myweb-svc.yaml [root@liruilong k8s]# kubectl create -f myweb-svc.yaml service "myweb" created [root@liruilong k8s]# kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1
3.通過瀏覽器訪問網(wǎng)頁
[root@liruilong k8s]# curl http://127.0.0.1:30001/demo/
Error:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
數(shù)據(jù)庫連接有問題,這里百度發(fā)現(xiàn)是mysql驅(qū)動版本問題
[root@liruilong k8s]# docker logs a05d16ec69ff [root@liruilong k8s]# vim mysql-rc.yaml
apiVersion: v1 kind: ReplicationController #副本控制器RC metadata: # RC的名稱,全局唯一 name: mysql # Pod副本期待數(shù)量 spec: replicas: 1 selector: # 符合目標(biāo)的Pod擁有此標(biāo)簽 app: mysql # 根據(jù)此模板創(chuàng)建Pod的副本(實例). template: metadata: #Pod副本擁有的標(biāo)簽,對應(yīng)RC的Selector labels: app: mysql spec: containers: # Pod內(nèi)容器的定義部分 - name: mysql # 容器的名稱,容器對應(yīng)的Docker Image image: mysql:5.7 ports: #容器應(yīng)用監(jiān)聽的端口號 - containerPort: 3306 env: #注入容器內(nèi)的環(huán)境變量 - name: MYSQL_ROOT_PASSWORD value: "123456"
[root@liruilong k8s]# kubectl delete -f mysql-rc.yaml replicationcontroller "mysql" deleted [root@liruilong k8s]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created [root@liruilong k8s]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 0 10s myweb 2 2 2 4h [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 0/1 ContainerCreating 0 15s myweb-53r32 1/1 Running 0 4h myweb-609w4 1/1 Running 1 4h [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 0/1 ContainerCreating 0 32s myweb-53r32 1/1 Running 0 4h myweb-609w4 1/1 Running 1 4h [root@liruilong k8s]#
我們在上面的SVC中定義了Tomcat的兩個pod。所以這里顯示兩個
Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e Status: Downloaded newer image for docker.io/mysql:5.7 [root@liruilong k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE mysql-2cpt9 1/1 Running 0 31m myweb-53r32 1/1 Running 0 5h myweb-609w4 1/1 Running 1 5h [root@liruilong k8s]# curl http://127.0.0.1:30001/demo/
測試一下
Congratulations!!
Name | Level(Score) |
100 | |
docker | 100 |
teacher | 100 |
HPE | 100 |
our team | 100 |
me | 100 |
Docker Java Kubernetes
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。