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