iT邦幫忙

2025 iThome 鐵人賽

DAY 14
2

賢者大叔的容器修煉手札系列 第 14 篇

DevSpace 雲原生開發的好幫手

昨天我們學會了用 StatefulSet 部署 PostgreSQL,就像為資料庫找到了專屬管家。但每次修改配置都要重新 kubectl apply,重新等待 Pod 啟動,這開發體驗就像用算盤算微積分一樣痛苦!😅
今天我們要學習 DevSpace,它就像是 K8s 開發的「自動駕駛系統」,讓你專注寫程式,它幫你處理所有繁瑣的部署、同步、除錯工作。想像一下:程式碼一存檔,容器就自動更新;本地檔案一修改,Pod 裡就即時同步!這就是現代 Cloud Native 開發的正確打開方式!

今日學習目標 🎯

✅ 理解 DevSpace 的核心價值與工作原理

✅ 初步了解 DevSpace 的完整開發工作流程

DevSpace 核心概念 🧠

什麼是 DevSpace?

DevSpace 是一個開源的 K8s 開發工具,專門解決在 K8s 環境中開發應用的痛點:

  • 🔄 Hot reload - 程式碼變更即時同步到容器
  • 🚀 快速部署 - 一鍵部署到任何 K8s 集群
  • 🔍 即時除錯 - 直接在容器內除錯應用
  • 📊 開發體驗 - 統一的日誌、port forwarding、終端訪問

為什麼開發者愛上 DevSpace? 💝

根據官方統計,DevSpace 受歡迎的 5 大理由:

#1 簡化工作流程 🔄

DevSpace 自動化所有建置和部署步驟:

傳統方式 DevSpace 方式
手動 docker build 自動並行建置映像
手動 docker push 自動推送到註冊表
手動 kubectl apply 支援 kubectl、Helm、Kustomize
複雜的 CI/CD 配置 一鍵 CI/CD 整合

#2 更快的迭代速度 ⚡

傳統開發流程:

修改程式碼 → docker build → docker push → kubectl apply → 等待重啟
總耗時:5-10分鐘 😴

DevSpace 開發流程:

修改程式碼 → 自動同步 → 熱重載
總耗時:幾秒鐘-1分鐘 🚀

效率提升🚀

#3 功能豐富的 UI 🎨

DevSpace 內建開發優化的 Web UI:

  • 命名空間檢查 - 查看所有容器狀態
  • 即時日誌串流 - 彩色終端日誌
  • 狀態監控 - 快速檢測容器問題
  • 互動式終端 - 一鍵開啟容器終端
  • 一鍵port forwarding - 直接在瀏覽器開啟應用

#4 本地開發體驗 💻

  • 多容器日誌串流 - 在 IDE 中查看所有容器日誌
  • 互動式終端 - 直接在容器內執行命令
  • IDE 整合 - 支援所有主流 IDE
  • 減少上下文切換 - 專注程式碼,不用頻繁切換工具

#5 跨環境一致性 🌐

  • 宣告式配置 - 一個配置檔案管理所有環境
  • Profile 機制 - 不同環境使用不同配置
  • 配置變數 - 動態配置支援
  • 自訂命令 - 團隊共享開發命令

DevSpace 工作原理 🔧

https://ithelp.ithome.com.tw/upload/images/20250828/20104930kCpTkmtohf.png

動手玩 DevSpace

安裝 DevSpace
curl -L -o devspace "https://github.com/loft-sh/devspace/releases/latest/download/devspace-linux-amd64" && sudo install -c -m 0755 devspace /usr/local/bin

測試 DevSpace 是否安裝成功

devspace version
# DevSpace version : 6.3.17

牛刀小試 devspace-quickstart-golang

git clone https://github.com/loft-sh/devspace-quickstart-golang
cd devspace-quickstart-golang

# 透過 devspace init 幫忙設定並建立 devspace.yaml
devspace init

關於此演示的 init 選項能參考官方網站 Getting started

.
├── devspace_start.sh
├── devspace.yaml
├── Dockerfile
├── go.mod
├── main.go
└── manifests
    ├── configmap.yaml
    ├── deployment.yaml
    ├── namespace.yaml
    └── service.yaml

devspace.yaml 這檔案是 DevSpace 的核心,告訴DevSpace如何建置,部署和開發該專案。
devspace_start.sh 用於開放容器的terminal時,用於向開發者顯示資訊。
這裡我因為用的是kubectl而非helm,所以要用到之前幾天學到的 K8s manifest 的設計。

DevSpace 配置文件解析 🔍

devspace.yaml 若熟悉 GitHub action 或是 GitLab CI 的朋友們,想必對 pipeline 的概念不會陌生。

📋 基本內容

# version: 指定 DevSpace 配置文件的版本
version: v2beta1

# name: 項目名稱,用於識別這個 DevSpace 項目
name: devspace-quickstart-golang

🔄 Pipelines
定義可執行的工作流程:

  1. dev 管道
dev:
  run: |-
    run_dependencies --all       # 1. 部署依賴項目
    ensure_pull_secrets --all    # 2. 確保拉取密鑰
    create_deployments --all     # 3. 部署 Helm charts 和清單
    start_dev app                # 4. 啟動開發模式

執行命令:devspace dev,用於開發環境的完整工作流!!

🐳 Images(鏡像配置)

images:
  app:
    image: app:latest
    dockerfile: ./Dockerfile
  • 定義需要構建的 Docker 鏡像
  • app: 鏡像名稱
  • dockerfile: 指定 Dockerfile 路徑

🚀 Deployments(部署配置)

deployments:
  app:
    kubectl:
      manifests:
        - manifests/**
  • 定義如何部署應用到 Kubernetes
  • 使用 kubectl 方式部署
  • 從 manifests/ 目錄載入所有清單文件

💻 Dev(開發配置)
這是開發環境的核心配置:

  • 基本設置
dev:
  app:
    imageSelector: app:latest
    devImage: ghcr.io/loft-sh/devspace-containers/go:1.24-alpine
  • imageSelector: 選擇要替換的容器鏡像

  • devImage: 開發優化的鏡像(包含開發工具)

  • 文件同步

sync:
  - path: ./
    uploadExcludeFile: .dockerignore
  • 本地文件與容器間的雙向同步

  • 排除 .dockerignore 中指定的文件

  • 終端訪問

terminal:
  command: ./devspace_start.sh

自動打開終端並執行啟動腳本

  • SSH 支持
ssh:
  enabled: true

啟用 SSH 服務,讓 IDE 可以連接到遠程開發環境

  • 代理命令
proxyCommands:
  - command: devspace
  - command: kubectl
  - command: helm
  - gitCredentials: true

讓本地命令在容器內可用
包含 Git 憑證代理

  • 端口轉發
ports:
  - port: "2345"  # 調試端口
  - port: "8080"  # 應用端口

將容器端口轉發到本地

  • 自動打開 URL
open:
  - url: http://localhost:8080

當服務就緒時自動打開瀏覽器

⚡ Commands(自定義命令)

commands:
  migrate-db:
    command: |-
      echo 'This is a cross-platform, shared command...'
  • 定義可重複使用的開發任務
  • 例如執行:devspace run migrate-db

🔗 Dependencies(依賴項目)

# dependencies:
#   api:
#     git: https://...  # Git 倉庫依賴
#     tag: v1.0.0
#   ui:
#     path: ./ui        # 本地路徑依賴(單體倉庫)

定義對其他 DevSpace 項目的依賴
支持 Git 和本地路徑兩種方式

執行起來

首先用 kubectl 建立 namespace,接著透過 devspace use namespace 設定 devspace 使用指定的 k8s namespace.

 kubectl create namespace devspace-demo
 
 devspace use namespace devspace-demo

接著透過devspace dev 來啟動服務。

devspace dev
info Using namespace 'devspace-demo'
info Using kube context 'kind-demo'
deploy:app Applying manifests with kubectl...
deploy:app configmap/golang-app-config created
deploy:app deployment.apps/golang-app created
deploy:app Warning: resource namespaces/devspace-demo is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
deploy:app namespace/devspace-demo configured
deploy:app service/golang-app-service created
deploy:app service/golang-app-nodeport created
deploy:app Successfully deployed app with kubectl
dev:app Waiting for pod to become ready...
dev:app DevSpace is waiting, because Pod golang-app-devspace-58df59ffff-7ghhv has status: ContainerCreating
dev:app DevSpace is waiting, because Pod golang-app-devspace-58df59ffff-7ghhv has status: ContainerCreating
dev:app Selected pod golang-app-devspace-58df59ffff-7ghhv
dev:app open  Opening 'http://localhost:8080' as soon as application will be started
dev:app ports Port forwarding started on: 2345 -> 2345, 8080 -> 8080
dev:app sync  Sync started on: ./ <-> ./
dev:app sync  Waiting for initial sync to complete
dev:app sync  Initial sync completed
dev:app ssh   Port forwarding started on: 11868 -> 8022
dev:app proxy Port forwarding started on: 10311 <- 10567
dev:app ssh   Use 'ssh app.devspace-quickstart-golang.devspace' to connect via SSH
dev:app term  Opening shell to golang-app:golang-app-devspace-58df59ffff-7ghhv (pod:container)

     %########%      
     %###########%       ____                 _____                      
         %#########%    |  _ \   ___ __   __ / ___/  ____    ____   ____ ___ 
         %#########%    | | | | / _ \\ \ / / \___ \ |  _ \  / _  | / __// _ \
     %#############%    | |_| |(  __/ \ V /  ____) )| |_) )( (_| |( (__(  __/
     %#############%    |____/  \___|  \_/   \____/ |  __/  \__,_| \___\\___|
 %###############%                                  |_|
 %###########%


Welcome to your development container!

This is how you can work with it:
- Files will be synchronized between your local machine and this container
- Some ports will be forwarded, so you can access this container via localhost
- Run `go run main.go` to start the application

devspace ./app # go run main.go 
Started server on http://localhost:8080

這時候就能再你的 VsCode 改程式,你會同時發現 DevSpace也會同步更新。
也能開啟 DevSpace Dashboard http://localhost:8090,這裡能看到容器的 log。
這時你會發現它跟OrbStack很相似。

DevSpace Dev 執行流程詳解 🔍

從上面的執行日誌,我們可以清楚看到 devspace dev 的完整執行流程:

階段一:環境準備 🏗️

info Using namespace 'devspace-demo'
info Using kube context 'kind-demo'

確認使用的 Kubernetes 命名空間
確認當前的 kubectl context

階段二:應用部署 🚀

deploy:app Applying manifests with kubectl...
deploy:app configmap/golang-app-config created
deploy:app deployment.apps/golang-app created
deploy:app service/golang-app-service created
deploy:app service/golang-app-nodeport created

按照 devspace.yaml 中的 deployments 配置
使用 kubectl 部署 manifests/ 目錄下的所有資源
創建 ConfigMap、Deployment、Service 等 K8s 資源

階段三:等待 Pod 就緒 ⏳

dev:app Waiting for pod to become ready...
dev:app DevSpace is waiting, because Pod golang-app-devspace-58df59ffff-7ghhv has status: ContainerCreating
dev:app Selected pod golang-app-devspace-58df59ffff-7ghhv

監控 Pod 狀態變化
等待容器從 ContainerCreating 變為 Running
自動選擇目標 Pod 進行開發模式替換

階段四:建立開發連接 🔗

dev:app ports Port forwarding started on: 2345 -> 2345, 8080 -> 8080
dev:app sync  Sync started on: ./ <-> ./
dev:app sync  Initial sync completed
dev:app ssh   Port forwarding started on: 11868 -> 8022

Port forwarding 設置:

  • 2345 - Go 調試端口(delve debugger)
  • 8080 - 應用服務端口
  • 11868 - SSH 連接端口

文件同步啟動:

  • 建立本地目錄與容器的雙向同步
  • 完成初始文件同步

SSH 服務啟動:

  • 在容器內啟動 SSH 服務器
  • 提供遠程開發環境訪問

階段五:進入開發模式 💻

dev:app term  Opening shell to golang-app:golang-app-devspace-58df59ffff-7ghhv
Welcome to your development container!

自動打開容器內的交互式終端
執行 devspace_start.sh 腳本
顯示開發環境歡迎信息和使用指南

階段六:應用啟動 🎯

devspace ./app # go run main.go 
Started server on http://localhost:8080

在容器內執行應用程序
通過端口轉發,本地可以訪問 http://localhost:8080

此時你已經擁有了一個完整的雲原生開發環境:

  • 即時同步 📁:本地修改 main.go → 自動同步到容器
  • 熱重載 🔥:容器內重新執行 go run main.go → 立即看到變更
  • 本地訪問 🌐:瀏覽器打開 localhost:8080 → 訪問容器內的應用
  • 遠程調試 🐛:IDE 連接到 localhost:2345 → 在容器內調試 Go 程序
  • 終端訪問 💻:直接在容器內執行命令和查看日誌

這就是為什麼 DevSpace 被稱為「K8s 開發的自動駕駛系統」- 它讓複雜的容器開發變得像本地開發一樣簡單!

總結

DevSpace 不僅僅是一個工具,它代表了 Cloud Native 開發的新範式:

🚀 效率革命:從分鐘級部署到秒級同步
🎯 專注本質:讓開發者專注於程式碼,而非基礎設施

明天繼續來學習怎使用。


上一篇
StatefulSet - 有狀態應用的專屬管家 👑
下一篇
DevSpace HotReload 與 Hooks - 讓開發如行雲流水 🌊
系列文
賢者大叔的容器修煉手札17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言