Kubernetes_手把手打鏡像并運行到k8s容器上(親測可用)
本文使用兩個機器 192.168.100.150 是master節(jié)點,192.168.100.151 是node1 節(jié)點,如下:
(資料圖片僅供參考)
演示三個示例,第一個示例wordpress博客系統(tǒng)是指將別人的鏡像部署在k8s;第二個示例springboot項目在第一個示例的基礎(chǔ)上再進一步,是指自己從零開始寫一個web項目生成jar然后打成鏡像,最后部署在k8s;第三個示例在第二個示例的基礎(chǔ)上再進一步,是模擬搭建不在springcloud中的兩個獨立的springboot的web工程,然后打包成鏡像部署在k8s上,并且兩個服務(wù)作為nacos-client注冊到nacos-server上,一個服務(wù)可以拿到另一個服務(wù)在nacos-server上詳情信息。
本文所需資源文件:https://www.syjshare.com/res/RGSS1MBM
二、wordpress博客系統(tǒng)第一個示例wordpress博客系統(tǒng)是指將別人的鏡像部署在k8s,wordpress 需要訪問 mysql,做博客。
2.1 開發(fā)流程(1)創(chuàng)建wordpress命名空間
kubectl create namespace wordpress
(2)創(chuàng)建wordpress-db.yaml文件 (比較大,放在CSDN資源文件中下載)
(3)根據(jù)wordpress-db.yaml創(chuàng)建資源[mysql數(shù)據(jù)庫]
kubectl apply -f wordpress-db.yamlkubectl get pods -n wordpress # 記得獲取ip,因為wordpress.yaml文件中要修改kubectl get svc mysql -n wordpresskubectl describe svc mysql -n wordpress
(4)創(chuàng)建wordpress.yaml文件:(比較大,放在CSDN資源文件中下載)(5)根據(jù)wordpress.yaml創(chuàng)建資源[wordpress]
kubectl apply -f wordpress.yaml #修改其中mysql的ip地址,其實也可以使用service的name:mysqlkubectl get pods -n wordpress kubectl get svc -n wordpress # 獲取到轉(zhuǎn)發(fā)后的端口,如30063
2.2 效果演示(6)訪問測試win訪問 wordpress ,注意找到 wordpress 的pod所在的宿主機是哪個 (不一定是master節(jié)點,我這里就是 node1 節(jié)點,所以就是 192.168.100.151 ),然后還要找到暴露出來的nodePort端口號 30000以上那個
先切換命名空間:kubectl config set-context --current --namespace=wordpress然后 kubetl get all 查看兩個服務(wù) wordpress-db.yaml 和 wordpress.yaml 是否正常
k8s開發(fā)中,如果沒有達(dá)到自己想要的效果,需要查看pod的日志定位問題,方法如下:(1) 如果pod還沒有達(dá)到running狀態(tài),則使用 kubectl describe pod 具體pod名稱查看 (同理 kubectl describe nodes 具體node名稱 也可以查看node為什么沒有 Ready 狀態(tài))(2) 如果pod已經(jīng)達(dá)到running狀態(tài),則使用 kubectl logs 具體pod名稱 查看運行日志。小結(jié):kubectl describe pod 具體pod名稱查看 查看pod啟動日志;kubectl logs 具體pod名稱 查看運行日志。
win上連接數(shù)據(jù)庫成功,表示 wordpress-db.yaml 成功,如下:
win上訪問 wordpress所在宿主機ip:wordpress暴露的宿主機端口 成功,選擇語言并進行安裝,先選擇語言,如下:然后安裝,如下:安裝好了,看到了主界面,如下:
三、自己寫一個springboot項目生成鏡像部署到K8S集群中現(xiàn)在開始第二個示例,在第一個示例的基礎(chǔ)上再進一步,是指自己從零開始寫一個web項目生成jar然后打成鏡像,最后部署在k8s。
3.1 開發(fā)流程流程:確定服務(wù)–>編寫Dockerfile制作鏡像–>上傳鏡像到倉庫–>編寫K8S文件–>創(chuàng)建
(1)準(zhǔn)備Spring Boot項目springboot-demo
@RestControllerpublic class K8SController { @RequestMapping("/k8s") public String k8s(){ return "hello K8s!"; }}
(2)生成xxx.jar,并且上傳到虛擬機的springboot-demo目錄
mvn clean pakcage
(3)編寫Dockerfile文件
mkdir springboot-demo
cd springboot-demo
vi Dockerfile
FROM openjdk:8-jre-alpineCOPY springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jarENTRYPOINT ["java","-jar","/springboot-demo.jar"]
(4)根據(jù)Dockerfile創(chuàng)建image
docker build -t springboot-demo-image .
(5)使用docker run創(chuàng)建container
docker run -d --name s1 springboot-demo-image
(6)訪問測試
curl ip:8080/k8s
(7)將鏡像推送到鏡像倉庫
# 登錄阿里云鏡像倉庫docker login --username=自己在阿里云上的賬號 registry.cn-hangzhou.aliyuncs.comdocker tag springboot-demo-image 自己在阿里云上鏡像倉庫:v1.0docker push 自己在阿里云上鏡像倉庫:v1.0
(8)編寫Kubernetes配置文件 (比較大,放在CSDN資源文件中下載)
vi springboot-demo.yamlkubectl apply -f springboot-demo.yaml
(9)查看資源
kubectl get podskubectl get pods -o widecurl pod_id:8080/k8skubectl get svckubectl scale deploy springboot-demo --replicas=5
(10)win配置hosts文件
192.168.100.151 tomcat.jack.com
(11)win瀏覽器訪問
http://tomcat.jack.com/k8s3.2 效果演示
首先需要自己從零開始新建一個springboot項目,使用springboot新建項目很簡單的,三步操作,如下,第一步:第二步,如下:第三步,如下:好了,這就是新建的springboot項目,只有一個controller端口,@RestController默認(rèn)返回的是字符串,如下:
Idea下面的Terminal中,輸入mvn clean package,然后到target目錄下取出剛剛生成的jar包,傳遞到centos機器上(我這里是centos7版本),如下:新建一個spring-boot目錄,將jar包放在這個目錄下,然后在同級目錄下 vi Dockerfile 新建一個文件,如下:
FROM openjdk:8-jre-alpineCOPY springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jarENTRYPOINT ["java","-jar","/springboot-demo.jar"]
然后運行docker build -t springboot-demo-image .,就可以在本地生成一個名為 springboot-demo-image 的鏡像,可以使用docker images | grep springboot查看,然后運行鏡像成為容器docker run -d --name s1 springboot-demo-image,如下:
這里是因為沒有使用docker push ,將本地鏡像推送到阿里云,所以才需要在另一個 w1 節(jié)點也打一個鏡像,下面的nacos的例子會將鏡像推送到阿里云,演示這種情況
運行效果:
四、部署Nacos項目現(xiàn)在在第二個示例的基礎(chǔ)上再進一步,是模擬搭建不在springcloud中的兩個獨立的springboot的web工程,然后打包成鏡像部署在k8s上,并且兩個服務(wù)作為nacos-client注冊到nacos-server上,一個服務(wù)可以拿到另一個服務(wù)在nacos-server上詳情信息。
4.1 傳統(tǒng)方式啟動兩個服務(wù)(user和order)4.1.1 開發(fā)流程(1)準(zhǔn)備兩個Spring Boot項目,名稱為user和order,表示兩個服務(wù) (比較大,放在CSDN資源文件中下載)
(2)下載部署nacos server1.0.0 (比較大,放在CSDN資源文件中下載)
github:https://github.com/alibaba/nacos/releases
01 上傳nacos-server-1.0.0.tar.gz到阿里云服務(wù)器39:/usr/local/nacos02 解壓:tar -zxvf03 進入到bin目錄執(zhí)行:sh startup.sh -m standalone [需要有java環(huán)境的支持]04 瀏覽器訪問:39.100.39.63:8848/nacos05 用戶名和密碼:nacos
(3)將應(yīng)用注冊到nacos,記得修改Spring Boot項目中application.yml文件
01 將user/order服務(wù)注冊到nacos02 user服務(wù)能夠找到order服務(wù)
(4)啟動兩個Spring Boot項目,然后查看nacos server的服務(wù)列表
4.1.2 效果演示(5)為了驗證user能夠發(fā)現(xiàn)order的地址
訪問localhost:8080/user/test,查看日志輸出,從而測試是否可以ping通order地址
安裝好nacos和jdk,如下:nacos傳統(tǒng)方式部署在centos上面(我這里是centos7),需要配置好jdk,如下:啟動nacos,如下:注意,如果是第二次啟動nacos,bin目錄下會多一些目錄和文件,如 derby.log logs目錄 work目錄,如下:
win上登錄nacos,chrome中輸入 192.168.100.150:8848 ,賬號密碼都是nacos/nacos,如下:啟動nacos之后,然后idea本地啟動兩個服務(wù),就被注冊到nacos上了,如下:
訪問 user 工程的 /user/test 接口,可以得到 nacos-server 上的 order 工程的詳細(xì)信息,如下:
注意一下nacos-server的停止,如下:
4.2 兩個服務(wù)(user和order)都是K8s中的Pod思考:如果將user和order都遷移到K8s中,那服務(wù)注冊與發(fā)現(xiàn)會有問題嗎?
(1)生成xxx.jar,并且分別上傳到master節(jié)點的user和order目錄
resources/nacos/jar/xxx.jar
mvn clean pakcage
(2)來到對應(yīng)的目錄,編寫Dockerfile文件
vi Dockerfile
FROM openjdk:8-jre-alpineCOPY user-0.0.1-SNAPSHOT.jar /user.jarENTRYPOINT ["java","-jar","/user.jar"]
FROM openjdk:8-jre-alpineCOPY order-0.0.1-SNAPSHOT.jar /order.jarENTRYPOINT ["java","-jar","/order.jar"]
(3)根據(jù)Dockerfile創(chuàng)建image
docker build -t user-image:v1.0 .docker build -t order-image:v1.0 .
order也是一樣的,如下:
(4)將鏡像推送到鏡像倉庫
# 登錄阿里云鏡像倉庫docker login --username=itcrazy2016@163.com registry.cn-hangzhou.aliyuncs.comdocker tag user-image:v1.0 registry.cn-hangzhou.aliyuncs.com/itcrazy2016/user-image:v1.0docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/user-image:v1.0
如何驗證 docker push 成功了?兩種方案:一是到阿里云的鏡像倉庫去查看,一是到另一個機器上docker pull 看是否成功(注意阿里云的鏡像倉庫需要設(shè)置為公開,才能docker pull成功的,私有的需要登錄才能docker pull)。
(5) 有了鏡像,接下來就是yaml文件,則編寫Kubernetes配置文件vi user.yaml/order.yaml
kubectl apply -f user.yaml/order.yaml
(6)查看資源
kubectl get podskubectl get pods -o widekubectl get svckubectl get ingress
(7)查看nacos server上的服務(wù)信息
可以發(fā)現(xiàn),注冊到nacos server上的服務(wù)ip地址為pod的ip,比如192.168.80.206/192.168.190.82注意:注冊到nacos server上的服務(wù)ip地址為pod的ip,不是service的ip,這里pod的端口都用8080 9090,service的端口都用80
(8)訪問測試
# 01 集群內(nèi)curl user-pod-ip:8080/user/testkubectl logs -f-c [主要是為了看日志輸出,證明user能否訪問order]# 02 集群外,比如win的瀏覽器,可以把集群中原來的ingress刪除掉http://k8s.demo.gper.club/user/test
結(jié)論:如果服務(wù)都是在K8s集群中,最終將pod ip注冊到了nacos server,那么最終服務(wù)通過pod ip發(fā)現(xiàn)so easy。
4.3 user傳統(tǒng)和order遷移K8s假如user現(xiàn)在不在K8s集群中,但是order在K8s集群中
比如user使用本地idea中的,order使用上面K8s中的
(1)啟動本地idea中的user服務(wù)
(2)查看nacos server中的user服務(wù)列表
(3)訪問本地的localhost:8080/user/test,并且觀察idea中的日志打印,發(fā)現(xiàn)訪問的是order的pod id,此時肯定是不能進行服務(wù)調(diào)用的,怎么解決呢?
(4)解決思路
之所以訪問不了,是因為order的pod ip在外界訪問不了,即 k8s集群內(nèi)ip在集群外的win上的idea是訪問不了的,怎么解決呢?01 可以將pod啟動時所在的宿主機的ip寫到容器中,也就是pod id和宿主機ip有一個對應(yīng)關(guān)系02 pod和宿主機使用host網(wǎng)絡(luò)模式,也就是pod直接用宿主機的ip,但是如果服務(wù)高可用會有端口沖突問題[可以使用pod的調(diào)度策略,盡可能在高可用的情況下,不會將pod調(diào)度在同一個worker中]
(5)我們來演示一個host網(wǎng)絡(luò)模式的方式,修改order.yaml文件
修改之后apply之前可以看一下各個節(jié)點的9090端口是否被占用
lsof -i tcp:9090
... metadata: labels: app: order spec: # 主要是加上這句話,注意在order.yaml的位置 hostNetwork: true containers: - name: order image: registry.cn-hangzhou...
(6)kubectl apply -f order.yaml
kubectl get pods -o wide —>找到pod運行在哪個機器上,比如w2
查看w2上的9090端口是否啟動
(7)查看nacos server上order服務(wù)
可以發(fā)現(xiàn)此時用的是w2宿主機的9090端口
五、尾聲(8)本地idea訪問測試
localhost:8080/user/test
手把手打鏡像并運行到k8s容器上(親測可用),完成了。
天天打碼,天天進步?。?/p>
相關(guān)閱讀
-
世界熱推薦:今晚7:00直播丨下一個突破...
今晚19:00,Cocos視頻號直播馬上點擊【預(yù)約】啦↓↓↓在運營了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場,每周都會有相當(dāng)多項目起起伏伏。在過去... -
環(huán)球今亮點!頭條觀察 | DeFi的興衰與...
在比特幣得到機構(gòu)關(guān)注之后,許多財務(wù)專家預(yù)測世界將因為加密貨幣的... -
重新審視合作,體育Crypto的可靠關(guān)系才能雙贏
Block-987即使在體育Crypto領(lǐng)域,人們的目光仍然集中在FTX上。隨著... -
簡訊:前端單元測試,更進一步
前端測試@2022如果從2014年Jest的第一個版本發(fā)布開始計算,前端開發(fā)... -
焦點熱訊:劉強東這波操作秀
近日,劉強東發(fā)布京東全員信,信中提到:自2023年1月1日起,逐步為...