您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何部署java項目到k8s中”,在日常操作中,相信很多人在如何部署java項目到k8s中問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何部署java項目到k8s中”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Java項目在開發調試的過程中都需要進行各種環境的安裝部署,在之前我們使用虛擬機部署時都是通過在機器上執行命令或者配置
Jekins腳本
自動化部署。但在容器環境下進行高可用的進行項目的安裝部署就需要使用容器化技術跟k8s
的調度執行了。
一般在正式環境下我們都會有以下幾部分構成容器化部署:
容器環境
docker
Containerd
k8s集群
k8s管理系統
KubeSohere
dashboard(k8s自帶的管理系統)
鏡像倉庫
Docker hub
registry
harbor
代碼倉庫
github
gitlab
發布平臺
Jekins
Devops
負載
F5
nginx
Ingress
但是組成這么一整套的資源比較大,不利于個人安裝學習。所以本文就介紹在只有k8s集群
的環境下部署java項目
到容器環境中。
生成一個java的Demo項目,在本機進行啟動測試能訪問web頁面即可,如下圖
目錄結構
2.1 編寫Dockerfile文件
在上面的目錄結構圖里的file文件夾
中有一個Dockerfile文件
,代碼如下
#基礎鏡像 java打包需要依賴jdk FROM java:8 #將虛擬機的war包,cp到docker容器內部 COPY demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar #容器開放的端口 EXPOSE 8081 #指定docker容器時區 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Beijing' >/etc/timezone # 腳本啟動 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"]
如果項目設置了分環境注意修改ENTRYPOINT
參數里的-Dspring.profiles.active=prod
進行修改
2.2 打包鏡像
配置好Dockerfile
文件就需要打包鏡像到容器集群中,由于沒有鏡像倉庫所以我們打包需要在所有的容器節點中進行打包,否則在調度過程中如果調度到沒有打包鏡像的節點則拉取不到鏡像就會如下圖無法啟動完成。
將demo項目
打好的jar包
和Dockerfile文件
上傳到容器集群的所有節點上,然后執行以下命令:
docker image build -t an/demo_server:v1.0.0 .
an/demo_server
就是要打包的容器鏡像名稱,我們下面的配置k8s
也是以此名稱來找鏡像進行調度的。
使用docker images
命令查看是否存在鏡像
這個文件是給k8s調度
使用的,里面配置了需要調度使用的實例數量
、版本
、端口號
、對外端口號
、對外協議
等等等等,配置如下
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參數
代表了調度的容器數量,目前是1個實例nodePort
代表了對外映射的端口號,實際訪問就是這個端口
最下面的目錄有參數詳解,可以參考,這里簡單解釋一下
將文件上傳到k8s的master節點上執行以下命令進行調度
kubectl apply -f deploy.yaml
先執行命令:
kubectl get all或kubectl get node
如下圖我們的demo-server已經啟動了,但是如何訪問成了一個問題
4.2.1 集群外部訪問
集群外部訪問沒有做負載的情況下需要先看容器分配
到了那個節點上,在可視化系統里查看容器組的分配情況
系統里看到k8s將這個系統調度到了node2節點,使用node2節點ip+端口,我們配的對外映射端口為31001,那訪問地址就是:http://外部ip:31001
,訪問如下圖則驗證成功
4.2.2 集群內部訪問
如果在集群內部訪問有兩種方式
通過CLUSTER-IP
:port
訪問
使用命令kubectl get all
可以查看到service的CLUSTER-IP
通過pod Ip
:port
訪問
使用命令:kubectl get pods
得到podname
再使用命令:kubectl describe pod demo-server-8b47bd6b6-8bh6q
查看pod詳情里的pod IP
apiVersion: v1 # 【必須】版本號 kind: Pod # 【必選】Pod metadata: # 【必選-Object】元數據 name: String # 【必選】 Pod的名稱 namespace: String # 【必選】 Pod所屬的命名空間 labels: # 【List】 自定義標簽列表 - name: String annotations: # 【List】 自定義注解列表 - name: String spec: # 【必選-Object】 Pod中容器的詳細定義 containers: # 【必選-List】 Pod中容器的詳細定義 - name: String # 【必選】 容器的名稱 image: String # 【必選】 容器的鏡像名稱 imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都嘗試重新拉取鏡像 | 僅使用本地鏡像 | 如果本地有鏡像則使用,沒有則拉取 command: [String] # 【List】 容器的啟動命令列表,如果不指定,則使用鏡像打包時使用的啟動命令 args: [String] # 【List】 容器的啟動命令參數列表 workingDir: String # 容器的工作目錄 volumeMounts: # 【List】 掛載到容器內部的存儲卷配置 - name: String # 引用Pod定義的共享存儲卷的名稱,需使用volumes[]部分定義的共享存儲卷名稱 mountPath: Sting # 存儲卷在容器內mount的絕對路徑,應少于512個字符 readOnly: Boolean # 是否為只讀模式,默認為讀寫模式 ports: # 【List】 容器需要暴露的端口號列表 - name: String # 端口的名稱 containerPort: Int # 容器需要監聽的端口號 hostPort: Int # 容器所在主機需要監聽的端口號,默認與containerPort相同。設置hostPort時,同一臺宿主機將無法啟動該容器的第二份副本 protocol: String # 端口協議,支持TCP和UDP,默認值為TCP env: # 【List】 容器運行前需設置的環境變量列表 - name: String # 環境變量的名稱 value: String # 環境變量的值 resources: # 【Object】 資源限制和資源請求的設置 limits: # 【Object】 資源限制的設置 cpu: String # CPU限制,單位為core數,將用于docker run --cpu-shares參數 memory: String # 內存限制,單位可以為MB,GB等,將用于docker run --memory參數 requests: # 【Object】 資源限制的設置 cpu: String # cpu請求,單位為core數,容器啟動的初始可用數量 memory: String # 內存請求,單位可以為MB,GB等,容器啟動的初始可用數量 livenessProbe: # 【Object】 對Pod內各容器健康檢查的設置,當探測無響應幾次之后,系統將自動重啟該容器。可以設置的方法包括:exec、httpGet和tcpSocket。對一個容器只需要設置一種健康檢查的方法 exec: # 【Object】 對Pod內各容器健康檢查的設置,exec方式 command: [String] # exec方式需要指定的命令或者腳本 httpGet: # 【Object】 對Pod內各容器健康檢查的設置,HTTGet方式。需要指定path、port path: String port: Number host: String scheme: String httpHeaders: - name: String value: String tcpSocket: # 【Object】 對Pod內各容器健康檢查的設置,tcpSocket方式 port: Number initialDelaySeconds: Number # 容器啟動完成后首次探測的時間,單位為s timeoutSeconds: Number # 對容器健康檢查的探測等待響應的超時時間設置,單位為s,默認值為1s。若超過該超時時間設置,則將認為該容器不健康,會重啟該容器。 periodSeconds: Number # 對容器健康檢查的定期探測時間設置,單位為s,默認10s探測一次 successThreshold: 0 failureThreshold: 0 securityContext: privileged: Boolean restartPolicy: [Always | Never | OnFailure] # Pod的重啟策略 一旦終止運行,都將重啟 | 終止后kubelet將報告給master,不會重啟 | 只有Pod以非零退出碼終止時,kubelet才會重啟該容器。如果容器正常終止(退出碼為0),則不會重啟。 nodeSelector: object # 設置Node的Label,以key:value格式指定,Pod將被調度到具有這些Label的Node上 imagePullSecrets: # 【Object】 pull鏡像時使用的Secret名稱,以name:secretkey格式指定 - name: String hostNetwork: Boolean # 是否使用主機網絡模式,默認值為false。設置為true表示容器使用宿主機網絡,不再使用docker網橋,該Pod將無法在同一臺宿主機上啟動第二個副本 volumes: # 【List】 在該Pod上定義的共享存儲卷列表 - name: String # 共享存儲卷的名稱,volume的類型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap emptyDir: {} # 【Object】 類型為emptyDir的存儲卷,表示與Pod同生命周期的一個臨時目錄,其值為一個空對象:emptyDir: {} hostPath: # 【Object】 類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄 path: String # Pod所在主機的目錄,將被用于容器中mount的目錄 secret: # 【Object】類型為secret的存儲卷,表示掛載集群預定義的secret對象到容器內部 secretName: String items: - key: String path: String configMap: # 【Object】 類型為configMap的存儲卷,表示掛載集群預定義的configMap對象到容器內部 name: String items: - key: String path: String
到此,關于“如何部署java項目到k8s中”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。