1 minute read

skaffold 基本上是 build + push + deploy + port-forward 的自動化工具, 目的是讓容器工具開發時, 可以自動化這些操作, 如你修改code or config 一個指令幫你重build image, push, deploy … 甚至可以幫你監聽你的目錄 有操作就自動再跑一次流程

deploy可以跟很多工具配合 docker, kubectl, helm …

Quickstart

.
├── helm_demo
│   ├── charts
│   ├── Chart.yaml
│   ├── templates
│   │   └── main_api.yaml
│   └── values.yaml
├── main_api
│   ├── demo
│   │   ├── application
│   │   ├── domain
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── infrastructure
│   │   ├── interface
│   │   ├── migrate
│   │   └── readme.md
│   └── Dockerfile
└── skaffold.yaml

skaffold.yaml

apiVersion: skaffold/v4beta13
kind: Config
metadata:
  name: demo
build:
  tagPolicy:
    gitCommit: {}
  artifacts:
    - image: OOO.dkr.ecr.ap-northeast-1.amazonaws.com/main_api
      context: ./main_api
      docker:
        dockerfile: Dockerfile
  local:
    push: true

deploy:
  helm:
    releases:
      - name: demo
        chartPath: ./helm_demo/
        createNamespace: true

portForward:
  - resourceType: service
    resourceName: main-api
    port: 8090 # Service port
    localPort: 8090 # 轉發到本地機器 port , 之後打localhost:localPort 可以打到serivce
skaffold run
# 會執行 build + push + deploy + port-forward

基礎指令

基本上本質就是跑 build + push + deploy + port-forward 流程, 實際細節是看設定檔
若要執行的流程 該設定檔沒有 就會省略該步驟

skaffold build -v debug
# image + push

skaffold run 
# image + push + deploy + port-forward

skaffold dev
# image + push + deploy + port-forward 
# 並且會持續監聽相關目錄, 有異動會再次觸發流程, 結束監聽後, 會把deploy uninstall

Push False 坑

一般容器工具設定檔 假設沒有指定tag, registry上有latest, 通常會直接pull latest

skaffold 通常是分佈式設計 不會考慮local image,

假設push local, build 後 它deploy時 無論local有沒有 它都會去registry拉剛剛build的image tag
因此若要dpeloy, push必須開啟, 因為tag是動態的, 即使知道, 也不可能每次都去改容器設定檔

實際上這邊設計應該把 push:true 與 deploy 綁一起, 假設有使用deploy, push:false 應該要報錯比較好