草案:Kubernetes容器开发变得容易

_今天的帖子是_Microsoft Azure和Kubernetes的联合创始人Brendan Burns,工程总监。

大约一个月前,微软宣布收购Deis,以扩大我们在容器和Kubernetes方面的专业知识。今天,我很高兴宣布一个新的开源项目,该项目来自于这个新扩展的Azure团队:草稿。

到目前为止,众所周知,Kubernetes在大规模部署和管理应用程序方面的优势。为Kubernetes开发新应用程序的过程仍然太难了。如果您是不熟悉容器,Kubernetes或开发云应用程序的,这将更加困难。

草稿填补了这个角色。顾名思义,它是一个工具,可以帮助您开始在Kubernetes中运行的容器化应用程序的初稿。当您第一次运行草稿工具时,它会自动发现您正在使用的代码,并构建支架以支持对应用程序进行容器化。使用试探法和各种预定义的项目模板草稿将创建一个初始Dockerfile来容器化您的应用程序,并创建一个Helm Chart以使您的应用程序可以在Kubernetes集群中部署和维护。团队甚至可以携带自己的项目草案模板来自定义该工具构建的支架。

但是草稿的价值不仅仅局限于在某些文件中使用脚手架来帮助您创建应用程序。 Draft还可以将服务器部署到您现有的Kubernetes集群中,该集群将自动与笔记本电脑上的代码保持同步。每当您对应用程序进行更改时,笔记本电脑上的草稿守护程序都会将该代码与Kubernetes中的草稿服务器进行同步,并且无需任何用户操作即可自动构建和部署新容器。 Draft为云带来了“内环”开发体验。

当然,正如当今所有基础架构软件所期望的那样,Draft可作为一个开放源代码项目提供,并且它本身是“草稿”形式的:)我们热切地邀请社区今天来使用草稿,我们认为这是即使以这种早期形式,也很棒。但是,我们很高兴看到我们如何围绕草稿开发社区,以使其对Kubernetes上所有容器化应用程序的开发人员更加强大。

为了让您大致了解Draft可以做什么,以下是从 入门 的页面 的GitHub资料库.

其中包含多个示例应用程序 示例目录。在本演练中,我们将使用 python示例应用程序 使用 烧瓶 提供一个非常简单的Hello World Web服务器。

$ cd examples/python

草稿创建

我们需要一些“脚手架”才能将我们的应用程序部署到 Kubernetes 簇。草稿可以创建一个 图表,一个Dockerfile和一个带有draft创建的draft.toml:

$ draft create

--\> Python app detected

--\> Ready to sail

$ ls

Dockerfile  app.py  chart/  draft.toml  requirements.txt

由Draft创建的chart /和Dockerfile资产默认为基本Python配置。该Dockerfile利用了 python:onbuild图片,这会将依赖项安装在requirements.txt中,并将当前目录复制到/ usr / src / app中。为了与chart / values.yaml中的服务值保持一致,此Dockerfile公开了来自容器的端口80。

draft.toml文件包含有关应用程序的基本配置,例如名称,将部署到的名称空间以及在本地文件更改时是否自动部署应用程序。

$ cat draft.toml  
[environments]  
 [environments.development]  
   name = "tufted-lamb"  
   namespace = "default"  
   watch = true  
   watch\_delay = 2

起草

现在我们准备将app.py部署到Kubernetes集群。

草稿使用一个草稿命令处理这些任务:

  • 从draft.toml读取配置
  • 将chart /目录和应用程序目录压缩为两个单独的tarball
  • 将压缩文件上载到草稿的服务器端组件
  • 草稿然后构建docker映像并将该映像推送到注册表
  • 草稿指示helm安装Helm图表,并参考刚刚构建的Docker注册表映像

当watch选项设置为true时,我们可以让它在后台运行,而稍后我们进行更改…

$ draft up  
--\> Building Dockerfile  
Step 1 : FROM python:onbuild  
onbuild: Pulling from library/python  
...  
Successfully built 38f35b50162c  
--\> Pushing docker.io/microsoft/tufted-lamb:5a3c633ae76c9bdb81b55f5d4a783398bf00658e  
The push refers to a repository [docker.io/microsoft/tufted-lamb]  
...  
5a3c633ae76c9bdb81b55f5d4a783398bf00658e: digest: sha256:9d9e9fdb8ee3139dd77a110fa2d2b87573c3ff5ec9c045db6009009d1c9ebf5b size: 16384  
--\> Deploying to Kubernetes  
   Release "tufted-lamb" does not exist. Installing it now.  
--\> Status: DEPLOYED  
--\> Notes:  
    1. Get the application URL by running these commands:  
    NOTE: It may take a few minutes for the LoadBalancer IP to be available.  
          You can watch the status of by running 'kubectl get svc -w tufted-lamb-tufted-lamb'  
 export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
 echo http://$SERVICE\_IP:80  

Watching local files for changes...

与已部署的应用交互

使用成功部署后的便捷输出,我们现在可以联系我们的应用程序。请注意,Kubernetes可能需要花费几分钟才能配置负载均衡器。耐心一点!

$ export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
$ curl [http://$SERVICE\_IP](http://%24service_ip/)

当我们卷曲我们的应用程序时,我们看到我们的应用程序正在运行!美丽的“ Hello World!”问候我们。

更新应用

现在,让我们更改“你好,世界!”在app.py中输出以输出“ Hello,Draft!”代替:

$ cat \<\<EOF \> app.py  
from flask import 烧瓶  

app = 烧瓶(\_\_name\_\_)  

@app.route("/")  
def hello():  
   return "Hello, Draft!\n"  

if \_\_name\_\_ == "\_\_main\_\_":  
   app.run(host='0.0.0.0', port=8080)  
EOF

草稿(等级)

现在,如果我们查看最初使用它来调用Draft的终端,Draft将注意到在本地进行了更改,然后再次调用Draft。然后草稿确定Helm版本已经存在,并且将执行Helm升级,而不是尝试进行其他Helm安装:

--\> Building Dockerfile  
Step 1 : FROM python:onbuild  
...  
Successfully built 9c90b0445146  
--\> Pushing docker.io/microsoft/tufted-lamb:f031eb675112e2c942369a10815850a0b8bf190e  
The push refers to a repository [docker.io/microsoft/tufted-lamb]  
...  
--\> Deploying to Kubernetes  
--\> Status: DEPLOYED  
--\> Notes:  
    1. Get the application URL by running these commands:  
    NOTE: It may take a few minutes for the LoadBalancer IP to be available.  
          You can watch the status of by running 'kubectl get svc -w tufted-lamb-tufted-lamb'  
 export SERVICE\_IP=$(kubectl get svc --namespace default tufted-lamb-tufted-lamb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')  
 echo [http://$SERVICE\_IP:80](http://%24service_ip/)

现在,当我们运行curl http:// $ SERVICE_IP时,我们的第一个应用程序已经通过Draft部署并更新到了Kubernetes集群!

我们希望这使您对Draft可以简化Kubernetes开发的一切工作有所了解。起草愉快!

-Microsoft Azure工程总监Brendan Burns