Jusene's Blog

云原生 Scaffold 简化Kubernetes应用开发

字数统计: 1.6k阅读时长: 7 min
2020/09/07 Share

Skaffold

Skaffold是一个命令行工具,可促进kubernetes本地应用程序的持续开发。Skaffold处理构建,推送和部署应用程序的工作流。

下载skaffold:

快速开始

  • 创建一个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*
CATALOG
  1. 1. Skaffold
  2. 2. 快速开始
  3. 3. skaffold 打包多个项目
  4. 4. 开发模式
  5. 5. 持续交付
  6. 6. 流水线平台
    1. 6.1. init
    2. 6.2. build
      1. 6.2.1. Docker
    3. 6.3. Deploy
      1. 6.3.1. kubectl
      2. 6.3.2. kustomize
    4. 6.4. tag
    5. 6.5. filesync
      1. 6.5.1. manual
      2. 6.5.2. infer
    6. 6.6. port forwarding