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