手動部署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頁面即可,如下圖
目錄結構
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
文件就需要打包鏡像到容器集群中,由於沒有鏡像倉庫所以我們打包需要在所有的容器節點中進行打包,否則在調度過程中如果調度到沒有打包鏡像的節點則拉取不到鏡像就會如下圖無法啟動完成。
將demo項目
打好的jar包
和Dockerfile文件
上傳到容器集群的所有節點上,然後執行以下命令:
docker image build -t an/demo_server:v1.0.0 .
an/demo_server
就是要打包的容器鏡像名稱,我們下面的配置k8s
也是以此名稱來找鏡像進行調度的。
使用docker images
命令查看是否存在鏡像
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已經啟動瞭,但是如何訪問成瞭一個問題
4.2 訪問系統
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
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中的實現的文章就介紹到這瞭,更多相關java部署到k8s內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解k8s ConfigMap 中 subPath 字段和 items 字段
- kubernetes之statefulset搭建MySQL集群
- Kubernetes k8s configmap 容器技術解析
- K8S 中 kubectl 命令詳解
- k8s中pod使用詳解(雲原生kubernetes)