首頁/ 汽車/ 正文

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

一、前言

本文使用兩個機器 192。168。100。150 是master節點,192。168。100。151 是node1 節點,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

演示三個示例,第一個示例wordpress部落格系統是指將別人的映象部署在k8s;第二個示例springboot專案在第一個示例的基礎上再進一步,是指自己從零開始寫一個web專案生成jar然後打成映象,最後部署在k8s;第三個示例在第二個示例的基礎上再進一步,是模擬搭建不在springcloud中的兩個獨立的springboot的web工程,然後打包成映象部署在k8s上,並且兩個服務作為nacos-client註冊到nacos-server上,一個服務可以拿到另一個服務在nacos-server上詳情資訊。

本文所需資原始檔

:https://www。syjshare。com/res/RGSS1MBM

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

二、wordpress部落格系統

第一個示例wordpress部落格系統是指將別人的映象部署在k8s,wordpress 需要訪問 mysql,做部落格。

2。1 開發流程

(1)建立wordpress名稱空間

kubectl create namespace wordpress

(2)建立wordpress-db。yaml檔案 (比較大,放在CSDN資原始檔中下載)

(3)根據wordpress-db。yaml建立資源[mysql資料庫]

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)建立wordpress。yaml檔案:(比較大,放在CSDN資原始檔中下載)

(5)根據wordpress。yaml建立資源[wordpress]

kubectl apply -f wordpress。yaml #修改其中mysql的ip地址,其實也可以使用service的name:mysqlkubectl get pods -n wordpress kubectl get svc -n wordpress # 獲取到轉發後的埠,如30063

(6)訪問測試

win訪問 wordpress ,注意找到 wordpress 的pod所在的宿主機是哪個 (不一定是master節點,我這裡就是 node1 節點,所以就是 192。168。100。151 ),然後還要找到暴露出來的nodePort埠號 30000以上那個

2。2 效果演示

先切換名稱空間:kubectl config set-context ——current ——namespace=wordpress

然後 kubetl get all 檢視兩個服務 wordpress-db。yaml 和 wordpress。yaml 是否正常

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

k8s開發中,如果沒有達到自己想要的效果,需要檢視pod的日誌定位問題,方法如下:

(1) 如果pod還沒有達到running狀態,則使用 kubectl describe pod 具體pod名稱檢視 (同理 kubectl describe nodes 具體node名稱 也可以檢視node為什麼沒有 Ready 狀態)

(2) 如果pod已經達到running狀態,則使用 kubectl logs 具體pod名稱 檢視執行日誌。

小結:kubectl describe pod 具體pod名稱檢視 檢視pod啟動日誌;kubectl logs 具體pod名稱 檢視執行日誌。

win上連線資料庫成功,表示 wordpress-db。yaml 成功,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

win上訪問 wordpress所在宿主機ip:wordpress暴露的宿主機埠 成功,選擇語言並進行安裝,先選擇語言,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

然後安裝,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

安裝好了,看到了主介面,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

三、自己寫一個springboot專案生成映象部署到K8S叢集中

現在開始第二個示例,在第一個示例的基礎上再進一步,是指自己從零開始寫一個web專案生成jar然後打成映象,最後部署在k8s。

3。1 開發流程

流程

:確定服務–>編寫Dockerfile製作映象–>上傳映象到倉庫–>編寫K8S檔案–>建立

(1)準備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)根據Dockerfile建立image

docker build -t springboot-demo-image 。

(5)使用docker run建立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。yaml

kubectl 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新建專案很簡單的,三步操作,如下,第一步:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

第二步,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

第三步,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

好了,這就是新建的springboot專案,只有一個controller埠,@RestController預設返回的是字串,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Idea下面的Terminal中,輸入mvn clean package,然後到target目錄下取出剛剛生成的jar包,傳遞到centos機器上(我這裡是centos7版本),如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

新建一個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

,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

這裡是因為沒有使用docker push ,將本地映象推送到阿里雲,所以才需要在另一個 w1 節點也打一個映象,下面的nacos的例子會將映象推送到阿里雲,演示這種情況

執行效果:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

四、部署Nacos專案

現在在第二個示例的基礎上再進一步,是模擬搭建不在springcloud中的兩個獨立的springboot的web工程,然後打包成映象部署在k8s上,並且兩個服務作為nacos-client註冊到nacos-server上,一個服務可以拿到另一個服務在nacos-server上詳情資訊。

4。1 傳統方式啟動兩個服務(user和order)

4。1。1 開發流程

(1)準備兩個Spring Boot專案,名稱為user和order,表示兩個服務 (比較大,放在CSDN資原始檔中下載)

(2)下載部署nacos server1。0。0 (比較大,放在CSDN資原始檔中下載)

github

:https://github。com/alibaba/nacos/releases

01 上傳nacos-server-1。0。0。tar。gz到阿里雲伺服器39:/usr/local/nacos02 解壓:tar -zxvf03 進入到bin目錄執行:sh startup。sh -m standalone [需要有java環境的支援]04 瀏覽器訪問:39。100。39。63:8848/nacos05 使用者名稱和密碼:nacos

(3)將應用註冊到nacos,記得修改Spring Boot專案中application。yml檔案

01 將user/order服務註冊到nacos02 user服務能夠找到order服務

(4)啟動兩個Spring Boot專案,然後檢視nacos server的服務列表

(5)為了驗證user能夠發現order的地址

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

4。1。2 效果演示

安裝好nacos和jdk,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

nacos傳統方式部署在centos上面(我這裡是centos7),需要配置好jdk,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

啟動nacos,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

注意,如果是第二次啟動nacos,bin目錄下會多一些目錄和檔案,如 derby。log logs目錄 work目錄,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

win上登入nacos,chrome中輸入 192。168。100。150:8848 ,賬號密碼都是nacos/nacos,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

啟動nacos之後,然後idea本地啟動兩個服務,就被註冊到nacos上了,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

訪問 user 工程的 /user/test 介面,可以得到 nacos-server 上的 order 工程的詳細資訊,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

注意一下nacos-server的停止,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

4。2 兩個服務(user和order)都是K8s中的Pod

思考

:如果將user和order都遷移到K8s中,那服務註冊與發現會有問題嗎?

(1)生成xxx。jar,並且分別上傳到master節點的user和order目錄

resources/nacos/jar/xxx。jar

mvn clean pakcage

(2)來到對應的目錄,編寫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)根據Dockerfile建立image

docker build -t user-image:v1。0 。docker build -t order-image:v1。0 。

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

order也是一樣的,如下:

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

(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

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

如何驗證 docker push 成功了?

兩種方案:一是到阿里雲的映象倉庫去檢視,一是到另一個機器上docker pull 看是否成功(注意阿里雲的映象倉庫需要設定為公開,才能docker pull成功的,私有的需要登入才能docker pull)。

Kubernetes_手把手打映象並執行到k8s容器上(親測可用)

(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上的服務資訊

可以發現,註冊到nacos server上的服務ip地址為pod的ip,比如192。168。80。206/192。168。190。82

注意:註冊到nacos server上的服務ip地址為pod的ip,不是service的ip,這裡pod的埠都用8080 9090,service的埠都用80

(8)訪問測試

# 01 叢集內curl user-pod-ip:8080/user/testkubectl logs -f -c [主要是為了看日誌輸出,證明user能否訪問order]# 02 叢集外,比如win的瀏覽器,可以把叢集中原來的ingress刪除掉http://k8s。demo。gper。club/user/test

結論

:如果服務都是在K8s叢集中,最終將pod ip註冊到了nacos server,那麼最終服務透過pod ip發現so easy。

4。3 user傳統和order遷移K8s

假如user現在不在K8s叢集中,但是order在K8s叢集中

比如user使用本地idea中的,order使用上面K8s中的

(1)啟動本地idea中的user服務

(2)檢視nacos server中的user服務列表

(3)訪問本地的localhost:8080/user/test,並且觀察idea中的日誌列印,發現訪問的是order的pod id,此時肯定是不能進行服務呼叫的,怎麼解決呢?

(4)解決思路

之所以訪問不了,是因為order的pod ip在外界訪問不了,即 k8s叢集內ip在叢集外的win上的idea是訪問不了的,怎麼解決呢?

01 可以將pod啟動時所在的宿主機的ip寫到容器中,也就是pod id和宿主機ip有一個對應關係

02 pod和宿主機使用host網路模式,也就是pod直接用宿主機的ip,但是如果服務高可用會有埠衝突問題[可以使用pod的排程策略,儘可能在高可用的情況下,不會將pod排程在同一個worker中]

(5)我們來演示一個host網路模式的方式,修改order。yaml檔案

修改之後apply之前可以看一下各個節點的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服務

可以發現此時用的是w2宿主機的9090埠

(8)本地idea訪問測試

localhost:8080/user/test

五、尾聲

手把手打映象並執行到k8s容器上(親測可用),完成了。

天天打碼,天天進步!!

相關文章

頂部