【译】两年了我终于更新了!为 Kubernetes 构建开源市场

258 阅读10分钟

Two year update: Building an Open Source Marketplace for Kubernetes

自从我发现自己在为客户和自己的开源工作所写的每一份教程中都写了安装简单但必要的软件的模板说明以来,已经过去了22个月。

在这篇文章中,我将带领你回顾过去两年的历程,从最初的创建,到发展社区,获得第一个赞助的应用程序,以及接下来的工作。其中会有代码片段和技术细节,但在我们庆祝项目两周年的时候,每个人都应该有收获。

Two year update: Building an Open Source Marketplace for Kubernetes

我所启动的各种开源项目的时间轴。它们都有一个共同点:关注开发者的经验和社区。

原型

2019年,Helm2仍然被广泛使用,我已经踏上了自己的道路,建立独立软件,帮助公司全职接触开发者。

但对于我最早的一个客户来说,我不是在用OpenFaaS支持他们,而是在为他们的博客构建深层次的技术内容,并发现Kubernetes生态系统使这一工作变得难以置信的重复和分散。

你想要一个安全的、支持TLS的注册表,用Ingress Nginx、cert-manager和Docker的开源注册表?结果是5000字,而其他每一个教程都倾向于需要安装K3s或Kubernetes,然后是ingress-nginx或traefik和cert-manager

我想,一个专门的CLI可以消除重复,并有助于采购应用程序,而不是滚动浏览巨大的Helm图表README文件和猜测好的默认值。

我现在还能记得。我不想再创建一个我必须维护、发布和更新的CLI,所以四处打听,Duffie Cooley建议扩展k3sup,于是我就做了。

k3sup 是我出于类似的原因编写的CLI--使开发者在引导K3s时有更好的体验。安装K3s的过程也太手动了,这意味着我在几十篇博文中重复了模板式的说明。

commit 0b4997e408d5b2dc101f16c317f1fd946e3f91b1
Author: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>
Date:   Tue Sep 24 12:35:28 2019 +0100

    Add prototype for installing apps
    
    Installs OpenFaaS, but not on armhf, optional loadbalancer
    flag.
    
    Pre-reqs are not checked i.e. helm/tiller.
    
    Signed-off-by: Alex Ellis (OpenFaaS Ltd) <alexellis2@gmail.com>

 main.go         |   3 +++
 pkg/cmd/apps.go | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

第一次提交k3sup,为openfaas添加一个原型应用。在k3sup中为OpenFaaS创建一个应用意味着我们不需要创建自己的安装程序,这是一个额外的好处。

k3sup是为了通过SSH连接安装K3s来构建Kubernetes集群而创建的,我希望它有一个像Docker Swarm一样的用户体验。

$ docker swarm init

Your join token is $SECRET

$ docker swarm join --join-token $SECRET 192.168.0.101

所以它最终看起来像这样。

k3sup install --ip 192.168.0.101 --user pi
k3sup join --server-ip 192.168.0.101 --ip 192.168.0.102 --user pi

然后,应用程序的功能只是成为一个子命令。

k3sup app install openfaas
k3sup app install kubernetes-dashboard
k3sup app install mongo

我添加了一个info 命令,打印出了关于如何开始的策论说明。

k3sup app info openfaas

如果你安装了Minio,它将告诉你如何访问服务,以及如何获得生成的用户名和密码。如果你安装了Postgresql,它将解释在哪里找到连接字符串。

几个月后,一些人(包括我的朋友Stefan Prodan)开始说:"我为什么要用你的市场来安装应用程序?我不使用树莓派!我不关心K3。我不关心K3的事!"

嗯,这是出乎意料的。

k3sup app install 对任何类型的Kubernetes集群都有效,甚至像EKS和GKE这样的管理引擎。我增加了对Raspberry Pi集群的支持,因为这是其他工具所忽视的,我知道社区需要这个。

arkade的诞生

于是arkade诞生了。

  • k3sup app install ->arkade install
  • k3sup app info ->arkade info

我写了我们为什么需要arkade,由于大部分的贡献者都来自OpenFaaS社区,所以我把它发表在博客上。

为什么OpenFaaS社区要建立arkade,它对你有什么好处?

arkade存在于github.com/alexellis/a…。为什么它不在openfaas组织中?因为同样的原因,这个应用现在叫arkade而不是k3sup,我知道人们会认为它只能和openfaas一起使用。

为什么它不在自己的组织里呢?因为我不希望人们把使之成为可能所需的工作从人类、从维护者那里分离出来。资金是需要的,建立一个生态系统,激励和指导一个社区,这不是一件小事。在文章的最后,你会听到更多关于这个问题的信息,在那里我提到了赞助应用程序

这篇博文的主要观点是。

  • 它比Helm 2更安全,因为它使用模板而不是依赖Tiller。
  • 它帮助你发现你真正关心的图表选项
  • 不再需要在文档和GitHub仓库中寻找如何安装软件。
  • 它使你的下一步行动通过信息命令变得明显。
  • 它只适用于多架构
  • 它把一切都放在一个屋檐下--应用程序,以及驱动它们所需的CLI

我最兴奋的是复合应用程序,它能够获得复合的好处。我为英国云计算供应商Civo写的一篇博文需要5000字来说明如何使用Cert-Manager将支持TLS的注册表部署到Kubernetes。

Arkade意味着这可以被压缩到4个命令。

arkade install ingress-nginx
arkade install cert-manager
arkade install docker-registry
arkade install docker-registry-ingress \
  --email $EMAIL \
  --domain $DOMAIN

docker login $DOMAIN

但GitOps呢?

GitOps的铁杆粉丝们不太理解为什么需要Arkade,他们批评它是一个必须的工具。他们问为什么要在生产中使用它而不是FluxCDArgo

这就是Arkade的优势所在。

你需要快速安装一些应用程序。也许是在开发中,也许是在生产中。最后,它将使用Istio或Linkerd等项目的官方CLI,或其官方舵手图,最终的结果是它以推荐的方式安装应用。

GitOps工具是很好的东西,继续使用它们吧,但它们不太可能像arkade那样满足你对本地开发的需求。

不要相信我的话。我在文章后面附上了SRE和DevOps工程师的一些说明。

社区--比其各部分的总和还要多

随着arkade的出现,社区和新的贡献者们也想让Kubernetes不再重复。

Ustav Anand为我们设计了一个彩色的标志,这是我认为我自己无法做到的。

Two year update: Building an Open Source Marketplace for Kubernetes

Alistair Hey在arkade的早期就开始贡献力量,并增加了一个SDK,使编写应用程序更加容易,减少重复性。

	postgresql.RunE = func(command *cobra.Command, args []string) error {
		kubeConfigPath, _ := command.Flags().GetString("kubeconfig")
		updateRepo, _ := postgresql.Flags().GetBool("update-repo")

		arch := k8s.GetNodeArchitecture()
		fmt.Printf("Node architecture: %q\n", arch)

		if arch != IntelArch {
			return fmt.Errorf(OnlyIntelArch)
		}

		ns, _ := postgresql.Flags().GetString("namespace")

		if ns != "default" {
			return fmt.Errorf("please use the helm chart if you'd like to change the namespace to %s", ns)
		}

		persistence, _ := postgresql.Flags().GetBool("persistence")

		overrides := map[string]string{}

		overrides["persistence.enabled"] = strings.ToLower(strconv.FormatBool(persistence))

		customFlags, err := command.Flags().GetStringArray("set")
		if err != nil {
			return fmt.Errorf("error with --set usage: %s", err)
		}

		if err := mergeFlags(overrides, customFlags); err != nil {
			return err
		}

		postgresqlAppOptions := types.DefaultInstallOptions().
			WithNamespace(ns).
			WithHelmRepo("bitnami/postgresql").
			WithHelmURL("https://charts.bitnami.com/bitnami").
			WithOverrides(overrides).
			WithHelmUpdateRepo(updateRepo).
			WithKubeconfigPath(kubeConfigPath)

		_, err = apps.MakeInstallChart(postgresqlAppOptions)
		if err != nil {
			return err
		}

		fmt.Println(postgresqlInstallMsg)
		return nil

你会注意到,带有强类型的标志被用来填充舵手图中的数值,我们亲自从values.yaml文件中的几十个选项中策划并泡制出我们认为将是重要的东西。

func MakeInstallPostgresql() *cobra.Command {
	var postgresql = &cobra.Command{
		Use:          "postgresql",
		Short:        "Install postgresql",
		Long:         `Install postgresql`,
		Example:      `  arkade install postgresql`,
		SilenceUsage: true,
	}

	postgresql.Flags().Bool("update-repo", true, "Update the helm repo")
	postgresql.Flags().String("namespace", "default", "Kubernetes namespace for the application")

	postgresql.Flags().Bool("persistence", false, "Enable persistence")

	postgresql.Flags().StringArray("set", []string{},
		"Use custom flags or override existing flags \n(example --set persistence.enabled=true)")

现在发现,大多数人在向Kubernetes集群安装应用时也需要几十个CLI--kubectl、helm、linkerd、kubectx、faas-cli等等。

有一些死忠粉会拒绝使用除brew 以外的任何东西,但brew却不是即时的。当我们从GitHub更新目录时,你有20分钟的时间吗?哦,你的速度有限,最好发一个个人访问令牌,让brew使用它,这样它就可以刮取GitHub的API了。如果你不走运,那么brew也会下载大量的依赖项,并从头开始构建,而你想要的只是一个简单的Go二进制文件,就像现在一样。

这时我想到了arkade get ,它只需从GitHub发布的版本中下载CLI,但这并不像我想象的那么简单。每个人都以不同的方式命名他们的CLI,而且没有标准。

我通过引入Go模板解决了这个问题,这些模板也可以进行单元测试,以确保它们产生正确的URL。

arkade get还需要应对像zip文件这样的档案,以及二进制文件与发行版名称的非标准命名,当你得到/releases/v0.1.0/name_0.1.0.zip ,并突然不得不删除文件名中的额外v,尽管它是规范的发行版名称。

然后是多架构和多操作系统,arkade为你自动处理所有这些问题。

这是定义faas-cli的多架构、多操作系统下载的代码。

	tools = append(tools,
		Tool{
			Owner:       "openfaas",
			Repo:        "faas-cli",
			Name:        "faas-cli",
			Description: "Official CLI for OpenFaaS.",
			BinaryTemplate: `{{ if HasPrefix .OS "ming" -}}
{{.Name}}.exe
{{- else if eq .OS "darwin" -}}
{{.Name}}-darwin
{{- else if eq .Arch "armv6l" -}}
{{.Name}}-armhf
{{- else if eq .Arch "armv7l" -}}
{{.Name}}-armhf
{{- else if eq .Arch "aarch64" -}}
{{.Name}}-arm64
{{- else -}}
{{.Name}}
{{- end -}}`,
		})

这是Helm的Go模板,它使用一个归档文件进行下载。

	tools = append(tools,
		Tool{
			Owner:       "helm",
			Repo:        "helm",
			Name:        "helm",
			Version:     "v3.5.2",
			Description: "The Kubernetes Package Manager: Think of it like apt/yum/homebrew for Kubernetes.",
			URLTemplate: `{{$arch := "amd64"}}

{{- if eq .Arch "armv7l" -}}
{{$arch = "arm"}}
{{- end -}}

{{- if eq .OS "linux" -}}
	{{- if eq .Arch "aarch64" -}}
	{{$arch = "arm64"}}
	{{- end -}}
{{- end -}}

{{$os := .OS}}
{{$ext := "tar.gz"}}

{{ if HasPrefix .OS "ming" -}}
{{$os = "windows"}}
{{$ext = "zip"}}
{{- end -}}

https://get.helm.sh/helm-{{.Version}}-{{$os}}-{{$arch}}.{{$ext}}`,
		})

那单元测试呢?这些测试验证了URLs的产生是否正确。这是我们如何处理kubectl ,它使用一个自定义的下载URL,并且需要一个特殊的URL模板,因为二进制文件不在GitHub上。

func Test_DownloadKubectl(t *testing.T) {
	tools := MakeTools()
	name := "kubectl"

	var tool *Tool
	for _, target := range tools {
		if name == target.Name {
			tool = &target
			break
		}
	}

	tests := []test{
		{os: "darwin",
			arch:    arch64bit,
			version: "v1.20.0",
			url:     "https://storage.googleapis.com/kubernetes-release/release/v1.20.0/bin/darwin/amd64/kubectl"},
		{os: "linux",
			arch:    arch64bit,
			version: "v1.20.0",
			url:     "https://storage.googleapis.com/kubernetes-release/release/v1.20.0/bin/linux/amd64/kubectl"},
		{os: "linux",
			arch:    archARM64,
			version: "v1.20.0",
			url:     "https://storage.googleapis.com/kubernetes-release/release/v1.20.0/bin/linux/arm64/kubectl"},
	}

	for _, tc := range tests {
		got, err := tool.GetURL(tc.os, tc.arch, tc.version)
		if err != nil {
			t.Fatal(err)
		}
		if got != tc.url {
			t.Fatalf("want: %s, got: %s", tc.url, got)
		}
	}
}

很难说有多少人向arkade贡献了应用程序和工具,因为代码曾经住在K3sup中,但我要去看看。

  • k3sup有42个贡献者
  • arkade有39个贡献者

这是我合并的很多单独的PR和提交。我喜欢鼓励贡献者加入OpenFaaS Slack,来学习,如果他们愿意,我会指导他们,让他们对项目应该如何运作提出意见。

Okteto的Ramiro Berrelleza 添加了一个进度条,这有助于像kubectl这样的大型二进制文件。

$ arkade get kubectl
Downloading kubectl
https://storage.googleapis.com/kubernetes-release/release/v1.20.0/bin/linux/amd64/kubectl
38.37 MiB / 38.37 MiB [-----------------------------] 100.00%
Tool written to: /home/alex/.arkade/bin/kubectl

# Add (kubectl) to your PATH variable
export PATH=$PATH:$HOME/.arkade/bin/

# Test the binary:
/home/alex/.arkade/bin/kubectl

# Or install with:
sudo mv /home/alex/.arkade/bin/kubectl /usr/local/bin/

Yankee提出了增加一个下载表的想法,我认为以这种方式表示数据看起来很棒。

+------------------+--------------------------------------------------------------+
|       TOOL       |                         DESCRIPTION                          |
+------------------+--------------------------------------------------------------+
| argocd           | Declarative, GitOps continuous delivery tool for Kubernetes. |
+------------------+--------------------------------------------------------------+
| argocd-autopilot | An opinionated way of installing Argo-CD and managing GitOps |
|                  | repositories.                                                |
+------------------+--------------------------------------------------------------+
| arkade           | Portable marketplace for downloading your favourite devops   |
|                  | CLIs and installing helm charts, with a single command.      |
+------------------+--------------------------------------------------------------+
| buildx           | Docker CLI plugin for extended build capabilities with       |
|                  | BuildKit.                                                    |
+------------------+--------------------------------------------------------------+
| civo             | CLI for interacting with your Civo resources.                |
+------------------+--------------------------------------------------------------+
| cosign           | Container Signing, Verification and Storage in an OCI        |
|                  | registry.                                                    |
+------------------+--------------------------------------------------------------+
| docker-compose   | Define and run multi-container applications with Docker.     |
+------------------+--------------------------------------------------------------+
There are 63 apps, use 'arkade get NAME' to download one.

有太多的贡献者,无法一一提及,但他们每个人都以自己的方式产生了影响。还要感谢Engin DiriCarlos PanatoBatuhan Apaydın

赞助的应用程序

我创建arkade的目的是为了解决Kubernetes生态系统中的痛点,让开发者的生活更美好。

如果你以个人身份使用arkade,你可以通过GitHub赞助我,这样我就可以继续这项工作。

我还想谨慎对待我之前在开源方面的错误,正如Alexis Richardson在2017年KubeCon Austin上第一次告诉我的那样:"如果你的软件太容易使用,从不崩溃,而且功能完整,就不会有人为支持付费"

通过arkade,我想为公司提供价值,我将为他们开发一个专门的应用程序,以改善入职体验。

为什么这很重要?如果你能降低进入的门槛,它可以鼓励实验,我相信 "平均多巴胺时间 "是衡量开发者工具的重要标准。

因此,第一个赞助应用程序是Venafi,你可能听说过他们,当他们收购JetStack时,他们是cert-manager的作者。Venafi关心的是机器身份--也就是说,一切都要有证书,他们也有自己的cert-manager插件。

下面是这个问题和链接的公关和新闻稿,它告诉你这个应用程序是如何工作的,以及它在入职过程中解决了什么痛苦。

我也很高兴地确认,Kasten已经购买了一个赞助应用包,其中包括他们的CLI应用被添加到arkade,以及他们的Kubernetes备份解决方案作为一个应用。每一个赞助应用,我都会写一篇博文,在某些情况下还会举办一次网络研讨会。

我们的想法是让事情变得更简单,然后获得反馈、注册、线索,并成为arkade和赞助商的净赢家。

人们对Arkade的评价如何?

以下是Booking.com的SREIvan Velichko对arkade的评价。

昨天我正在建立一个新的开发环境。Kind, helm, kustomize, kubectl, 所有这些东西。我的看法是--arkade被高度低估了。
过去,我花了一个小时来安装这些工具。有了arkade,它不到十分钟就完成了。

Greg经营Fullstack JS,是一名JavaScript开发者,他说。

这是真正的魔法,在一秒钟内就能让#kubernetes启动并运行;然后启动#openfaas,这是一个免费的比lambda更好的解决方案,使用docker图像。

@arghzero说。

要想安装基本的东西,没有什么比arkade更合适的了,
它可以为你在本地安装常用的cli工具,如kubectl,以及常见的k8s工具包,如ingress-nginx或portainer

@Yankexe说。

现在没有Arkade就很难使用K8s。
我在@lftechnology的团队绝对喜欢它。

来自Michael Cade @ Kasten

我终于可以安装Arkade了,超级简单!
安装这个比argocli独立命令更快,但里面有很多方便的小工具。
另外,Arkade的巧妙之处在于,它不仅可以方便地安装大量不同的应用程序和CLI,你还可以很快得到它们的信息。

阿利斯泰尔和我在夏天录制了一个现场直播,谈论了arkade的工作方式,以及如何添加新的应用程序。

Two year update: Building an Open Source Marketplace for Kubernetes

现在观看。体验Arkade:K8s市场

总结

自从我开始为Kubernetes简化应用程序的查找、配置和安装以来,已经过去了两年,没有大家的帮助,我不可能把项目做到今天这个程度。

目前有47个应用程序,但有几个开放的拉动请求,所以我希望在月底前看到这个数字上升到50。Kubernetes的应用会超过50个吗?当然,但我们正在建立一个集中的市场,提供高质量的应用,这些应用可能会被使用,并由用户的需求驱动。

这种需求是什么样子的?现在有47,000次Arkade的下载,108个版本和2k个GitHub星级。如果我们把那些在代码还叫k3sup的时候入侵的人考虑在内,那么贡献者在50到100人之间。

我们可以安装的CLI列表每周都在增加,有63个应用,都有单元测试和Go模板,当项目为他们的软件发布ARM二进制文件或开始支持Windows时,可以轻松扩展。

如果你想试试arkade,只需一个命令就可以了。

# You move the binary to $PATH
curl -sLS https://get.arkade.dev | sh
mv arkade /usr/local/bin/

# Or have the script move it for you
curl -sLS https://get.arkade.dev | sudo sh

或者如果你是那种不喜欢运行bash的人,请随时阅读该脚本的作用,或者前往发布页面

你能学到什么?

  • 在你的应用程序中添加一个进度条?使用我们的源代码来了解一下吧。
  • 使用arkade get 命令的代码打印一个漂亮的表格
  • 按照我们的例子,为你的工具和开源项目建立一个社区
  • 了解k3sup和arkade如何一起使用。演练--15分钟内将Kubernetes安装到你的Raspberry Pi上

我也鼓励你不要急于求成,强迫你的用户处理YAML或JSON清单。Arkade已经表明,Go与合适的SDK一样好,事实上它甚至可能比YAML更适合这项工作,因为DevOps中的每个人都喜欢讨厌YAML。

前进之路

你想获得关于开发者体验的产品反馈吗?你想学习如何发展一个社区或开源项目吗?与我预约电话