springboot項目部署到K8S

在這里插入圖片描述

java后臺
創建harbor鏡像拉取Secret:kubectl create secret docker-registry harbor-regcred \--docker-server= \ #harbor倉庫地址--docker-username= \  #harbor 賬號--docker-password= \ #harbor密碼-n productionDockerfile
FROM *harbor地址*/library/custom-jdk:1.8.0-alpineLABEL maintainer="Winter Lee"# 設置時區并安裝字體包
RUN apk add --no-cache tzdata fontconfig ttf-dejavu && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 創建目錄
RUN mkdir -p \/home/backend/jar_28888 \/home/backend/etc \/home/logs \/home/app/logs && \# 修改目錄權限chmod -R 777 /home/appWORKDIR /home# 使用 ARG 定義動態路徑
ARG JAR_PATH
COPY ${JAR_PATH} /home/backend/jar_28888/admin.jarVOLUME /app/logs
EXPOSE 28888# 添加無頭模式參數并優化JVM參數
ENTRYPOINT ["java", \"-Djava.awt.headless=true", \"-Xms512m", \"-Xmx2048m", \"-DLOG_PATH=/app/logs", \"-jar", \"/jono/backend/jar_28888/admin.jar"]JEKINS構建鏡像推送到harbor私服pipeline {agent anyparameters {gitParameter(name: 'TAG_NAME',type: 'PT_TAG',description: '選擇要構建的 Git 標簽',branch: 'test',tagFilter: '*',sortMode: 'DESCENDING',defaultValue: '')}environment {HARBOR_REG   = "harbor地址"PROJECT_NAME = "項目名稱"IMAGE_NAME   = "鏡像名稱"// 使用Harbor憑證(需先在Jenkins創建)HARBOR_CRED = credentials('de3f0156-4c04-445d-9621-2f966ba40f28')}stages {stage('Checkout Code') {steps {checkout([$class: 'GitSCM',branches: [[name: "refs/tags/${params.TAG_NAME}"]],extensions: [[$class: 'CloneOption', depth: 0, shallow: false]],userRemoteConfigs: [[url: '代碼倉庫地址',credentialsId: '代碼倉庫憑證',refspec: '+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*']]])}}stage('Maven Build') {steps {dir('.') {timeout(time: 15, unit: 'MINUTES') {sh 'mvn clean package -P sit'}sh 'ls -l target/admin.jar'}}}// 新增:準備鏡像標簽stage('Prepare Image Tag') {steps {script {// 清理標簽名(替換非法字符為橫杠,轉小寫)env.IMAGE_TAG = params.TAG_NAME.replaceAll(/[^a-zA-Z0-9\\.-]/, '-').toLowerCase()echo "使用鏡像標簽: ${env.IMAGE_TAG}"}}}stage('Docker Build') {steps {script {// 安全登錄Harborsh "echo ${HARBOR_CRED_PSW} | docker login -u ${HARBOR_CRED_USR} --password-stdin ${HARBOR_REG}"// 使用Git標簽名作為鏡像標簽sh """docker build \\--build-arg JAR_PATH=target/admin.jar \\-t ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG} \\-f env/sit/Dockerfile \\."""}}}stage('Push to Harbor') {steps {script {// 推送指定標簽的鏡像sh "docker push ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG}"}}}}post {always {script {// 清理本地鏡像sh "docker rmi ${HARBOR_REG}/${PROJECT_NAME}/${IMAGE_NAME}:${env.IMAGE_TAG} || true"sh "docker logout ${HARBOR_REG}"}cleanWs()}}
}K8s部署 yaml文件## admin-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: admin-productionnamespace: production  # 建議使用獨立命名空間labels:app: adminenv: production
spec:replicas: 2revisionHistoryLimit: 5 #進行滾動更新后,保留的歷史版本數strategy:type: RollingUpdaterollingUpdate:maxSurge: 25%       # 最大激增Pod數maxUnavailable: 25% # 最大不可用Pod數selector:matchLabels:app: adminenv: productiontemplate:metadata:labels:app: adminenv: productionspec:securityContext:    # 安全上下文runAsUser: 1000runAsGroup: 3000fsGroup: 2000containers:- name: adminimage: *代碼倉庫地址/項目名稱*/admin:44-sit-202505231400ports:- containerPort: 28888volumeMounts:- name: etc-volumemountPath: /home/backend/etcreadOnly: true  # 根據實際需求設置讀寫權限resources:        # 資源限制(根據實際需求調整)limits:cpu: "1"memory: 1Girequests:cpu: "0.5"memory: 512MilivenessProbe:    # 存活探針httpGet:path: /admin/captchaImageport: 28888initialDelaySeconds: 30periodSeconds: 10readinessProbe:   # 就緒探針httpGet:path: /admin/captchaImageport: 28888initialDelaySeconds: 20periodSeconds: 5volumes:- name: etc-volumehostPath:path: /tmp/etctype: DirectoryOrCreateimagePullSecrets:   # 鏡像拉取憑證(需提前創建)- name: harbor-regcredaffinity:           # 調度策略podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues: ["admin"]topologyKey: kubernetes.io/hostname
## admin-service.yaml 
apiVersion: v1
kind: Service
metadata:name: admin-servicenamespace: production
spec:type: NodePort         # 根據實際網絡架構選擇selector:app: adminenv: productionports:- protocol: TCPport: 28888targetPort: 28888nodePort: 31000滾動更新: 
只有修改了 deployment 配置文件中的 template 中的屬性后,才會觸發更新操作修改 nginx 版本號
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1kubectl set image deployment/admin-production *harbor地址*/*項目名稱*/admin=44-sit-202505231400或者通過 kubectl edit deployment/nginx-deployment 進行修改查看滾動更新的過程
kubectl rollout status deploy <deployment_name>查看部署描述,最后展示發生的事件列表也可以看到滾動更新過程
kubectl describe deploy <deployment_name>通過 kubectl get deployments 獲取部署信息,UP-TO-DATE 表示已經有多少副本達到了配置中要求的數目通過 kubectl get rs 可以看到增加了一個新的 rs通過 kubectl get pods 可以看到所有 pod 關聯的 rs 變成了新的回滾:
有時候你可能想回退一個Deployment,例如,當Deployment不穩定時,比如一直crash looping。默認情況下,kubernetes會在系統中保存前兩次的Deployment的rollout歷史記錄,以便你可以隨時會退(你可以修改revision history limit來更改保存的revision數)。案例:
更新 deployment 時參數不小心寫錯,如 nginx:1.9.1 寫成了 nginx:1.91
kubectl set image deployment/nginx-deploy nginx=nginx:1.91監控滾動升級狀態,由于鏡像名稱錯誤,下載鏡像失敗,因此更新過程會卡住
kubectl rollout status deployments nginx-deploy結束監聽后,獲取 rs 信息,我們可以看到新增的 rs 副本數是 2 個
kubectl get rs通過 kubectl get pods 獲取 pods 信息,我們可以看到關聯到新的 rs 的 pod,狀態處于 ImagePullBackOff 狀態為了修復這個問題,我們需要找到需要回退的 revision 進行回退
通過 kubectl rollout history deployment/nginx-deploy 可以獲取 revison 的列表通過 kubectl rollout history deployment/nginx-deploy --revision=2 可以查看詳細信息確認要回退的版本后,可以通過 kubectl rollout undo deployment/nginx-deploy 可以回退到上一個版本也可以回退到指定的 revision
kubectl rollout undo deployment/nginx-deploy --to-revision=2再次通過 kubectl get deployment 和 kubectl describe deployment 可以看到,我們的版本已經回退到對應的 revison 上了可以通過設置 .spec.revisonHistoryLimit 來指定 deployment 保留多少 revison,如果設置為 0,則不允許 deployment 回退了。發布新版本操作流程
1. 修改 YAML 文件
yaml
# deployment.yaml 示例片段
spec:template:spec:containers:- name: your-appimage: local.harbor.com/sw/sw-web:NEW_TAG  # 修改為新鏡像標簽ports:- containerPort: 8088
2. 應用新配置
bash
# 使用 kubectl apply 更新部署
kubectl apply -f deployment.yaml -n your-namespace# 觀察滾動更新進度(實時查看Pod重建過程)
kubectl rollout status deployment/your-deployment -n your-namespace
3. 驗證新版本
bash
# 查看當前Pod狀態
kubectl get pods -n your-namespace -l app=your-app-label# 檢查新版本日志
kubectl logs -f <new-pod-name> -n your-namespace# 執行健康檢查(替換為你的健康檢查路徑)
kubectl exec <new-pod-name> -n your-namespace -- curl -I http://localhost:8088/web/
二、回滾操作流程
方法一:使用 Kubernetes 內置回滾(推薦)
bash
# 1. 查看部署歷史版本
kubectl rollout history deployment/your-deployment -n your-namespace# 輸出示例
REVISION  CHANGE-CAUSE
1         Initial deployment
2         Update image to v1.2.3
3         Update image to v1.2.4  <--- 當前問題版本# 2. 回滾到指定版本
kubectl rollout undo deployment/your-deployment --to-revision=2 -n your-namespace# 3. 驗證回滾狀態
kubectl rollout status deployment/your-deployment -n your-namespace
方法二:通過舊版 YAML 文件回滾
bash
# 1. 檢出舊版本YAML文件(假設使用Git管理)
git checkout v1.2.3 -- deployment.yaml# 2. 應用舊配置
kubectl apply -f deployment.yaml -n your-namespace --force# 3. 確認回滾完成
kubectl get pods -n your-namespace -l app=your-app-label
三、最佳實踐建議
1. 版本追蹤策略
bash
# 每次修改YAML文件后提交Git(帶版本標簽)
git add deployment.yaml
git commit -m "Update to v1.2.4"
git tag v1.2.4
git push origin master --tags
2. 增強部署可靠性
yaml
# 在YAML中添加健康檢查
livenessProbe:httpGet:path: /healthzport: 8088initialDelaySeconds: 15periodSeconds: 20readinessProbe:httpGet:path: /readyport: 8088initialDelaySeconds: 5periodSeconds: 10
3. 自動記錄變更原因
bash
# 使用 kubectl 注解記錄變更信息
kubectl annotate deployment/your-deployment \kubernetes.io/change-cause="Update to v1.2.4 for feature X" \-n your-namespace --overwrite
4. 多環境驗證流程
bash
# 先發布到測試環境
kubectl apply -f deployment.yaml -n test-env# 運行自動化測試
curl -X POST http://your-ci-server/run-tests# 測試通過后發布生產
kubectl apply -f deployment.yaml -n prod-env
四、常見問題排查
1. 如果回滾失敗
bash
# 查看部署詳細狀態
kubectl describe deployment/your-deployment -n your-namespace# 檢查事件日志
kubectl get events -n your-namespace --sort-by=.metadata.creationTimestamp
2. 保留歷史版本數量控制
yaml
# 在YAML中配置 revisionHistoryLimit
spec:revisionHistoryLimit: 5  # 保留最近5個版本更新版本的時候可以添加 --record記錄操作內容
[root@k8s-master ~]#  kubectl set image deployment/web-production -n production web=web:v20250523_1.0.0 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/web-production image updated
[root@k8s-master ~]# kubectl rollout history deployment/web-production -n production
deployment.apps/web-production 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=true查看對應revision的更新內容
kubectl rollout history deployment/web-production -n production --revision=2
deployment.apps/web-production with revision #2
Pod Template:Labels:       app=webenv=productionpod-template-hash=764cdbc6c4Annotations:  kubernetes.io/change-cause: kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=trueContainers:web:Image:      web:v20250523_1.0.0Port:       8088/TCPHost Port:  0/TCPLimits:cpu:      200mmemory:   1GiRequests:cpu:      100mmemory:   512MiEnvironment:        <none>Mounts:     <none>Volumes:      <none>版本回退操作 
回退到revision 為1的版本
[root@k8s-master ~]# kubectl rollout undo deployment/web-production -n production --to-revision=1
deployment.apps/web-production rolled back
[root@k8s-master ~]# kubectl rollout history deployment/web-production -n production
deployment.apps/web-production 
REVISION  CHANGE-CAUSE
2         kubectl set image deployment/web-production web=web:v20250523_1.0.0 --namespace=production --record=true
3         <none>
查看回滾進度
kubectl rollout status deployment/web-production -n production擴容縮容
kubectl scale --replicas=5 deployment web-production -n production  通過修改replicas的值完成擴容和縮容 暫停和恢復
kubectl rollout pause deploy web-production -n production
kubectl rollout resume deploy web-production -n production

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89365.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【FPGA開發】一文輕松入門Modelsim的基本操作

Modelsim仿真的步驟 &#xff08;1&#xff09;創建新的工程。 &#xff08;2&#xff09;在彈出的窗口中&#xff0c;確定項目名和工作路徑&#xff0c;庫保持為work不變(如有需要可以根據需求進行更改)。 &#xff08;3&#xff09;添加已經存在的文件&#xff08;rtl代碼和t…

服務攻防-Java組件安全FastJson高版本JNDI不出網C3P0編碼繞WAF寫入文件CI鏈

服務攻防-Java組件安全&FastJson&高版本JNDI&不出網C3P0&編碼繞WAF&寫入文件CI鏈26天 原創 朝陽 Sec朝陽 2025年07月18日 09:23 湖北 標題已修改 演示環境&#xff1a; https://github.com/lemono0/FastJsonParty FastJson全版本Docker漏洞環境(涵蓋1.…

【Python】DRF核心組件詳解:Mixin與Generic視圖

在 Django REST Framework (DRF) 中&#xff0c;mixins.CreateModelMixin、mixins.ListModelMixin、GenericAPIView 和 GenericViewSet 是構建 API 視圖的核心組件。以下是對這些組件的主要方法及其職責的簡要說明&#xff0c;內容清晰且結構化&#xff1a;1. mixins.CreateMod…

HTML+CSS+JS基礎

文章目錄&#xff08;一&#xff09;html1.常見標簽&#xff08;1&#xff09;注釋&#xff08;2&#xff09;標題 h1~h6&#xff08;3&#xff09;段落 p&#xff08;4&#xff09;換行與空格 br \ &#xff08;5&#xff09;格式化標簽 b i s u&#xff08;6&#xff09;…

Vue導出Html為Word中包含圖片在Microsoft Word顯示異常問題

問題背景 碰到一個問題&#xff1a;將包含圖片和SVG數學公式的HTML內容導出為Word文檔時&#xff0c;將圖片都轉為ase64格式導出&#xff0c;在WPS Word中顯示正常&#xff0c;但是在Microsoft Word中出現圖片示異常。具體問題表現 WPS兼容性&#xff1a;在WPS中顯示正常&#…

橢圓曲線密碼學 Elliptic Curve Cryptography

密碼學是研究在存在對抗行為的情況下還能安全通信的技術。即算法加密信息&#xff0c;再算法解密出信息。加密分為兩類 1. Symmetric-key Encryption (secret key encryption) 即一種密鑰&#xff0c;加密和解密使用同一密鑰&#xff0c;可相互轉換 2. Asymmetric-key Encry…

wedo牛-----第47節(免費分享圖紙)

夸克網盤&#xff1a;https://pan.quark.cn/s/4b40a8d18979 高清圖紙源文件&#xff0c;需要的請自取

Unity | AmplifyShaderEditor插件基礎(第十集:噪聲的種類+火焰制作-下)

目錄 一、&#x1f44b;&#x1f3fb;前言 二、圓火焰 三、制作梯度 梯度成品預覽 1.GradientSample節點 2.gradient的用法 3.time節點 四、添加顏色 Color節點 五、火焰搖擺 1.X方向的移動 2.Y方向的移動 3.Z方向的移動 4.把xyz組合起來 Panner節點 六、擺放和…

黑馬Node.js全套入門教程,nodejs新教程含es6模塊化+npm+express+webpack+promise等_ts對象筆記

1.1 什么是運行環境&#xff1f; 運行環境是指代碼正常運行所需的必要環境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; V8引擎負責解析和執行JavaScript代碼。內置API是由運行環境提供的特殊接口&#xff0c;只能在所屬的運行環境中被調用 1.2 JavaScrip…

React 項目環境變量使用指南

在 React 項目中正確使用環境變量是管理不同環境配置的關鍵技術。以下是完整的解決方案&#xff1a; 1. 創建環境變量文件 React 項目支持以下環境變量文件&#xff08;按優先級從高到低&#xff09;&#xff1a; .env.development.local (本地開發環境).env.development (開發…

Oracle 關于一些連接故障的總結

積累了幾次Oracle客戶端連接故障&#xff0c;做下總結。 文章目錄1、案例案例1&#xff1a;客戶端連接報錯ORA-12514案例2&#xff1a;客戶端連接報錯ORA-28547案例3&#xff1a;客戶端連接報錯&#xff1a;Got minus one from a read call案例4&#xff1a;客戶端連接報錯&…

V-USB USB設備模擬原理分析

V-USB USB設備模擬原理分析 通過分析V-USB項目的核心文件&#xff0c;詳細解釋這個項目是如何在AVR微控制器上模擬USB設備的&#xff1a; 1. 整體架構 V-USB是一個純軟件實現的USB低速設備驅動&#xff0c;主要由以下幾個核心文件組成&#xff1a; usbdrv.c : USB協議棧的C語言…

kafka3.6下載安裝(傳統架構/KRaft模式)+實例測試

知識補充&#xff1a; Kafka 和 ZooKeeper 的關系可以用 “協作依賴” 來概括。在 Kafka 的早期版本&#xff08;Kafka 2.8.0 之前&#xff09;中&#xff0c;ZooKeeper 是 Kafka 的核心依賴&#xff0c;用于管理集群元數據、協調 Broker 和 Controller 選舉等關鍵功能。但從 …

華控智能產品特點——產品生態全景與場景化創新

公司構建 “3X”產品戰略&#xff0c;以三大核心場景為基礎持續拓展技術外延&#xff1a; 1. 智能安防產品線軍工級指紋槍盒&#xff1a;采用6061-T6航空鋁材&#xff0c;內嵌震動報警模塊&#xff0c;非法開箱觸發90dB警鳴。為軍工企業定制的雙人認證版本需兩位授權人員同時驗…

爬蟲核心原理與入門技巧分析

一、爬蟲核心原理&#xff1a;模擬人類瀏覽的“自動化工具” 簡單來說&#xff0c;網絡爬蟲&#xff08;Web Crawler&#xff09;是一種按照一定規則&#xff0c;自動抓取互聯網信息的程序或腳本。其核心原理可以類比人類瀏覽網頁的過程&#xff0c;只不過將手動操作轉化為了代…

spring-cloud微服務部署-feign服務間調用

1 準備工作 需要安裝并啟動nacos&#xff0c;作為服務注冊中心。地址&#xff1a;https://nacos.io/ 2 項目結構 parent的pom.xml聲明依賴&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</gr…

IDEA高效開發:Database Navigator插件安裝與核心使用指南

目錄 1.前言 2.正文 2.1安裝流程 2.1.1IDE內部安裝 2.1.2手動下載安裝 ?? 避坑指南 2.2使用教程 2.2.1連接數據庫 2.2.2查看數據庫/表 2.2.3查詢數據 2.2.4修改表結構 2.2.5生成代碼 2.2.6常見故障排除 3.小結 1.前言 “作為Java開發者&#xff0c;日常與數據…

Maven私服倉庫,發布jar到私服倉庫,依賴的版本號如何設置,規范是什么

Maven私服倉庫&#xff0c;發布jar到私服倉庫&#xff0c;依賴的版本號如何設置&#xff0c;規范是什么

量子卷積神經網絡:量子計算與深度學習的融合革命

引言&#xff1a;當卷積神經網絡遇上量子計算在人工智能與量子計算雙重浪潮的交匯處&#xff0c;量子卷積神經網絡&#xff08;Quantum Convolutional Neural Network, QCNN&#xff09;正成為突破經典算力瓶頸的關鍵技術。傳統卷積神經網絡&#xff08;CNN&#xff09;在圖像識…

線程(三) linux 同步

目錄 概念補充 條件變量 操作 例:多線程搶票 封裝 生產者消費者模型 生產者和消費者之間的關系 BlockQueue(阻塞隊列) 單生產單消費 信號量 簡介 操作 多生產者多消費者RingQueue(環形隊列)代碼 sem封裝 信號量與鎖 小知識 概念補充 同步:在保證數據安全的前…