一、前言
本文使用兩個機器 192。168。100。150 是master節點,192。168。100。151 是node1 節點,如下:
演示三個示例,第一個示例wordpress部落格系統是指將別人的映象部署在k8s;第二個示例springboot專案在第一個示例的基礎上再進一步,是指自己從零開始寫一個web專案生成jar然後打成映象,最後部署在k8s;第三個示例在第二個示例的基礎上再進一步,是模擬搭建不在springcloud中的兩個獨立的springboot的web工程,然後打包成映象部署在k8s上,並且兩個服務作為nacos-client註冊到nacos-server上,一個服務可以拿到另一個服務在nacos-server上詳情資訊。
本文所需資原始檔
:https://www。syjshare。com/res/RGSS1MBM
二、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 是否正常
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 成功,如下:
win上訪問 wordpress所在宿主機ip:wordpress暴露的宿主機埠 成功,選擇語言並進行安裝,先選擇語言,如下:
然後安裝,如下:
安裝好了,看到了主介面,如下:
三、自己寫一個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新建專案很簡單的,三步操作,如下,第一步:
第二步,如下:
第三步,如下:
好了,這就是新建的springboot專案,只有一個controller埠,@RestController預設返回的是字串,如下:
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 節點也打一個映象,下面的nacos的例子會將映象推送到阿里雲,演示這種情況
執行效果:
四、部署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,如下:
nacos傳統方式部署在centos上面(我這裡是centos7),需要配置好jdk,如下:
啟動nacos,如下:
注意,如果是第二次啟動nacos,bin目錄下會多一些目錄和檔案,如 derby。log logs目錄 work目錄,如下:
win上登入nacos,chrome中輸入 192。168。100。150:8848 ,賬號密碼都是nacos/nacos,如下:
啟動nacos之後,然後idea本地啟動兩個服務,就被註冊到nacos上了,如下:
訪問 user 工程的 /user/test 介面,可以得到 nacos-server 上的 order 工程的詳細資訊,如下:
注意一下nacos-server的停止,如下:
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 。
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 看是否成功(注意阿里雲的映象倉庫需要設定為公開,才能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上的服務資訊
可以發現,註冊到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
結論
:如果服務都是在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容器上(親測可用),完成了。
天天打碼,天天進步!!