中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何部署java項目到k8s中

發布時間:2022-08-08 11:21:19 來源:億速云 閱讀:311 作者:iii 欄目:開發技術

這篇文章主要介紹“如何部署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項目到容器環境中。

    1. 生成Demo項目

    生成一個java的Demo項目,在本機進行啟動測試能訪問web頁面即可,如下圖

    如何部署java項目到k8s中

    目錄結構

    如何部署java項目到k8s中

    2. 配置Docker環境

    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文件就需要打包鏡像到容器集群中,由于沒有鏡像倉庫所以我們打包需要在所有的容器節點中進行打包,否則在調度過程中如果調度到沒有打包鏡像的節點則拉取不到鏡像就會如下圖無法啟動完成。

    如何部署java項目到k8s中

    如何部署java項目到k8s中

    demo項目打好的jar包Dockerfile文件上傳到容器集群的所有節點上,然后執行以下命令:

    docker image build -t an/demo_server:v1.0.0 .

    an/demo_server就是要打包的容器鏡像名稱,我們下面的配置k8s也是以此名稱來找鏡像進行調度的。

    使用docker images命令查看是否存在鏡像

    如何部署java項目到k8s中

    3. 配置k8s

    3.1 編寫deploy.yaml文件

    這個文件是給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代表了對外映射的端口號,實際訪問就是這個端口

    最下面的目錄有參數詳解,可以參考,這里簡單解釋一下

    3.2 啟動調度

    將文件上傳到k8s的master節點上執行以下命令進行調度

    kubectl apply -f deploy.yaml

    4. 驗證

    4.1 查看pod

    先執行命令:

    kubectl get all或kubectl get node

    如下圖我們的demo-server已經啟動了,但是如何訪問成了一個問題

    如何部署java項目到k8s中

    4.2 訪問系統

    4.2.1 集群外部訪問

    集群外部訪問沒有做負載的情況下需要先看容器分配到了那個節點上,在可視化系統里查看容器組的分配情況

    如何部署java項目到k8s中

    系統里看到k8s將這個系統調度到了node2節點,使用node2節點ip+端口,我們配的對外映射端口為31001,那訪問地址就是:http://外部ip:31001,訪問如下圖則驗證成功

    如何部署java項目到k8s中

    4.2.2 集群內部訪問

    如果在集群內部訪問有兩種方式

    通過CLUSTER-IP:port訪問
    使用命令kubectl get all可以查看到service的CLUSTER-IP

    如何部署java項目到k8s中

    通過pod Ip:port訪問
    使用命令:kubectl get pods得到podname

    如何部署java項目到k8s中

    再使用命令:kubectl describe pod demo-server-8b47bd6b6-8bh6q查看pod詳情里的pod IP

    如何部署java項目到k8s中

    5. k8s配置文件參數詳解

    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中”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    康定县| 延吉市| 鹿邑县| 屏山县| 佛教| 阿勒泰市| 买车| 万盛区| 福州市| 嘉定区| 开化县| 石柱| 兴业县| 成安县| 万盛区| 体育| 宁化县| 四川省| 育儿| 漠河县| 巴塘县| 九寨沟县| 鄂托克旗| 绥滨县| 新巴尔虎左旗| 洪洞县| 溧水县| 太仓市| 卓资县| 北票市| 西丰县| 翁牛特旗| 苗栗县| 金川县| 平江县| 丰城市| 丰镇市| 石屏县| 江都市| 金塔县| 南安市|