Skaffold 是谷歌开源的简化本地 Kubernetes 应用开发的工具。它将构建镜像、推送镜像以及部署 Kubernetes 服务等流程自动化,可以方便地对 Kubernetes 应用进行持续开发。其功能特点包括

  • 没有服务器组件
  • 自动检测代码更改并自动构建、推送和部署服务
  • 自动管理镜像标签
  • 支持已有工作流
  • 保存文件即部署

Skaffold - 图1

安装

  1. # Linux
  2. curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin
  3. # MacOS
  4. curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-darwin-amd64 && chmod +x skaffold && sudo mv skaffold /usr/local/bin

使用

在使用 skaffold 之前需要确保

  • Kubernetes 集群已部署并配置好本地 kubectl 命令行
  • 本地 Docker 处于运行状态并登录 DockerHub 或其他的 Docker Registry
  • skaffold 命令行已下载并放到系统 PATH 路径中

skaffold 代码库提供了一些列的示例,我们来看一个最简单的。

下载示例应用:

  1. $ git clone https://github.com/GoogleCloudPlatform/skaffold
  2. $ cd skaffold/examples/getting-started

修改 k8s-pod.yamlskaffold.yaml 文件中的镜像,将 gcr.io/k8s-skaffold 替换为已登录的 Docker Registry。然后运行 skaffold

  1. $ skaffold dev
  2. Starting build...
  3. Found [minikube] context, using local docker daemon.
  4. Sending build context to Docker daemon 6.144kB
  5. Step 1/5 : FROM golang:1.9.4-alpine3.7
  6. ---> fb6e10bf973b
  7. Step 2/5 : WORKDIR /go/src/github.com/GoogleCloudPlatform/skaffold/examples/getting-started
  8. ---> Using cache
  9. ---> e9d19a54595b
  10. Step 3/5 : CMD ./app
  11. ---> Using cache
  12. ---> 154b6512c4d9
  13. Step 4/5 : COPY main.go .
  14. ---> Using cache
  15. ---> e097086e73a7
  16. Step 5/5 : RUN go build -o app main.go
  17. ---> Using cache
  18. ---> 9c4622e8f0e7
  19. Successfully built 9c4622e8f0e7
  20. Successfully tagged 930080f0965230e824a79b9e7eccffbd:latest
  21. Successfully tagged gcr.io/k8s-skaffold/skaffold-example:9c4622e8f0e7b5549a61a503bf73366a9cf7f7512aa8e9d64f3327a3c7fded1b
  22. Build complete in 657.426821ms
  23. Starting deploy...
  24. Deploying k8s-pod.yaml...
  25. Deploy complete in 173.770268ms
  26. [getting-started] Hello world!

此时,打开另外一个终端,修改 main.go 的内容后 skaffold 会自动执行

  • 构建一个新的镜像(带有不同的 sha256 TAG)
  • 修改 k8s-pod.yaml 文件中的镜像为新的 TAG
  • 重新部署 k8s-pod.yaml