[转载]ko:Go中的快速Kubernetes微服务开发

举报
Amrf 发表于 2018/12/24 12:55:34 2018/12/24
【摘要】 我最初写信是ko为了帮助Knative开发人员。我被提示根据社区的积极反馈撰写这篇介绍性文章,包括ko最近在Kubecon Seattle 2018期间的IBM展位谈话。我希望您喜欢ko和我们一样使用,我期待您对slack.knative的反馈意见.dev。在过去的几年里,有很多关于容器的炒作。Docker,Kubernetes和相关技术已经风靡全球(双关语)。与此同时,随着软件项目变得越来...

原文:

https://medium.com/knative/ko-fast-kubernetes-microservice-development-in-go-f94a934a7240

作者:

Matthew Moore

我最初写信是ko为了帮助Knative开发人员。我被提示根据社区的积极反馈撰写这篇介绍性文章,包括ko最近在Kubecon Seattle 2018期间的IBM展位谈话。我希望您喜欢ko和我们一样使用,我期待您对slack.knative的反馈意见.dev

在过去的几年里,有很多关于容器的炒作。Docker,Kubernetes和相关技术已经风靡全球(双关语)。与此同时,随着软件项目变得越来越复杂,开发过程也越来越复杂。

什么开始:

1_cKqf1nOxv5zfVzfr28EqtQ.png

很快变成:

1__RHMQeIomizrorRXPKnIpw.png

诸如skaffold之类的工具可以将这个过程包装成任意语言和Dockerfiles,使其更容易管理(并且更快),但你仍然需要编写手工制作的手工制作的Dockerfiles,并且通常需要编写更多的 yaml(或其他)来告诉工具如何协调这个(例如什么被推到哪里?):

1_1sQUwU9ZHqeFHXhZpeR98g.png

ko 采用一种不同的方法,倾向于Go成语以消除配置。

一个这样的Go成语是二进制文件被“ 导入路径 ” 引用; 安装Go二进制文件的典型方法是:

#例如安装ko本身
去github.com/google/go-containerregistry/cmd/ko

开始使用ko不带任何其他配置文件,您只需使用导入路径替换对容器图像的引用:

#这个例子是基于:
#
 apiVersion:V1 
样:布丁
元数据:
  名称:kodata 
规格:
  容器:
  -  name:test 
    #ko构建并发布此Go二进制文件,并将此
    #替换为图像名称。
    image:github.com/google/go-containerregistry/cmd/ko/test 
  restartPolicy:从不

而已。

我该如何使用ko

ko还需要知道用户想要发布图像的位置。这是在yaml清单之外定义的,因为团队中的每个开发人员通常都会使用自己的开发人员。

例如,在Knative上开发,我在我的.bashrc文件中使用它  :

export KO_DOCKER_REPO = gcr.io / mattmoor-private / ko

注意:对于DockerHub用户(可能还有其他用户),这应该是:docker.io/username因为DockerHub不支持多级存储库名称。

之后,命令行界面建模为kubectl

ko apply -f directory / -f file.yaml

这将具有kubectl apply与之相同的净效果,但它也将构建,容纳和发布从yamls引用的Go微服务,配置明显更少:

1_2x4bOnBJIhwyDEaS4a7eJA.png

你只写Kubernetes yamls和代码。没有Dockerfiles,没有Makefiles。您运行一个命令,并且您的最新代码正在运行。

按照上面的例子(宽度修剪):

〜/ go / src / github.com / google / go-containerregistry 
$ ko apply -f cmd / ko / test / test.yaml 
using base ... for github.com/google/go-containerregistry/cmd/ko/test 
Publishing gcr.io/mattmoor-public/test-01234abcd:latest 
mount blob:sha256:deadbeef 
mount blob:sha256:baadf00d 
push blob sha256:deadf00d 
push blob sha256:baadbeef 
push blob sha256:beeff00d 
gcr.io/mattmoor-public/test- 01234abcd:latest:digest:... size:915 
发布gcr.io/mattmoor-public/test-01234abcd @ ... 
pod / kodata created
〜/ go / src / github.com / google / go-containerregistry $ kubectl get pods 
NAME READY STATUS RESTARTS AGE 
kodata 0/1已完成0 1

只是图像

ko支持的最简单的技巧是简单地容纳和发布图像。关于这一点的一个巧妙的事情是它适用于大多数Go二进制文件而不知道ko

例如(为宽度修剪):

〜/ go / src / golang.org / x / tools 
$ ko publish ./cmd/goimports/ 
使用base .. for 
golang.org/x/tools/cmd/goimports发布gcr.io/mattmoor-public/goimports-01234 :最新
安装的blob:SHA256:DEADBEEF 
安装斑点:SHA256:baadf00d 
安装斑点:SHA256:deadf00d 
推BLOB SHA256:baadbeef 
推BLOB SHA256:beeff00d 
gcr.io/mattmoor-public/goimports-01234:latest:摘要:...尺寸:914 
发布gcr.io/mattmoor-public/goimports-01234 @ ...

ko 也适用于发布!

您还可以通过以下ko方式发布用于重新分发的内容:

#这会做`apply`所做的一切,除了它管道
#stdout而不是kubectl 
ko resolve -f config /> release.yaml
#Later ... kubectl apply -f release.yaml

例如,我们使用它来释放所有Knative组件。

试一试,告诉我们你的想法。

这只是触及你可以做什么的表面ko,以及ko对你有什么用。有关更多信息,请查看README.md。如果您有问题:#ko on slack.knative.dev,或者通过Twitter @mattomata与联系

一些常见的陷阱

ko有几点需要注意,因为它依赖于约定:

  1. 你需要上电,${GOPATH}或者不知道你在哪个套餐。

  2. 错字是最糟糕的。因为ko对模式不敏感,它会忽略任何不是“主”包的导入路径的字符串,所以如果你的导入路径中有一个简单的拼写错误,那么它将保持不变,你可能会看到你的Pod ErrImagePull


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。