Skaffold
Skaffold是一个命令行工具,可促进kubernetes本地应用程序的持续开发。Skaffold处理构建,推送和部署应用程序的工作流。
下载skaffold:
- https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
- https://jusene.gitee.io/tools/skaffold/skaffold-linux-amd64
快速开始
创建一个Dockerfile
1
FROM alpine
2
3
CMD ["sleep", "300"]
创建一个k8s manifests
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: test-skaffold
5
spec:
6
selector:
7
matchLabels:
8
k8s-app: skaffold
9
template:
10
metadata:
11
labels:
12
k8s-app: skaffold
13
spec:
14
containers:
15
- name: test-skaffold
16
image: jusene/test-skaffold
1 | skaffold init |
2 | |
3 | apiVersion: skaffold/v2beta7 |
4 | kind: Config |
5 | metadata: |
6 | name: test |
7 | build: |
8 | artifacts: |
9 | - image: jusene/test-skaffold |
10 | deploy: |
11 | kubectl: |
12 | manifests: |
13 | - k8s-test.yaml |
14 | |
15 | Do you want to write this configuration to skaffold.yaml? [y/n]: y |
16 | Configuration skaffold.yaml was written |
17 | You can now run [skaffold build] to build the artifacts |
18 | or [skaffold run] to build and deploy |
19 | or [skaffold dev] to enter development mode, with auto-redeploy |
- skaffold build 打包镜像
- skaffold run 打包镜像并且部署
- skaffold dev 源码修改自动打包部署
skaffold 打包多个项目
1 | app |
2 | ├── app |
3 | │ ├── Dockerfile |
4 | │ └── kubernetes |
5 | │ └── deployment.yaml |
6 | ├── skaffold.yaml |
7 | └── web |
8 | ├── Dockerfile |
9 | └── kubernetes |
10 | └── deployment.yaml |
1 | skaffold init |
2 | |
3 | apiVersion: skaffold/v2beta7 |
4 | kind: Config |
5 | metadata: |
6 | name: app |
7 | build: |
8 | artifacts: |
9 | - image: jusene/test-skaffold-app |
10 | context: app |
11 | - image: jusene/test-skaffold-web |
12 | context: web |
13 | deploy: |
14 | kubectl: |
15 | manifests: |
16 | - app/kubernetes/deployment.yaml |
17 | - web/kubernetes/deployment.yaml |
开发模式
skaffold dev采用开发循环,skaffold将监视应用程序的源文件,并在检测到更改后重建镜像发布到集群中。
持续交付
skaffold run是用于一次性部署的单个命令,包括构建,标记,部署和等待部署:
- 运行状态检查healthcheck,等待deployments稳定并仅在所有部署成功后才成功
- skaffold build -构建,标记工件并将其推送到仓库
- skaffold deploy -将构建的工件部署到集群
- skaffold render -为GitOps工作流程导出转换后的Kubernetes清单
healthcheck默认情况下启用,通过–status-check=false标志禁用它
1 | deploy: |
2 | statusCheckDeadlineSeconds: 300 // 如果未指定,则默认为10分钟 |
3 | kubectl: |
4 | manifests: |
5 | - k8s-* |
流水线平台
init
skaffold init是在几秒内启动并运行项目的简便方法,生成buid和deploy配置。
skaffold init走任何的构建配置项目目录,并期待文件:Dockerfile,build.gradle/pom.xml,package.json,requiremenets.txt,go.mod。
init跳过大于500mb的文件
kustomize项目部署:通常结构目录
1 | app/ <- application source code, along with build configuration |
2 | main.go |
3 | Dockerfile |
4 | ... |
5 | base/ <- base deploy configuration |
6 | kustomization.yaml |
7 | deployment.yaml |
8 | overlays/ <- one or more nested directories, each with modified environment configuration |
9 | dev/ |
10 | deployment.yaml |
11 | kustomization.yaml |
12 | prod/ |
13 | ... |
退出码:
| 退出码 | 错误 |
| —– | —– |
| 101 | 找不到构建配置 |
| 102 | 找不到或生成k8s清单 |
| 102 | 发现现有的skaffold.yaml |
| 104 | 无法自动将生成器与图像名称匹配 |
build
Docker
本地build,可通过显式local
:
1 | build: |
2 | local: {} |
成功构建工件后,Docker映像将被推送到远程注册表,要使用本地Docker守护程序,请将构建类型添加local到的build部分:
选项 | 描述 | 默认 |
---|---|---|
push | 应该将镜像推送到仓库,如果未指定,则仅在当前Kubernetes上下文连接到远程集群时才推送图像 | |
tryImportMissing | 如果不在缓存中,是否尝试从docker本地或远程仓库导入 | false |
useDockerCLI | 使用docker命令行界面而不是Docker Engine API | |
useBuildkit | 使用BuildKit构建Docker镜像 | false |
concurrency | 可以同时构建多少个,0表示无限制 | 1 |
1 | build: |
2 | artifacts: |
3 | - image: gcr.io/k8s-skaffold/example |
4 | local: |
5 | push: true |
6 | concurrency: 0 |
Deploy
kubectl
1 | deploy: |
2 | kubectl: |
3 | manifests: |
4 | - k8s-* |
选项 | 描述 | 默认 |
---|---|---|
manifests | kubernetes yaml或json清单 | [“k8s/*.yaml”] |
remoteManifests | kubernetes体现在远程集群中 | [] |
flags | 传递给其他flag给kubectl | |
defaultNamespce | 如果未提供其他覆盖,则在部署时将默认名称空间传递给kubectl |
flags部分提供以下选项:
| 选项 | 描述 | 默认 |
| —– | —– | —– |
| global | 在每个命令上传递其他标志 | [] |
| apply | 在kubectl apply 上传递其他标志 | [] |
| delete | 在kubectl delete 上传递其他标志 | [] |
| disableValidation | 启用后,将–validate=false标志传递给受支持的kubectl命令。| false |
kustomize
kustomize允许Kubernetes开发人员自定义无模板的原始YAML文件,以用于多种用途。
1 | deploy: |
2 | kustomize: {} |
3 | # The deploy section above is equal to |
4 | # deploy: |
5 | # kustomize: |
6 | # paths: ["."] |
选项 | 描述 | 默认 |
---|---|---|
paths | kustomization文件的路径 | [“.”] |
flags | 传递给其他flag给kubectl | |
buildArgs | 传递给的其他参数kustomize build | [] |
defaultNamespace | 如果未提供其他覆盖,则在部署时将默认名称空间传递给kubectl |
tag
- gitCommit记录使用git commits/references标记镜像
- sha256使用latest标记镜像
- envTemplate使用环境变量标记镜像
- datetime使用当前日期和时间
- customTemplate使用模版部件的现有标注器的组合
1 | build: |
2 | tagPolicy: |
3 | gitCommit: {} |
4 | artifacts: |
5 | - image: gcr.io/k8s-skaffold/example |
如果工作区在Git标签上,则使用该标签来标记图像
envTemplate允许您在标签中使用环境变量。此策略要求您指定标记模板,在标记过程中,模板的一部分可以用环境变量的值替换。
1 | build: |
2 | tagPolicy: |
3 | envTemplate: |
4 | template: "{{.FOO}}" |
5 | artifacts: |
6 | - image: gcr.io/k8s-skaffold/example |
dateTime使用Skaffold开始构建工件的时间作为标签。
1 | build: |
2 | tagPolicy: |
3 | dateTime: |
4 | format: "2006-01-02_15-04-05.999_MST" |
5 | timezone: "Local" |
6 | artifacts: |
7 | - image: gcr.io/k8s-skaffold/example |
8 | # The tagPolicy section above is equal to |
9 | # tagPolicy: |
10 | # dateTime: {} |
filesync
skaffold支持多种同步类型:
manual
: 用户必须在本地工作区中指定文件,并在运行容器中指定目标。每种类型的工件都支持此功能。infer
: 每个更改文件的目标是从Dockerfile中的指令推断出来的auto
: Skaffold自动配置同步
manual
1 | build: |
2 | artifacts: |
3 | - image: gcr.io/k8s-skaffold/node-example |
4 | context: node |
5 | sync: |
6 | manual: |
7 | # sync a single file into the `/etc` folder |
8 | - src: '.filebaserc' |
9 | dest: /etc |
10 | |
11 | # sync files directly below `static-html` into `static/` |
12 | - src: 'static-html/*.html' |
13 | dest: static |
14 | |
15 | # sync any `png` file into the assets folder |
16 | - src: '**/*.png' |
17 | dest: assets |
18 | |
19 | # sync all `md` files from `content/en` into `content` |
20 | - src: 'content/en/**/*.md' |
21 | dest: content |
22 | strip: 'content/en/' |
infer
对于docker工件,Skaffold知道如何从工件的推断所需的目的地Dockerfile
1 | FROM hugo |
2 | |
3 | ADD .filebaserc /etc/ |
4 | ADD assets assets/ |
5 | COPY static-html static/ |
6 | COPY content/en content/ |
1 | build: |
2 | artifacts: |
3 | - image: gcr.io/k8s-skaffold/node-example |
4 | context: node |
5 | sync: |
6 | infer: |
7 | - '.filebaserc' |
8 | - 'static-html/*.html' |
9 | - '**/*.png' |
10 | - 'content/en/**/*.md' |
port forwarding
1 | portForward: |
2 | - resourceType: deployment |
3 | resourceName: myDep |
4 | namespace: mynamespace # |
5 | port: 8080 # |
6 | localPort: 9000 # *Optional* |