云原生核心技術 (12/12): 終章:使用 GitLab CI 將應用自動部署到 K8s (保姆級教程)

大家好,歡迎來到《云原生核心技術》系列的最終章!

我們一起走過了漫長而充實的旅程。從 Docker 的集裝箱,到 K8s 這座自動化的數字港口;從部署單個 Pod,到構建復雜的有狀態應用。現在,我們站在了實現全自動化的最后一站。

在上一篇中,我們理解了 CI/CD 的核心理念——那條連接開發與運維、通往高效與可靠的自動化高速公路。今天,我們不再紙上談兵,而是要親手鋪設這條公路的每一塊磚石。

我們將使用一個強大且整合度極高的工具——GitLab CI/CD,為我們第十篇中的 Spring Boot + MySQL + Redis 應用項目,打造一條從代碼提交到自動部署至 Kubernetes 的完整流水線。

讀完并實踐本篇文章,你將獲得一項在現代軟件工程中極具價值的技能:將 DevOps 思想落地,實現應用的自動化、可靠化交付。

準備好,讓我們開始最后的施工,為這個系列畫上一個完美的句號!


第一步:環境準備與規劃

在開始之前,請確保你已經擁有:

  1. 一個 GitLab 賬號和項目:你可以使用 GitLab.com 的免費版,或者自建的 GitLab 實例。將我們第十篇的 Spring Boot 項目代碼推送到這個 GitLab 倉庫中。
  2. 一個運行中的 K8s 集群:繼續使用我們的 Minikube 集群。minikube start
  3. 一個 Docker 鏡像倉庫:比如 Docker Hub。你需要一個可以推送鏡像的賬號。
  4. kubectlhelm 命令行工具:Helm 是 K8s 的包管理器,我們將用它來方便地安裝 GitLab Runner。

我們的流水線規劃如下:

  • test 階段:運行 Maven 測試,確保代碼質量。
  • build 階段:使用 Docker 構建 Spring Boot 應用的鏡像。
  • push 階段:將構建好的鏡像推送到 Docker Hub。
  • deploy 階段:使用 kubectl 命令更新 K8s 中對應 Deployment 的鏡像版本,觸發滾動更新。

第二步:在 K8s 中安裝 GitLab Runner

GitLab Runner 是執行 .gitlab-ci.yml 文件中定義任務的代理程序。最云原生的方式,就是把它直接安裝在我們的 K8s 集群里。

  1. 獲取 Runner 注冊信息

    • 打開你的 GitLab 項目,在左側導航欄找到 Settings -> CI/CD
    • 展開 Runners 部分。你會看到一個 URL (https://gitlab.com/) 和一個注冊令牌 (registration token),類似 GR13489...。把這兩項復制下來,后面會用到。
  2. 使用 Helm 安裝 GitLab Runner

    • 添加 GitLab Helm 倉庫:
      helm repo add gitlab https://charts.gitlab.io
      helm repo update
      
    • 創建一個 values.yaml 配置文件,用于定制我們的 Runner。
      # values.yaml
      gitlabUrl: "https://gitlab.com/"  # 填入你復制的 GitLab URL
      runnerRegistrationToken: "GR13489..." # 填入你復制的注冊令牌# Runner 的配置
      runners:# Runner 的標簽,后面在 .gitlab-ci.yml 中會用它來選擇 Runnertags: "kubernetes,minikube"
      
    • 執行 Helm 安裝命令:
      helm install --namespace gitlab-runner --create-namespace gitlab-runner \
      -f values.yaml \
      gitlab/gitlab-runner
      
    • 驗證安裝:稍等片刻,然后檢查 Pod 是否在 gitlab-runner 命名空間中成功運行。
      kubectl get pods -n gitlab-runner
      # 你應該能看到一個名為 gitlab-runner-gitlab-runner-xxxx 的 Pod 正在運行
      
    • 回到 GitLab 項目的 Runner 設置頁面,你應該能看到一個新的 Runner 已經注冊成功并顯示為綠色可用狀態。

第三步:配置 GitLab CI/CD 變量

為了安全,我們不能把敏感信息(如 Docker Hub 密碼、K8s 憑證)直接寫在 .gitlab-ci.yml 文件里。我們需要將它們存儲在 GitLab 的 CI/CD 變量中。

進入 Settings -> CI/CD,展開 Variables 部分。添加以下變量:

  1. Docker Hub 憑證

    • DOCKER_USER: 你的 Docker Hub 用戶名。
    • DOCKER_PASS: 你的 Docker Hub 密碼或訪問令牌 (Access Token)。(建議設置為 Masked 類型)
  2. K8s 集群憑證 (kubeconfig)

    • 我們需要讓 GitLab Runner 能夠訪問我們的 Minikube 集群。
    • 在你的本地電腦上,找到 ~/.kube/config 文件,并將其內容完整復制下來。
    • 在 GitLab 變量設置中,創建一個新變量:
      • Key: KUBE_CONFIG
      • Type: File (這很重要,它會將變量內容作為文件提供給 Runner)
      • Value: 粘貼你剛才復制的 kubeconfig 全部內容。

第四步:編寫 .gitlab-ci.yml,定義流水線

這是最核心的一步。在你的 Spring Boot 項目根目錄下,創建 .gitlab-ci.yml 文件,內容如下:

# .gitlab-ci.yml# 定義流水線的各個階段,任務會按此順序執行
stages:- test- build- push- deploy# 定義一些全局變量
variables:# Maven 鏡像,用于測試階段MAVEN_IMAGE: maven:3.8-openjdk-17# Docker 鏡像名稱。$CI_PROJECT_NAME 是 GitLab 預定義變量,代表項目名IMAGE_NAME: $CI_REGISTRY_USER/$CI_PROJECT_NAME# 鏡像標簽。$CI_COMMIT_SHORT_SHA 是提交的短哈希值,確保每次構建的標簽唯一IMAGE_TAG: $CI_COMMIT_SHORT_SHA# --- 階段一:測試 ---
maven_test:stage: testimage: $MAVEN_IMAGEscript:- echo "Running Maven tests..."- ./mvnw testtags:- kubernetes # 指定使用我們安裝在 K8s 里的 Runner# --- 階段二:構建 Docker 鏡像 ---
docker_build:stage: build# 使用 Docker-in-Docker (dind) 鏡像,以便在容器內執行 Docker 命令image: docker:20.10.16services:- docker:20.10.16-dindscript:- echo "Building Docker image..."- docker build -t $IMAGE_NAME:$IMAGE_TAG .# 保存鏡像為 tar 文件,以便在后續階段使用- docker save $IMAGE_NAME:$IMAGE_TAG > image.tar# artifacts 用于在不同階段之間傳遞文件artifacts:paths:- image.tartags:- kubernetes# --- 階段三:推送 Docker 鏡像 ---
docker_push:stage: pushimage: docker:20.10.16services:- docker:20.10.16-dind# 需要上一個階段構建的鏡像文件needs:- docker_buildscript:- echo "Pushing Docker image..."# 加載鏡像文件- docker load < image.tar# 登錄 Docker Hub,使用我們之前定義的 CI/CD 變量- echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin- docker push $IMAGE_NAME:$IMAGE_TAGtags:- kubernetes# --- 階段四:部署到 Kubernetes ---
deploy_to_k8s:stage: deploy# 使用一個包含 kubectl 的鏡像image:name: bitnami/kubectl:latestentrypoint: [""]needs:- docker_pushscript:- echo "Deploying to Kubernetes..."# 配置 kubectl,讓它使用我們通過變量傳入的 KUBE_CONFIG- export KUBECONFIG=$KUBE_CONFIG# 使用 kubectl set image 命令來更新 Deployment 的鏡像,觸發滾動更新# 將 'springboot-app-deployment' 替換為你在 K8s 中實際的 Deployment 名稱- kubectl set image deployment/springboot-app-deployment springboot-app=$IMAGE_NAME:$IMAGE_TAG- echo "Deployment updated successfully!"tags:- kubernetes

請注意

  • springboot-app-deployment 和容器名 springboot-app 替換成你在第十篇中使用的實際名稱。
  • $CI_REGISTRY_USER 默認是你的 GitLab 用戶名,你也可以硬編碼為你的 Docker Hub 用戶名。

第五步:觸發流水線,見證自動化魔法!

現在,一切準備就緒。

  1. 提交并推送代碼:將包含 .gitlab-ci.yml 的項目推送到你的 GitLab 倉庫。

    git add .
    git commit -m "feat: Add GitLab CI/CD pipeline for automated deployment"
    git push
    
  2. 觀察流水線

    • 立刻打開你的 GitLab 項目頁面,進入 CI/CD -> Pipelines
    • 你會看到一個新的流水線被觸發了,狀態為 running
    • 點擊這個流水線,你可以看到我們定義的四個階段 test, build, push, deploy 正在依次執行。你可以點擊每一個 job 查看詳細的實時日志輸出。
  3. 驗證部署

    • deploy 階段成功完成后,打開你的終端。
    • 檢查你的 Deployment,你會看到它的鏡像已經被更新為最新的版本(帶有新的 commit 哈希標簽)。
      kubectl describe deployment springboot-app-deployment
      
    • 檢查 Pod,你會看到 K8s 已經完成了滾動更新,新的 Pod 正在運行。
      kubectl get pods
      

現在,嘗試修改一下 Spring Boot 代碼中的某個字符串,然后再次 git push。你將再次看到整個自動化流程被觸發,幾分鐘后,你的線上應用就被無縫地更新了!


總結與展望:你的云原生之旅,才剛剛開始

恭喜你!你已經成功地走完了從 Docker 到 Kubernetes 再到自動化 CI/CD 的全過程!

回顧這12篇的旅程,我們從最基礎的概念開始,一步一個腳印,最終搭建起了一套現代、高效、自動化的云原生應用交付系統。你不再是一個簡單的代碼編寫者或服務器管理者,而是一個能夠掌控從代碼到生產完整生命周期的現代工程師。

但這并不是終點,而是一個全新的起點。 云原生的世界浩瀚無垠,還有更多激動人心的領域等待你去探索:

  • 服務網格 (Service Mesh): 使用 Istio, Linkerd 來實現更高級的流量管理、可觀測性和安全性。
  • 可觀測性 (Observability): 深入學習 Prometheus, Grafana, Jaeger,打造全方位的監控、日志和追蹤系統。
  • Serverless/FaaS: 探索 Knative, OpenFaaS,讓你的應用真正做到按需運行,極致彈性。
  • GitOps: 學習 ArgoCD, Flux,將 Git 作為管理基礎設施和應用的唯一真實來源。

希望這個系列能為你打開一扇通往云原生世界的大門。保持好奇,持續學習,愿你在這片廣闊的數字海洋中,乘風破浪,揚帆遠航!

感謝你的一路相伴,我們的系列到此結束。江湖再見!

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

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

相關文章

DEVICENET轉MODBUS TCP網關連接ABB機器人配置案例

在工業自動化場景中&#xff0c;DeviceNet和Modbus TCP是兩種常見的通信協議。DeviceNet通常用于連接現場設備&#xff08;如傳感器、執行器等&#xff09;&#xff0c;而Modbus TCP則廣泛應用于以太網環境下的遠程監控和數據采集。當需要將基于DeviceNet協議的ABB機器人集成到…

達夢數據庫單機部署dmhs同步復制(dm8->kafka)

本文討論了達夢數據實時同步軟件DMHS的相關內容&#xff0c;包括概念總結、環境模擬及部署實現從達夢數據庫到Kafka隊列的同步復制。關鍵要點包括&#xff1a; 1.DMHS系統概述&#xff1a; 達夢公司推出的異構環境高性能數據庫實時同步系統&#xff0c;可應用于應急、容災等多…

爬蟲+動態代理助力 AI 訓練數據采集

文章目錄 引言新手之選&#xff1a;網頁抓取API可靠之選&#xff1a;動態住宅代理總結 引言 近年來&#xff0c;AI 技術飛速發展&#xff0c;很多朋友都投身于 AI 模型的訓練。然而&#xff0c;相較于模型的獲取&#xff0c;高質量的數據往往更加難以收集。一方面&#xff0…

OpenEuler服務器警告郵件自動化發送:原理、配置與安全實踐

OpenEuler服務器警告郵件自動化發送&#xff1a;原理、配置與安全實踐 在服務器的運維管理過程中&#xff0c;及時感知系統異常狀態至關重要。當OpenEuler系統運行時&#xff0c;將服務器的警告信息實時推送至郵箱&#xff0c;能幫助運維人員快速響應潛在問題&#xff0c;保障…

使用vite-plugin-html在 HTML 文件中動態注入數據,如元數據、環境變量、標題

vite-plugin-html 是一個用于 Vite 構建工具的插件&#xff0c;它可以幫助你在構建過程中動態注入一些 HTML 內容&#xff0c;比如標題、元數據、環境變量等。通過使用這個插件&#xff0c;你可以根據項目的配置和環境變量自動生成帶有動態內容的 HTML 文件&#xff0c;適用于 …

學習筆記087——Java接口和抽象類的區別和使用

文章目錄 1、主要區別2、使用場景2.1 使用接口的情況&#xff1a;2.1 使用抽象類的情況&#xff1a; 3、Java 8及以后的接口增強4、設計建議 1、主要區別 特性接口(Interface)抽象類(Abstract Class)定義方式使用interface關鍵字使用abstract class關鍵字方法實現Java 8前不能…

Squid 代理服務器實戰:解決動態 IP 訪問第三方接口的生產級方案

前言&#xff1a;動態IP場景下的業務痛點與解決方案 在企業開發場景中&#xff0c;經常會遇到這樣的需求&#xff1a;第三方服務&#xff08;如API接口、云平臺服務&#xff09;要求將訪問源IP加入白名單以保障安全。然而&#xff0c;企業辦公網絡通常采用動態IP分配&#xff0…

React中子傳父組件通信操作指南

文章目錄 為什么需要子傳父通信&#xff1f;方法一&#xff1a;回調函數&#xff08;最常用&#xff09;基礎示例實際場景&#xff1a;待辦事項列表 方法二&#xff1a;使用useRef傳遞引用方法三&#xff1a;Context API&#xff08;跨層級通信&#xff09;方法四&#xff1a;自…

【android bluetooth 框架分析 04】【bt-framework 層詳解 5】【AbstractionLayer介紹】

1. AbstractionLayer 介紹 我們在閱讀 native 和 java 層 藍牙服務代碼時&#xff0c;會發現很多 AbstractionLayer.xxxxx 的字段。 這些字段 雖然很容易理解是干什么的。 但是 大家有沒有考慮過&#xff0c; 為啥要專門定義一個類來存放他們。 這樣設計的意義是什么&#xff…

AI大模型從0到1記錄學習 大模型技術之機器學習 day27-day60

機器學習概述 機器學習&#xff08;Machine Learning, ML&#xff09;主要研究計算機系統對于特定任務的性能&#xff0c;逐步進行改善的算法和統計模型。通過輸入海量訓練數據對模型進行訓練&#xff0c;使模型掌握數據所蘊含的潛在規律&#xff0c;進而對新輸入的數據進行準確…

c/c++ 匯編碼中的.cfi 指令有什么用途?

author: hjjdebug date: 2025年 06月 12日 星期四 14:24:40 CST descrip: c/c 匯編碼中的.cfi 指令有什么用途? 文章目錄 1. 幾個簡寫詞.2. 看一個簡單的測試代碼:3. 生成匯編代碼:4. 分析.cfi 指令5. 小結: 1. 幾個簡寫詞. cfi(call frame info) 調用幀信息, 名詞. 描述的是…

ArcGIS Pro 3.4 二次開發 - 任務

環境:ArcGIS Pro SDK 3.4 + .NET 8 文章目錄 任務1 任務1.1 檢索項目中的所有任務項1.2 打開任務文件 - .esriTasks 文件1.3 打開項目任務項1.4 關閉任務項1.5 導出任務項1.6 獲取任務信息 - 從 TaskProjectItem1.7 獲取任務信息 - 從 .esriTasks 文件1.8 在任務文件中打開特定…

vscode如何修改終端的默認配置

問題困擾&#xff1a; 每次打開都是 powershell, 因為每次要是用 git bash, 所以每次手動切換很麻煩。 要將默認終端設置為 Git Bash&#xff0c;可以通過以下步驟完成。以下是詳細的操作方法&#xff1a; 步驟 1&#xff1a;打開終端設置 在 Visual Studio Code 的菜單欄中…

kafka快速入門與知識匯總

? kafka快速入門與知識匯總 一、前言 kafka是一款消息中間件&#xff0c;可以用于傳輸消息和日志收集、監控項目狀況。與其類似的技術棧有rocketmq、rabbitmq等&#xff0c;但這些技術棧大多應用在一些簡單的消息傳輸平臺&#xff0c;而kafka則因其對大量數據的高性能處理在…

設計模式——觀察者設計模式(行為型)

摘要 本文詳細介紹了觀察者設計模式&#xff0c;包括其定義、結構、實現方式、適用場景以及實戰示例。通過代碼示例展示了如何在Spring框架下實現觀察者模式&#xff0c;以及如何通過該模式實現狀態變化通知。同時&#xff0c;對比了觀察者模式與消息中間件在設計理念、耦合程…

uniapp 頁面棧一定深度后,回首頁導航到新頁面的解決方案

uniapp 頁面棧一定深度后&#xff0c;回首頁導航到新頁面的解決方案 uniapp 頁面導航解決方案 在 uniapp 中&#xff0c;要實現先彈出頁面棧回到首頁&#xff0c;然后再跳轉到指定頁面。 /*** description 后臺選擇鏈接專用跳轉*/ interface Link {path: string;name?: stri…

數據結構 散列表 學習 2025年6月12日15:30:48

數據結構 散列表 哈希表(Hash Table): 通過哈希函數將鍵&#xff08;key&#xff09;映射到存儲位置&#xff0c;從而實現快速的插入、刪除和查找操作。 哈希表是現代編程中最重要的數據結構之一&#xff0c;幾乎所有編程語言都提供了內置實現。 計數 #include <stdio.h&g…

數據結構之LinkedList

系列文章目錄 數據結構之ArrayList-CSDN博客 目錄 系列文章目錄 前言 一、模擬實現鏈表 1. 遍歷鏈表 2. 插入節點 3. 刪除節點 4. 清空鏈表 二、鏈表的常見操作 1. 反轉鏈表 2. 返回鏈表的中間節點 3. 鏈表倒數第 k 個節點 4. 合并兩個有序鏈表 5. 分割鏈表 6. 判…

DC3靶機滲透

1. 靶機介紹 主要的內容有 sql 注入漏洞、joomla 框架漏洞、ssh 攻擊、shell 反彈、提權 信息收集(ip、端口、目錄、指紋信息)--->利用漏洞--->反彈---->提權 2. 信息收集 2.1. 掃描存活 ip 192.168.220.134 2.2. 端口掃描 nmap -T4 -A -p- 192.168.220.134 …

C# 線程交互

一、為什么要進行線程交互 在C#中&#xff0c;線程交互通常涉及到多個線程之間的數據共享和同步。?. 一、全局變量 在C#中&#xff0c;全局變量是指在程序的任何地方都可以訪問的變量。通常&#xff0c;全局變量是在類的外部定義的&#xff0c;或者在所有方法之外定義的。全…