您的位置:首頁 >聚焦 >

Kubernetes_手把手打鏡像并運行到k8s容器上(親測可用)

2022-11-21 16:39:26    來源:程序員客棧
一、前言

本文使用兩個機器 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

(6)訪問測試win訪問 wordpress ,注意找到 wordpress 的pod所在的宿主機是哪個 (不一定是master節(jié)點,我這里就是 node1 節(jié)點,所以就是 192.168.100.151 ),然后還要找到暴露出來的nodePort端口號 30000以上那個

2.2 效果演示

先切換命名空間: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/k8s

3.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ù)列表

(5)為了驗證user能夠發(fā)現(xiàn)order的地址

訪問localhost:8080/user/test,查看日志輸出,從而測試是否可以ping通order地址

4.1.2 效果演示

安裝好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)鍵詞: 的基礎(chǔ)上 可以使用 從零開始

相關(guān)閱讀