Draft for Kubernetes - 一个原型设计工具

导航至

概述

Draft for Kubernetes Draft for Kubernetes是一个帮助原型设计微服务并将其暴露在公开域名上的工具。这使得快速迭代诸如webhooks或API等功能变得快速而简单。Draft使用docker、HelmKubernetes Ingress Controllers来快速使您的“草稿”公开可用。在底层,它为您的应用程序生成一个通用的Dockerfile和helm图表,以便您快速启动。该helm图表创建了一个ingress资源,以便在URL上暴露您的图表。您需要以下内容才能完成本指南

  1. 一个Kubernetes集群
    • 我已经在本指南中开发了GKE。
    • 在那里启动和运行非常简单。点击这里了解详情。
  2. 一个可以添加A或CNAME记录的域名
  3. quay.io或hub.docker的账户
  4. 一个正常工作的Helm安装
    • 安装说明可以在这里找到。
  5. 一个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.yamlGodeps/Godeps.jsonvendor/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...

现在,通过简单的处理器编辑,就可以挂钩数据源或执行更高级的操作了!