<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java專案在開發偵錯的過程中都需要進行各種環境的安裝部署,在之前我們使用虛擬機器器部署時都是通過在機器上執行命令或者設定
Jekins指令碼
自動化部署。但在容器環境下進行高可用的進行專案的安裝部署就需要使用容器化技術跟k8s
的排程執行了。
一般在正式環境下我們都會有以下幾部分構成容器化部署:
但是組成這麼一整套的資源比較大,不利於個人安裝學習。所以本文就介紹在只有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-8bh5q
檢視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中的實現的文章就介紹到這了,更多相關java部署到k8s內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45