昨天我們學會了用 StatefulSet 部署 PostgreSQL,就像為資料庫找到了專屬管家。但每次修改配置都要重新 kubectl apply,重新等待 Pod 啟動,這開發體驗就像用算盤算微積分一樣痛苦!😅
今天我們要學習 DevSpace,它就像是 K8s 開發的「自動駕駛系統」,讓你專注寫程式,它幫你處理所有繁瑣的部署、同步、除錯工作。想像一下:程式碼一存檔,容器就自動更新;本地檔案一修改,Pod 裡就即時同步!這就是現代 Cloud Native 開發的正確打開方式!
✅ 理解 DevSpace 的核心價值與工作原理
✅ 初步了解 DevSpace 的完整開發工作流程
DevSpace 是一個開源的 K8s 開發工具,專門解決在 K8s 環境中開發應用的痛點:
根據官方統計,DevSpace 受歡迎的 5 大理由:
DevSpace 自動化所有建置和部署步驟:
傳統方式 | DevSpace 方式 |
---|---|
手動 docker build | 自動並行建置映像 |
手動 docker push | 自動推送到註冊表 |
手動 kubectl apply | 支援 kubectl、Helm、Kustomize |
複雜的 CI/CD 配置 | 一鍵 CI/CD 整合 |
傳統開發流程:
修改程式碼 → docker build → docker push → kubectl apply → 等待重啟
總耗時:5-10分鐘 😴
DevSpace 開發流程:
修改程式碼 → 自動同步 → 熱重載
總耗時:幾秒鐘-1分鐘 🚀
效率提升🚀
DevSpace 內建開發優化的 Web UI:
安裝 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
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.yaml
若熟悉 GitHub action 或是 GitLab CI 的朋友們,想必對 pipeline 的概念不會陌生。
📋 基本內容
# version: 指定 DevSpace 配置文件的版本
version: v2beta1
# name: 項目名稱,用於識別這個 DevSpace 項目
name: devspace-quickstart-golang
🔄 Pipelines
定義可執行的工作流程:
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
🚀 Deployments(部署配置)
deployments:
app:
kubectl:
manifests:
- 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:
enabled: true
啟用 SSH 服務,讓 IDE 可以連接到遠程開發環境
proxyCommands:
- command: devspace
- command: kubectl
- command: helm
- gitCredentials: true
讓本地命令在容器內可用
包含 Git 憑證代理
ports:
- port: "2345" # 調試端口
- port: "8080" # 應用端口
將容器端口轉發到本地
open:
- url: http://localhost:8080
當服務就緒時自動打開瀏覽器
⚡ Commands(自定義命令)
commands:
migrate-db:
command: |-
echo 'This is a cross-platform, shared command...'
🔗 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 的完整執行流程:
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 資源
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 設置:
文件同步啟動:
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
此時你已經擁有了一個完整的雲原生開發環境:
這就是為什麼 DevSpace 被稱為「K8s 開發的自動駕駛系統」- 它讓複雜的容器開發變得像本地開發一樣簡單!
DevSpace 不僅僅是一個工具,它代表了 Cloud Native 開發的新範式:
🚀 效率革命:從分鐘級部署到秒級同步
🎯 專注本質:讓開發者專注於程式碼,而非基礎設施
明天繼續來學習怎使用。