手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)
前言
Java項(xiàng)目在開發(fā)調(diào)試的過程中都需要進(jìn)行各種環(huán)境的安裝部署,在之前我們使用虛擬機(jī)部署時(shí)都是通過在機(jī)器上執(zhí)行命令或者配置
Jekins腳本
自動(dòng)化部署。但在容器環(huán)境下進(jìn)行高可用的進(jìn)行項(xiàng)目的安裝部署就需要使用容器化技術(shù)跟k8s
的調(diào)度執(zhí)行了。
一般在正式環(huán)境下我們都會(huì)有以下幾部分構(gòu)成容器化部署:
- 容器環(huán)境
- docker
- Containerd
- k8s集群
- k8s管理系統(tǒng)
- KubeSohere
- dashboard(k8s自帶的管理系統(tǒng))
- 鏡像倉(cāng)庫(kù)
- Docker hub
- registry
- harbor
- 代碼倉(cāng)庫(kù)
- github
- gitlab
- 發(fā)布平臺(tái)
- Jekins
- Devops
- 負(fù)載
- F5
- nginx
- Ingress
但是組成這么一整套的資源比較大,不利于個(gè)人安裝學(xué)習(xí)。所以本文就介紹在只有k8s集群
的環(huán)境下部署java項(xiàng)目
到容器環(huán)境中。
1. 生成Demo項(xiàng)目
生成一個(gè)java的Demo項(xiàng)目,在本機(jī)進(jìn)行啟動(dòng)測(cè)試能訪問web頁(yè)面即可,如下圖
目錄結(jié)構(gòu)
2. 配置Docker環(huán)境
2.1 編寫Dockerfile文件
在上面的目錄結(jié)構(gòu)圖里的file文件夾
中有一個(gè)Dockerfile文件
,代碼如下
#基礎(chǔ)鏡像 java打包需要依賴jdk FROM java:8 #將虛擬機(jī)的war包,cp到docker容器內(nèi)部 COPY demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar #容器開放的端口 EXPOSE 8081 #指定docker容器時(shí)區(qū) RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Beijing' >/etc/timezone # 腳本啟動(dòng) ENTRYPOINT ["sh","-c","java -server -Dfile.encoding=utf-8 -Xms1024m -Xms1536m -jar -Dserver.port=8081 -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar"]
如果項(xiàng)目設(shè)置了分環(huán)境注意修改ENTRYPOINT
參數(shù)里的-Dspring.profiles.active=prod
進(jìn)行修改
2.2 打包鏡像
配置好Dockerfile
文件就需要打包鏡像到容器集群中,由于沒有鏡像倉(cāng)庫(kù)所以我們打包需要在所有的容器節(jié)點(diǎn)中進(jìn)行打包,否則在調(diào)度過程中如果調(diào)度到?jīng)]有打包鏡像的節(jié)點(diǎn)則拉取不到鏡像就會(huì)如下圖無法啟動(dòng)完成。
將demo項(xiàng)目
打好的jar包
和Dockerfile文件
上傳到容器集群的所有節(jié)點(diǎn)上,然后執(zhí)行以下命令:
docker image build -t an/demo_server:v1.0.0 .
an/demo_server
就是要打包的容器鏡像名稱,我們下面的配置k8s
也是以此名稱來找鏡像進(jìn)行調(diào)度的。
使用docker images
命令查看是否存在鏡像
3. 配置k8s
3.1 編寫deploy.yaml文件
這個(gè)文件是給k8s調(diào)度
使用的,里面配置了需要調(diào)度使用的實(shí)例數(shù)量
、版本
、端口號(hào)
、對(duì)外端口號(hào)
、對(duì)外協(xié)議
等等等等,配置如下
apiVersion: apps/v1 kind: Deployment metadata: name: demo-server spec: replicas: 1 selector: matchLabels: app: demo-server template: metadata: labels: app: demo-server spec: containers: - name: demo-server image: an/demo_server:v1.0.0 ports: - containerPort: 8081 --- apiVersion: v1 kind: Service metadata: name: demo-server spec: selector: app: demo-server ports: - protocol: TCP port: 8081 targetPort: 8081 nodePort: 31001 type: NodePort
replicas參數(shù)
代表了調(diào)度的容器數(shù)量,目前是1個(gè)實(shí)例nodePort
代表了對(duì)外映射的端口號(hào),實(shí)際訪問就是這個(gè)端口
最下面的目錄有參數(shù)詳解,可以參考,這里簡(jiǎn)單解釋一下
3.2 啟動(dòng)調(diào)度
將文件上傳到k8s的master節(jié)點(diǎn)上執(zhí)行以下命令進(jìn)行調(diào)度
kubectl apply -f deploy.yaml
4. 驗(yàn)證
4.1 查看pod
先執(zhí)行命令:
kubectl get all或kubectl get node
如下圖我們的demo-server已經(jīng)啟動(dòng)了,但是如何訪問成了一個(gè)問題
4.2 訪問系統(tǒng)
4.2.1 集群外部訪問
集群外部訪問沒有做負(fù)載的情況下需要先看容器分配
到了那個(gè)節(jié)點(diǎn)上,在可視化系統(tǒng)里查看容器組的分配情況
系統(tǒng)里看到k8s將這個(gè)系統(tǒng)調(diào)度到了node2節(jié)點(diǎn),使用node2節(jié)點(diǎn)ip+端口,我們配的對(duì)外映射端口為31001,那訪問地址就是:http://外部ip:31001
,訪問如下圖則驗(yàn)證成功
4.2.2 集群內(nèi)部訪問
如果在集群內(nèi)部訪問有兩種方式
通過CLUSTER-IP
:port
訪問
使用命令kubectl get all
可以查看到service的CLUSTER-IP
通過pod Ip
:port
訪問
使用命令:kubectl get pods
得到podname
再使用命令:kubectl describe pod demo-server-8b47bd6b6-8bh5q
查看pod詳情里的pod IP
5. k8s配置文件參數(shù)詳解
apiVersion: v1 # 【必須】版本號(hào) kind: Pod # 【必選】Pod metadata: # 【必選-Object】元數(shù)據(jù) name: String # 【必選】 Pod的名稱 namespace: String # 【必選】 Pod所屬的命名空間 labels: # 【List】 自定義標(biāo)簽列表 - name: String annotations: # 【List】 自定義注解列表 - name: String spec: # 【必選-Object】 Pod中容器的詳細(xì)定義 containers: # 【必選-List】 Pod中容器的詳細(xì)定義 - name: String # 【必選】 容器的名稱 image: String # 【必選】 容器的鏡像名稱 imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都嘗試重新拉取鏡像 | 僅使用本地鏡像 | 如果本地有鏡像則使用,沒有則拉取 command: [String] # 【List】 容器的啟動(dòng)命令列表,如果不指定,則使用鏡像打包時(shí)使用的啟動(dòng)命令 args: [String] # 【List】 容器的啟動(dòng)命令參數(shù)列表 workingDir: String # 容器的工作目錄 volumeMounts: # 【List】 掛載到容器內(nèi)部的存儲(chǔ)卷配置 - name: String # 引用Pod定義的共享存儲(chǔ)卷的名稱,需使用volumes[]部分定義的共享存儲(chǔ)卷名稱 mountPath: Sting # 存儲(chǔ)卷在容器內(nèi)mount的絕對(duì)路徑,應(yīng)少于512個(gè)字符 readOnly: Boolean # 是否為只讀模式,默認(rèn)為讀寫模式 ports: # 【List】 容器需要暴露的端口號(hào)列表 - name: String # 端口的名稱 containerPort: Int # 容器需要監(jiān)聽的端口號(hào) hostPort: Int # 容器所在主機(jī)需要監(jiān)聽的端口號(hào),默認(rèn)與containerPort相同。設(shè)置hostPort時(shí),同一臺(tái)宿主機(jī)將無法啟動(dòng)該容器的第二份副本 protocol: String # 端口協(xié)議,支持TCP和UDP,默認(rèn)值為TCP env: # 【List】 容器運(yùn)行前需設(shè)置的環(huán)境變量列表 - name: String # 環(huán)境變量的名稱 value: String # 環(huán)境變量的值 resources: # 【Object】 資源限制和資源請(qǐng)求的設(shè)置 limits: # 【Object】 資源限制的設(shè)置 cpu: String # CPU限制,單位為core數(shù),將用于docker run --cpu-shares參數(shù) memory: String # 內(nèi)存限制,單位可以為MB,GB等,將用于docker run --memory參數(shù) requests: # 【Object】 資源限制的設(shè)置 cpu: String # cpu請(qǐng)求,單位為core數(shù),容器啟動(dòng)的初始可用數(shù)量 memory: String # 內(nèi)存請(qǐng)求,單位可以為MB,GB等,容器啟動(dòng)的初始可用數(shù)量 livenessProbe: # 【Object】 對(duì)Pod內(nèi)各容器健康檢查的設(shè)置,當(dāng)探測(cè)無響應(yīng)幾次之后,系統(tǒng)將自動(dòng)重啟該容器??梢栽O(shè)置的方法包括:exec、httpGet和tcpSocket。對(duì)一個(gè)容器只需要設(shè)置一種健康檢查的方法 exec: # 【Object】 對(duì)Pod內(nèi)各容器健康檢查的設(shè)置,exec方式 command: [String] # exec方式需要指定的命令或者腳本 httpGet: # 【Object】 對(duì)Pod內(nèi)各容器健康檢查的設(shè)置,HTTGet方式。需要指定path、port path: String port: Number host: String scheme: String httpHeaders: - name: String value: String tcpSocket: # 【Object】 對(duì)Pod內(nèi)各容器健康檢查的設(shè)置,tcpSocket方式 port: Number initialDelaySeconds: Number # 容器啟動(dòng)完成后首次探測(cè)的時(shí)間,單位為s timeoutSeconds: Number # 對(duì)容器健康檢查的探測(cè)等待響應(yīng)的超時(shí)時(shí)間設(shè)置,單位為s,默認(rèn)值為1s。若超過該超時(shí)時(shí)間設(shè)置,則將認(rèn)為該容器不健康,會(huì)重啟該容器。 periodSeconds: Number # 對(duì)容器健康檢查的定期探測(cè)時(shí)間設(shè)置,單位為s,默認(rèn)10s探測(cè)一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: Boolean restartPolicy: [Always | Never | OnFailure] # Pod的重啟策略 一旦終止運(yùn)行,都將重啟 | 終止后kubelet將報(bào)告給master,不會(huì)重啟 | 只有Pod以非零退出碼終止時(shí),kubelet才會(huì)重啟該容器。如果容器正常終止(退出碼為0),則不會(huì)重啟。 nodeSelector: object # 設(shè)置Node的Label,以key:value格式指定,Pod將被調(diào)度到具有這些Label的Node上 imagePullSecrets: # 【Object】 pull鏡像時(shí)使用的Secret名稱,以name:secretkey格式指定 - name: String hostNetwork: Boolean # 是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)值為false。設(shè)置為true表示容器使用宿主機(jī)網(wǎng)絡(luò),不再使用docker網(wǎng)橋,該P(yáng)od將無法在同一臺(tái)宿主機(jī)上啟動(dòng)第二個(gè)副本 volumes: # 【List】 在該P(yáng)od上定義的共享存儲(chǔ)卷列表 - name: String # 共享存儲(chǔ)卷的名稱,volume的類型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap emptyDir: {} # 【Object】 類型為emptyDir的存儲(chǔ)卷,表示與Pod同生命周期的一個(gè)臨時(shí)目錄,其值為一個(gè)空對(duì)象:emptyDir: {} hostPath: # 【Object】 類型為hostPath的存儲(chǔ)卷,表示掛載Pod所在宿主機(jī)的目錄 path: String # Pod所在主機(jī)的目錄,將被用于容器中mount的目錄 secret: # 【Object】類型為secret的存儲(chǔ)卷,表示掛載集群預(yù)定義的secret對(duì)象到容器內(nèi)部 secretName: String items: - key: String path: String configMap: # 【Object】 類型為configMap的存儲(chǔ)卷,表示掛載集群預(yù)定義的configMap對(duì)象到容器內(nèi)部 name: String items: - key: String path: String
到此這篇關(guān)于手動(dòng)部署java項(xiàng)目到k8s中的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java部署到k8s內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot2.3 整合mybatis-plus 高級(jí)功能(圖文詳解)
這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot如何監(jiān)控Redis中某個(gè)Key的變化(自定義監(jiān)聽器)
這篇文章主要介紹了SpringBoot如何監(jiān)控Redis中某個(gè)Key的變化(自定義監(jiān)聽器),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java泛型T,E,K,V,N,?與Object區(qū)別和含義
Java?泛型(generics)是?JDK?5?中引入的一個(gè)新特性,?泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。本文將詳細(xì)講講Java泛型T、E、K、V、N、?和Object區(qū)別和含義,需要發(fā)可以參考一下2022-03-03IDEA連接遠(yuǎn)程服務(wù)器簡(jiǎn)化部署流程
筆者每次上線部署應(yīng)用,都要使用第三方的客戶端連接工具,比如?Xshell,FinalShell,Terminus?等,基本的流程步驟及其繁瑣,基于這個(gè)原因,筆者今天探索通過?IDEA?連接遠(yuǎn)程服務(wù)器并上傳文件,減少繁瑣的部署步驟,需要的朋友可以參考下2024-01-01詳解使用MyBatis Generator自動(dòng)創(chuàng)建代碼
這篇文章主要介紹了使用MyBatis Generator自動(dòng)創(chuàng)建代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12SpringBoot @CompentScan excludeFilters配置無效的解決方案
這篇文章主要介紹了SpringBoot @CompentScan excludeFilters配置無效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11