Draft for Kubernetes - 一个原型设计工具
作者:Jack Zampolin / 开发者
2017年6月6日
导航至
概述
Draft for Kubernetes是一个帮助原型设计微服务并将其暴露在公开域名上的工具。这使得快速迭代诸如webhooks或API等功能变得快速而简单。Draft使用docker、Helm和Kubernetes Ingress Controllers来快速使您的“草稿”公开可用。在底层,它为您的应用程序生成一个通用的Dockerfile
和helm图表,以便您快速启动。该helm图表创建了一个ingress资源,以便在URL上暴露您的图表。您需要以下内容才能完成本指南
- 一个Kubernetes集群
- 我已经在本指南中开发了GKE。
- 在那里启动和运行非常简单。点击这里了解详情。
- 一个可以添加A或CNAME记录的域名
- quay.io或hub.docker的账户
- 一个正常工作的Helm安装
- 安装说明可以在这里找到。
- 一个golang开发环境
- Draft也支持基本的python、ruby、php、node和java应用程序。
在本指南中,我们将首先安装Draft的依赖项,然后创建我们的示例应用程序,安装Draft并部署我们的应用程序。
安装Draft依赖项
Ingress Controller创建一个带有公共IP(或AWS上的CNAME记录)的负载均衡器,以便将您的应用程序暴露到互联网上。它是将流量路由到您集群上运行的应用程序的一个快速、安全的抽象。要安装Ingress Controller,请使用helm提供的Nginx Ingress
# Install Ingress Controller
$ helm install stable/nginx-ingress --namespace=kube-system --name=nginx-ingress
# Wait for load balancer to have IP
$ kubectl --namespace kube-system get services -w nginx-ingress-nginx-ingress-controller
# If you have an existing ingress controller find its IP
echo $(kubectl get svc --namespace kube-system nginx-ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
一旦您获得了IP或CNAME,您就可以创建相应的DNS记录。将其设置为类似*.draft.mydomain.mytld
的格式。执行此操作的步骤将根据您的域名注册位置而有所不同。我使用What’s My DNS来检查传播。一旦您看到更改已传播,您应该从curl获得以下响应
$ curl foo.draft.mydomain.mytld
default backend - 404
注意:如果您想了解更多关于默认后端的信息,我发现了这篇文章非常值得一读。
准备Golang应用程序
创建一个新的项目目录并创建一个golang应用程序。我已经使用了一个简单的服务器
// main.go
package main
import (
"log"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
message := "hello world\n"
w.Write([]byte(message))
}
func main() {
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
您还希望为应用程序添加某种类型的依赖管理。这是因为脚本 Draft 用来检测不同应用程序类型的方式。golang pack 会检查您的项目中是否存在 glide.yaml
、Godeps/Godeps.json
或 vendor/vendor.json
文件。如果您使用的是 glide,则简单的 glide create
就可以满足这一需求。
安装 Draft
下载适用于您的操作系统的 draft 可执行文件,并将其移动到您的路径中。之后,您需要运行 draft init
并提供一些参数。
draft init --set
registry.url=docker.io,
registry.org=mydockerorg,
registry.authtoken=$(echo '{"username":"myDockerUsername","password":"myDockerPassword","email":"[email protected]"}' | base64),
basedomain=mydomain.mytld
注意:确保将上述命令全部放在一行中,且不同 key=value
对之间没有空格!另外,我在尝试使 Google 容器注册库工作时遇到了一些问题,但看起来它是受支持的。
这将启动一个 draftd
部署和一些 draft pod,这些 pod 在您的 kube-system 命名空间中。这些 pod 帮助管理与 docker 镜像仓库的连接。
部署您的应用程序!
哇!设置过程真是复杂!现在这一切都完成了,是时候使用 Draft 了!首先运行的命令是 draft create
。这将为您生成 helm 图表(/chart
)和 /Dockerfile
。它还会创建一个 draft.toml
文件,允许您控制应用程序的不同环境以及它在集群中的安装位置。要为您的应用程序命名(默认值也可以),请编辑 draft.toml
。
[environments]
[environments.development]
name = "cool-beans"
namespace = "draft"
watch = true
watch_delay = 2
然后运行 draft up
,看看魔法发生吧!
$ draft up
--> Building Dockerfile
Step 1 : FROM golang:onbuild
# Executing 3 build triggers...
Step 1 : COPY . /go/src/app
Step 1 : RUN go-wrapper download
---> Running in 825771ecaf59
...
# Some docker output...
...
--> Deploying to Kubernetes
--> Status: DEPLOYED
--> Notes:
http://cool-beans.mydomain.mytld to access your application
Watching local files for changes...
这将构建您的 docker 镜像,将您的 docker 镜像推送到配置的容器注册库下的 {{ .environments.development.name }}
仓库,并在存储库根目录的预配置 helm 图表中运行 helm install
!所有资源启动并 Ingress 注册您的新应用程序可能需要一点时间,但您将能够在该地址使用 curl 访问您的应用程序。
$ curl http://cool-beans.mydomain.mytld
hello world
但是,要看到真正的魔法,请修改您的应用程序。
// main.go
func sayHello(w http.ResponseWriter, r *http.Request) {
message := "I don't know Margo...\n"
w.Write([]byte(message))
}
Draft 将重新构建您的镜像,并通过 helm upgrade
将这些更改实时推送到镜像。
$ curl http://cool-beans.mydomain.mytld
I don't know Margo...
现在,通过简单的处理器编辑,就可以挂钩数据源或执行更高级的操作了!