Skaffold 快速入门指南
一、概述
1. 简介
A. 是什么
Skaffold 是一个命令行工具,用于 Kubernetes 应用的持续开发、持续集成和持续交付。它自动化构建、推送和部署流程,让开发者专注于代码而非运维操作。
B. 为什么学
- 自动化 Kubernetes 部署流程,提高开发效率
- 支持热重载,代码更改即时生效
- 统一的开发、测试、部署工作流
- 兼容多种构建工具和部署方式
C. 学完能做什么
- 使用 Skaffold 配置 Kubernetes 应用的开发流程
- 实现代码变更自动构建和部署
- 集成 Skaffold 到 CI/CD 流水线
- 使用 GitOps 工作流进行应用交付
2. 前置知识
A. 必备技能
- 基本 Linux 命令操作
- 了解 Kubernetes 基础概念
- 了解 Docker 容器基础
B. 推荐知识
- 了解 kubectl 基本用法
- 了解 YAML 配置文件格式
二、环境准备
1. 系统要求
- Linux、macOS 或 Windows
- 至少 2GB 可用内存
- 已安装 kubectl 命令行工具
2. 安装步骤
安装 Skaffold:
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin安装 minikube(本地 Kubernetes 集群):
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
sudo mv minikube /usr/local/bin安装 kubectl:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin3. 验证安装
skaffold version
minikube version
kubectl version --client三、核心概念
1. 基本术语
- skaffold.yaml:Skaffold 配置文件,定义构建、部署和测试流程
- Builder:构建器,负责构建容器镜像(Docker、Jib、Buildpacks 等)
- Deployer:部署器,负责部署到 Kubernetes(kubectl、Helm、kpt 等)
- Renderer:渲染器,负责生成 Kubernetes 清单文件
- Tester:测试器,负责运行容器测试
2. 工作原理
graph LR
A[源代码] --> B[skaffold dev]
B --> C{检测变更}
C -->|代码变更| D[构建镜像]
C -->|配置变更| E[渲染清单]
D --> F[推送镜像]
E --> G[部署到 K8s]
F --> G
G --> H[同步文件]
H --> I[运行测试]3. 架构图
graph TB
subgraph 开发阶段
A[skaffold dev] --> B[构建]
B --> C[部署]
C --> D[文件同步]
D --> E[日志跟踪]
end
subgraph CI 阶段
F[skaffold build] --> G[skaffold test]
end
subgraph CD 阶段
H[skaffold render] --> I[skaffold apply]
J[skaffold deploy] --> I
end
G --> J四、快速上手
1. 获取示例项目
# 克隆 Skaffold 仓库
git clone https://github.com/GoogleContainerTools/skaffold
# 进入示例目录
cd skaffold/examples/buildpacks-node-tutorial2. 初始化 Skaffold 配置
# 运行初始化命令
skaffold init初始化过程中会提示:
- 选择构建器(默认 Docker)
- 选择要创建 Kubernetes 资源的构建器
- 确认写入 skaffold.yaml 配置文件
3. 查看生成的配置文件
生成的 skaffold.yaml 包含:
- build:定义如何构建容器镜像
- manifest:定义 Kubernetes 清单文件位置
graph TD
A[skaffold.yaml] --> B[build]
A --> C[manifest]
B --> D[构建器配置]
C --> E[K8s 清单]五、持续开发
1. 启动 minikube
# 启动 minikube
minikube start --profile custom
# 配置 Skaffold 使用本地集群
skaffold config set --global local-cluster true
# 配置 Docker 环境变量
eval $(minikube -p custom docker-env)2. 运行开发模式
# 启动持续开发
skaffold devSkaffold 会自动:
- 构建容器镜像
- 部署到 Kubernetes
- 启动文件监听
- 显示应用日志
3. 访问应用
# 打开隧道
minikube tunnel -p custom
# 浏览器访问
open http://localhost:30004. 热重载演示
修改代码文件 src/index.js 第 10 行:
app.listen(port, () => console.log(`Example app listening on port ${port}! This is version 2.`))Skaffold 会自动检测文件变更并重新部署。
sequenceDiagram
participant D as 开发者
participant S as Skaffold
participant K as Kubernetes
participant C as 容器
D->>S: 修改代码
S->>S: 检测变更
S->>K: 重建/同步文件
K->>C: 热重载
C->>S: 输出日志
S->>D: 显示结果5. 退出开发模式
按 Ctrl+C 停止,Skaffold 会自动清理部署的资源。
六、持续集成
1. 构建镜像
# 获取 Git 提交简写
export STATE=$(git rev-list -1 HEAD --abbrev-commit)
# 构建并输出到 JSON 文件
skaffold build --file-output build-$STATE.json2. 配置测试
在 skaffold.yaml 中添加测试配置:
test:
- image: skaffold-buildpacks-node
custom:
- command: echo "This is a custom test command!"3. 运行测试
skaffold test --build-artifacts build-$STATE.jsongraph LR
A[构建产物] --> B[skaffold test]
B --> C[容器结构测试]
B --> D[自定义测试]
C --> E[测试报告]
D --> E七、持续交付
1. 单步部署
# 使用构建产物直接部署
skaffold deploy -a build-$STATE.json2. GitOps 工作流
A. 渲染清单
# 生成水合清单文件
skaffold render -a build-$STATE.json --output render.yaml --digest-source localB. 检查清单
查看 render.yaml 文件,确认镜像标签已正确替换。
C. 应用清单
# 应用水合清单
skaffold apply render.yamlgraph TB
A[构建产物] --> B[skaffold render]
B --> C[render.yaml]
C --> D{GitOps 流程}
D -->|提交到 Git| E[代码审查]
D -->|直接应用| F[skaffold apply]
E --> F
F --> G[Kubernetes 集群]八、常用命令
1. 开发命令
| 命令 | 说明 |
|---|---|
| skaffold init | 初始化配置文件 |
| skaffold dev | 启动持续开发模式 |
| skaffold run | 构建并部署一次 |
| skaffold debug | 启动调试模式 |
2. 构建命令
| 命令 | 说明 |
|---|---|
| skaffold build | 仅构建镜像 |
| skaffold test | 运行测试 |
| skaffold render | 渲染清单文件 |
3. 部署命令
| 命令 | 说明 |
|---|---|
| skaffold deploy | 部署应用 |
| skaffold apply | 应用清单文件 |
| skaffold delete | 删除部署 |
九、最佳实践
1. 配置管理
- 使用 Profile 区分不同环境
- 利用 --profile 参数切换环境配置
- 将敏感信息存储在 Kubernetes Secret 中
2. 构建优化
- 使用本地缓存加速构建
- 选择合适的构建器(Docker、Jib、Buildpacks)
- 利用多阶段构建减小镜像体积
3. 部署策略
- 使用健康检查确保应用就绪
- 配置资源限制避免资源耗尽
- 利用滚动更新实现零停机部署
十、常见问题
1. 构建失败
问题:镜像构建失败
解决:
- 检查 Dockerfile 语法
- 确认 Docker daemon 运行正常
- 检查网络连接和镜像仓库访问
2. 部署失败
问题:部署到 Kubernetes 失败
解决:
- 检查 kubectl 上下文配置
- 确认集群资源充足
- 查看 kubectl describe pod 输出
3. 文件同步不工作
问题:代码变更没有自动同步
解决:
- 确认使用支持的构建器
- 检查文件路径配置
- 查看日志确认同步状态