Draft学习笔记
Draft是微软的开源项目,目标是让构建K8S应用程序变得简单:
- draft create 基于Draft包将应用容器化
- draft up 将应用程序部署到K8S开发沙盒,支持外部URL访问
- 支持使用本地工具来修改应用程序,并且将变更在数秒内同步到K8S
Draft主要为开发期服务,不是完整的CI/CD解决方案。
使用两个简单的命令,开发人员就可以开发云原生应用,而不需要安装Docker或K8S。
Draft能够检测你的应用使用何种语言,并使用packs、基于最佳实践自动生成Dockerfile、Helm Chart。
目前支持8个语言包:.NET、Go、Node.js、Java(Maven/Gradle)、Python、Ruby。
1 2 3 4 5 6 7 8 |
cd $GOPATH/src/github.com/Azure git clone https://github.com/Azure/draft.git HTTPS_PROXY=http://127.0.0.1:8087 export HTTP_PROXY=http://127.0.0.1:8087 cd draft make bootstra |
你也可以直接到https://github.com/Azure/draft/releases下载构建好的二进制文件,当前版本0.16。
很简单,执行 draft init即可。Draft会下载各种语言的Pack。
本节以一个基于Maven进行构建的Spring Boot项目,来体验Draft的能力。项目地址: https://git.gmem.cc/alex/spring-boot-test.git。
执行命令 draft create,生成各种脚手架文件:
- .draftignore,当通过 draft up跟踪变更时需要忽略的文件模式
- .dockerignore,需要从Docker上下文忽略的文件模式
- .draft-tasks.toml,用于配置:
- pre-up:在 draft up之前需要执行的任务
- cleanup:在draft delete之后需要执行的任务
- Dockerfile:构建镜像的规则
- draft.toml:包含应用的各种基本配置信息,包括名称、部署到的命名空间、是否自动部署
- charts:包含Deployment、Service、Ingress等资源的定义
下面是一个简单的示例:
1 2 3 4 5 6 7 8 9 10 |
[pre-up] hello = "echo hello world" # where hello is the task description and the task is on the right side of = inside "" mysql = "helm install mysql --name mysql-service" [post-deploy] "friendly msg for no reason" = "echo setting up some stuff in my container" "sync database" = "rake db:migrate" [cleanup] "delete mysql" = "helm delete mysql-service --purge" |
可以看到这些任务都是一些Shell命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[environments] # 针对开发环境的配置信息 [environments.development] # Release名称 name = "example-python" # 部署到的命名空间 namespace = "default" # 等待Helm安装完毕 wait = true # 当本地文件变化后,是否立即部署应用 watch = false # 监控本地文件的延迟 watch-delay = 2 # 是否在部署完毕后,连接到应用程序 auto-connect = false # 构建镜像时使用的Dockerfile dockerfile = "Dockerfile" # 相对于当前文件的Chart定义位置 chart = "" # 定制Helm的Value set = ["foo=bar", "car=star"] # 构建结果的TGZ包位置 build-tar = "build.tar.gz" # 构建结果的Chart包位置 chart-tar = "chart.tar.gz" # 使用什么工具来构建镜像,默认docker container-builder = "docker" # 传递给draft connect的端口配置 override-ports = ["8080:8080", "9229:9229"] # 定制的镜像标签,Draft提供给Helm Chart的Tag总是计算出的应用的SHA值 custom-tags = ["latest", "backend-staging"] # 传递给镜像构建期变量 image-build-args = { BUILD_TIME_ARG = "build-time-argument-value", HTTP_PROXY = "http://my-proxy" } [environments.staging] |
你可以在此配置文件中定义针对不同环境的配置,并在调用Draft命令时指定针对的环境:
1 |
draft sub-commmand --environment=<affected environment> |
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM maven:3-jdk-11 as BUILD COPY . /usr/src/app RUN mvn --batch-mode -f /usr/src/app/pom.xml clean package FROM openjdk:11-jre-slim ENV PORT 4567 EXPOSE 4567 COPY --from=BUILD /usr/src/app/target /opt/target WORKDIR /opt/target CMD ["/bin/bash", "-c", "find -type f -name '*-with-dependencies.jar' | xargs java -jar"] |
可以看到Draft使用的是多步骤镜像构建,将编译源码的过程集成了进来。
自动推导出的Chart目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 |
. └── spring-boot-test ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── ingress.yaml │ ├── NOTES.txt │ └── service.yaml └── values.yaml |
这个Chart仅仅提供简单的、固定的模板。
要将应用部署到K8S集群中,仅仅需要执行 draft up命令。 此命令会:
- 读取draft.toml中的配置
- 压缩charts目录、压缩应用程序源码,生成两个TGZ
- 使用docker构建镜像
- 使用docker将镜像推送到draft.toml(或者 draft config get registry)中配置的镜像仓库
- 使用helm客户端安装Chart到K8S集群
通过命令 draft connect可以和部署的应用程序交互,它简单的将本地端口映射到容器端口,并且抓取容器的日志到本地:
1 2 3 |
draft connect Connect to python:8080 on localhost:54794 # [python]: * Environment: production |
这样,你就可以在本地直接访问容器提供的服务了。
此命令会删除Helm release,并且执行清理任务。
Pack为某种语言提供Dockerfile、Chart的模板(甚至不能叫模板,不支持变量)。
所有Pack的源码位于:https://github.com/Azure/draft/tree/master/packs。
Draft使用如下Dockerfile来构建Go镜像:
1 2 3 4 5 6 7 8 9 10 11 |
FROM golang ENV PORT 8080 EXPOSE 8080 WORKDIR /go/src/app COPY . . RUN go get -d -v ./... RUN go install -v ./... CMD ["app"] |
如果基于Maven进行构建,则使用此Pack来管理Java应用:
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM maven:3-jdk-11 as BUILD COPY . /usr/src/app RUN mvn --batch-mode -f /usr/src/app/pom.xml clean package FROM openjdk:11-jre-slim ENV PORT 4567 EXPOSE 4567 COPY --from=BUILD /usr/src/app/target /opt/target WORKDIR /opt/target CMD ["/bin/bash", "-c", "find -type f -name '*-with-dependencies.jar' | xargs java -jar"] |
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM gradle:jdk11 as BUILD COPY --chown=gradle:gradle . /project RUN gradle -i -s -b /project/build.gradle clean installDist && \ rm -rf /project/build/install/*/bin/*.bat FROM openjdk:11-jre-slim ENV PORT 4567 EXPOSE 4567 COPY --from=BUILD /project/build/install/* /opt/ WORKDIR /opt/bin CMD ["/bin/bash", "-c", "find -type f -name '*' | xargs bash"] |
Leave a Reply