Knative 开源入门第二部分:环境设置 ¶
发布日期:2023-09-18,修订日期:2024-01-17
Knative 开源入门第二部分:环境设置¶
作者:Calum Murray 软件工程实习生 @ Red Hat,以及 Leo Li 软件工程实习生 @ Red Hat
大家好,欢迎回到这个介绍性博客系列!如果您想了解整个博客系列的概述,请查看 第一篇文章。在这篇文章中,我们将讨论如何为 Knative 设置您的开发环境。开发环境是一个您可以修改和检查代码而不会影响当前发布的代码的地方。为了设置您的 Knative 开发环境,我们将开发环境的设置分为本地设置(即您在自己的计算机上设置的内容)和外部设置(即您在自己的计算机上以外设置的内容)。
G. Cresnar Premium, Gear Icon, https://www.flaticon.com/free-icon/settings_563541?term=gear&page=1&position=4&origin=search&related_id=563541
本地设置¶
您将在本地计算机上开始编写代码,因此让我们从本地设置开始。如果您感觉自己已经知道如何设置您的本地系统,或者您已经拥有一个可用的本地设置,请先跳到外部设置部分 - 无需按顺序阅读这两个部分!
先决条件¶
在开始添加本地环境所需的其余组件之前,您的计算机上需要具备一些先决条件。在继续进行本地设置之前,请确保您的计算机上已安装所有这些先决条件。
Bash¶
您的计算机需要安装 Bash 才能运行其他本地组件所需的所有安装/设置脚本。您的计算机很可能已经安装了 Bash(Linux 和 Mac 应该安装了,但您可能希望升级 Mac 上的 Bash 版本)。如果您使用的是 **Windows**,则需要 安装 Bash。或者,Windows 用户可以使用 WSL。
Git¶
为了克隆存储库或下载各种工具,您需要在计算机上安装 Git。如果您想检查是否安装了 Git,请在终端窗口中运行 git --version
。要安装 Git,请按照 此处说明进行操作。
SSH 密钥用于在没有您每次执行拉取、推送或克隆命令时输入凭据的情况下,向第三方代码存储库服务提供商(如 GitHub 或 GitLab)进行身份验证。这种基于密钥的身份验证方法可以提高安全性并方便使用。如果您尚未为 GitHub 或 GitLab 设置 SSH 密钥,我们 **强烈建议** 您这样做。要使用 GitHub 设置 SSH 密钥,请按照 这些说明进行操作,要使用 GitLab 设置 SSH 密钥,请按照 这些说明进行操作。
Golang (Go)¶
Knative 的大部分内容都是使用 Go 编程语言开发的,因此您需要安装这种语言才能开发 Knative。Knative 的某些部分是用其他语言编写的,但我们将在本博客系列的 **第 7 部分**(即将推出!)中讨论这些内容。要安装 go 编程语言,请按照 这篇文章中的说明进行操作。
编辑器¶
为了编辑代码,您需要安装一个编辑器。如今最流行的免费编辑器之一是 VSCode,尽管 JetBrains 的付费编辑器(如 GoLand 和 IntelliJ IDEA)也非常强大。值得注意的是,IntelliJ IDEA 还有一个免费且功能强大的社区版。有些人还喜欢使用传统的 Vim、Emacs 或 Vim 的新分支 Neovim(如果您愿意自行配置,它实际上具有 VSCode 拥有的所有语言支持)。虽然您选择的编辑器不会影响您生成的代码质量,但选择一个编辑器并熟悉它至关重要,因为您的生产力很大程度上取决于您使用编辑器的能力。
在本地运行 Knative¶
现在您已经验证了您拥有所有先决条件,让我们开始设置您的本地系统以运行 Knative!
Docker/Podman 设置¶
Knative 在 Kubernetes 集群中运行,这意味着它作为一组容器运行。您可以将容器视为包含代码和运行代码所需的所有依赖项的内容,以及用这些打包的依赖项运行代码的内容。用于构建和运行容器的两个最常见的工具是 **Docker** 和 **Podman**,因此我们将在这里讨论如何设置这两个工具。但是,请注意,我们认为 **使用 Docker** 更容易,因此我们建议您使用 Docker。
选项 1:设置 Docker¶
设置 Docker 的第一步是安装它。最简单的方法是 安装 Docker Desktop,尽管您只需要 Docker Engine 才能使用 Knative,因此您也可以 安装 Docker Engine。注意:如果您只计划安装 Docker Engine,请确保您完成了 安装后步骤。
在您的系统上安装 Docker 后,您需要登录到容器注册表。您可以使用多个不同的注册表。首先,您可以使用 Docker 帐户登录到 Docker Hub。要创建一个帐户,您可以在这里注册。拥有帐户后,您只需要键入 docker login
并按照说明进行操作。另一个选择是使用 Quay.io 上的注册表,或者创建一个本地注册表。如果您使用这两种方法中的任何一种或其他一些注册表,您只需要使用 docker login <registry_url>
登录,然后按照终端中的提示操作。例如,要登录到本地注册表,您只需要运行 docker login localhost:8080
,要登录到 Quay,您只需要运行 docker login quay.io
。
选项 2:设置 Podman¶
如果您想使用 Podman 而不是 Docker,那么您很幸运 - 它们具有兼容的 CLI!因此,您只需安装 Podman,然后将 docker 设为 podman 的别名。要创建此别名,您必须
-
如果您使用的是 bash,请将
alias docker=podman
添加到您的.bashrc
文件中。 -
如果您使用的是 zsh,请将
alias docker=podman
添加到您的.zshrc
文件中。 -
如果您使用的是 fish,请将
alias docker=podman
添加到您的config.fish
文件中。
与设置 Docker 类似,在将 Podman 安装到您的系统中并设置好别名后,您需要拥有一个 docker 注册表帐户并运行 docker login
。但是,您需要提供要登录的注册表。因此,您需要运行 docker login docker.io
。再次注意,我们建议使用 Docker 而不是 Podman。
Minikube/KinD 设置¶
现在,您已经在计算机上安装了 Docker 或 Podman 的容器引擎,您就可以创建本地 Kubernetes 集群来运行 Knative!有许多不同的本地 Kubernetes 版本可用,但我们发现 minikube 往往效果最好。要安装 minikube,请按照他们的入门指南中的步骤操作,直到您到达“部署应用程序”部分。
在调试或重现错误时,您通常需要创建一个新的 minikube 集群。为此,您可以使用 minikube delete
删除当前集群,然后运行 minikube start
来创建一个新集群。注意:minikube start
将恢复/更新现有的集群(如果存在),因此如果您要获取一个新的集群,请**务必先删除您的集群**。Minikube 将根据您的操作系统和系统配置自动选择首选驱动程序。如果您要指定 minikube 应该使用的驱动程序,可以在启动集群时使用 --driver
参数。例如,如果您想使用 Docker 驱动程序,则可以运行 minikube start --driver=docker
。
另一个在本地运行 Kubernetes 的好选择是KinD。如果您想安装 KinD,只需按照其网站主页上的安装说明操作即可。要在 KinD 中创建一个集群,您只需运行 kind create cluster
。同样,要删除一个集群,您可以运行 kind delete cluster
。注意:KinD 运行在 Docker/Podman 之上,因此您需要在系统上安装并运行其中一个才能使 KinD 工作。
ko、kubectl¶
在通过运行 minikube 启动 Kubernetes 集群后,您可能希望与它进行交互!与集群交互的方式是通过命令行界面 (CLI) 工具 kubectl。您可以在这里安装 kubectl,或者您可以通过将 alias kubectl="minikube kubectl --"
添加到 shell 的相应配置文件中,为与 minkube 附带的 kubectl 安装添加别名。
您可以使用 kubectl 通过运行 kubectl get <resource_type> -A
获取特定类型的资源。例如,如果您想获取集群中的所有 pod,则可以运行 kubectl get pods -A
。要按命名空间筛选,可以使用 -n
标志。例如,您可以通过运行 kubectl get pods -n knative-eventing
获取 knative-eventing
命名空间中的所有 pod。如果您想将资源应用于您的集群(例如安装 Knative、创建服务或代理),则可以运行 kubectl apply -f <filename_or_directory>
。如果您想递归地应用目录及其子目录的所有内容,则可以使用 -R
标志:kubectl apply -Rf <directory>
。
在开发 Knative 时,您经常会使用 kubectl,但您也会使用一个类似的工具,称为 ko
。ko
是一个软件包,它处理根据正在应用的配置文件构建所有 Go 容器镜像,是我们用来构建 Knative 的工具。要安装 ko,请按照这些步骤操作。
如果您想构建 Knative(或者使用适当的 yaml 配置文件以 go 编写的其他内容),您只需运行 ko apply -f <filename_or_directory>
,它将构建文件中或目录中引用的所有内容,并将这些对象应用到您的集群中。请注意,您提供给 ko 的文件名或目录不是 go 文件名,而是 yaml 文件 - 从这个意义上说,ko 的操作方式与 kubectl 相同,通过应用 yaml 文件。此外,它可以像 kubectl 使用 -R
标志一样递归地使用。
安装 Knative¶
Knative 作为一组自定义资源、控制器和 pod 在您的集群中运行。也就是说,它是 Kubernetes 原生的。因此,您在本地运行 Knative 所需的只是本地 Kubernetes 集群(例如 minikube 或 KinD),以及一种将源代码构建到容器中并使用这些镜像应用 Kubernetes 资源的方法(ko)。在运行 minikube start
以确保您的集群正在运行后,您可以按照文档中列出的步骤,使用 ko 应用其中一个存储库的 config
目录,或者使用 git 存储库 kn-box 中的出色脚本集,将 Knative 安装到您的集群中。无论您选择哪种方法,您只需要应用一些 yaml 文件或运行一些 bash 脚本,您就可以在本地运行 Knative!
现在,如果您想运行本地编辑的 Knative 代码,您将不得不使用 ko。如前所述,您通常可以通过运行 ko apply -Rf config/
来构建和应用整个项目。但是,您应该始终参考您正在处理的存储库中的 CONTRIBUTING.md
和 DEVELOPMENT.md
文件,因为它们将包含更具体的说明。
此时,您应该拥有一个本地 Kubernetes 集群,并在其上运行 Knative。这是一个学习更多关于如何使用 Knative 的绝佳机会!您可以在自己的集群中轻松地按照Knative 和KubeByExample 网站上的教程进行操作。
运行测试¶
Knative 拥有大量的测试,从单元/构建测试到集成测试。一般来说,单元/构建测试是验证代码是否编译以及每个单独的组件是否正常工作。另一方面,集成测试是验证不同的组件是否能够协同工作。总的来说,我们**不建议**在本地运行集成测试,因为它们需要大量的时间和资源才能运行。相反,我们建议您在单元测试通过后将更改直接推送到 GitHub,并在那里运行集成测试。
每个存储库都将包含有关如何运行其单元测试的说明,因此请查看 CONTRIBUTING.md
和 DEVELOPMENT.md
文件以了解这些测试的运行方式。如果它们是 go 测试(很可能是这样),那么您也可以通过运行 go test -v -race -count=1 <filename_or_directory>
来运行子目录或特定文件上的测试。这非常方便,因为它可以减少在您进行更改时的反馈循环。
设置您的编辑器¶
现在您已经拥有了一个可以运行和测试对 Knative 的更改的本地环境,让我们设置一个可以进行更改的环境!首先,让我们为您的 IDE 安装一些有用的插件。
有用的 IDE 插件¶
我们在这里分享的插件是我们发现最实用的插件,当然还有更多有用的插件可以探索!如果您发现任何可能让其他社区成员感兴趣的东西,请与我们在 Slack 上分享。
Kubernetes¶
Kubernetes 插件是面向开发人员的综合工具,它为在 Kubernetes 环境中构建和调试应用程序提供了完整的解决方案。您可以通过 Kubernetes 资源的直观浏览器树轻松地与 Kubernetes 资源进行交互和浏览,例如 pod 的日志。
如果您使用的是 VSCode,这里是如何设置您的Kubernetes 插件
安装插件后,您将能够在这里看到它
如果您使用的是 Jetbrains IDE,这里是如何安装Kubernetes 插件
安装插件后,您将能够在这里看到它
语言支持¶
VSCode 是一款多功能文本编辑器,旨在通过语言服务器协议支持多种编程语言。相比之下,JetBrains IDE 是特定于语言的 - GoLand 用于 Go,Pycharm 用于 Python,等等。为了使 VSCode 为语言提供 IDE 风格的支持,您必须安装该语言所需的插件。同样,在 JetBrains 中,您通常可以为特定语言安装插件,即使 IDE 不支持该语言,但有时您需要为相应的许可证付费。由于 VSCode 需要插件才能为语言提供 IDE 功能,我们建议您安装以下插件
代码格式化¶
Go 代码具有内置的样式指南和格式化程序,因此自然地,您可以使用 VSCode 和 JetBrains IDE 配置它。对于 VSCode,您可以按照以下步骤操作
对于 JetBrains,您可以在这篇文章中找到有关如何设置它的更多详细信息。
外部设置¶
现在您已经拥有了一个正常工作的本地设置,还有一些外部内容也需要您设置。这些可以根据如何加入社区、如何申领问题以及如何创建 PR 进行分组。
社区¶
在编写代码时,你可能想要与他人讨论你的更改并提出问题。Knative 使用 **Slack** 作为主要沟通方式,以及 **邮件列表**。你可以 在这里 找到这些沟通渠道的链接。我们还定期在 Zoom 上举行每周和双周工作组会议,你可以参加这些会议进行讨论。要查找社区日历(包括工作组会议时间和链接),以及 Slack 和邮件列表的链接,你可以 阅读这篇文章。
认领问题¶
现在你已经拥有了可用的本地设置,你可能想要处理一个问题!要认领问题,请前往你想要贡献的仓库的 "Issues" 选项卡,然后浏览问题。如果这是你对该仓库的首次贡献之一,你应该查找标有 "good-first-issue" 的问题。要按特定标签筛选问题,请按照 这里 说明的步骤操作。如果没有标有 "good-first-issue" 的问题,你也可以在 Slack 上询问是否有适合你的问题。此外,如果标有 "good-first-issue" 的问题都被认领了,你可以尝试在这些问题上发表评论,看看它们是否仍在积极处理中。一旦你找到想要处理的问题,请评论 "/assign",Prow 机器人会将它分配给你(稍后我们会详细介绍 Prow!)。
拉取请求¶
最终,当你完成代码更改后,你将需要创建一个拉取请求。如果你不熟悉此过程,请查看本系列文章中的上一篇!当你对 Knative 仓库创建 PR 后,你可能会注意到一些机器人正在对其发表评论!
如果这是你对 Knative 的第一个 PR,将会有一个 CLA 机器人,确保你已签署了 CLA。其他机器人是为了更轻松地管理 PR 和测试。由于你只需要处理一次 CLA,我们先介绍一下 CLA,然后讨论如何与 Prow 交互来管理你的 PR。
CLA¶
那么什么是 CLA 呢?CLA 代表贡献者许可协议,这个名称很好地解释了它是什么。这是一个协议,你(贡献者)授予云原生计算基金会 (CNCF) 各种权利。我们在这里不会详细介绍协议中的内容,因为你应该 **在签署之前自行阅读**。但是,我们会告诉你一个示例,说明为什么像 Knative 这样的社区需要这个协议。有时,项目希望重新授权其包含的代码。由于你拥有你所贡献代码的版权,这意味着项目将不得不向每个曾经贡献过代码的人询问他们是否愿意重新授权,这可能很困难。你可以在 这里 找到 CNCF CLA。
Knative **要求在我们可以接受你的贡献之前签署 CLA**,因此你必须在你的 PR 被合并之前签署它。请注意,CLA 有两个版本:企业版和个人版。如果你以公司员工的身份贡献代码,你需要签署企业版,否则个人版适合你!要签署 CLA,你只需按照 CLA 机器人发布到你的 PR 的评论中的步骤操作即可。
与 Prow 交互¶
Prow 是一个基于 Kubernetes 的机器人,在许多 CNCF 项目中用于管理问题和 PR。在 Knative 中,通常是 Prow 合并 PR,而不是其他贡献者或维护者!为了确定要合并哪些 PR,Prow 被赋予了一组标准。这些标准通常是一组标签,以及所有必需的测试都已通过。在 Knative 中,你的 PR 要被合并需要两个标签:"lgtm" 和 "approved"。任何人都可以通过在 PR 上评论 "/lgtm" 来添加 "lgtm",但只有批准者才能添加 "approved" 标签。此外,如果你有一个 "do-not-merge/hold"(你可以通过评论 "/hold" 添加)或一个 "do-not-merge/work-in-progess" 标签(你可以在创建草稿 PR 时获得),机器人将不会合并你的更改。
为了让你的 PR 上的测试通过,它们需要运行。但是,默认情况下,它们不会运行!为了让它们运行,knative 或 knative-sandbox 组织的成员必须评论 "/ok-to-test"(他们必须是哪个组织的成员取决于你的仓库位于哪个组织下)。"/ok-to-test" 命令会将 "ok-to-test" 标签添加到你的 PR。一般来说,审阅你的 PR 的人会执行此操作,但如果他们没有这样做,你始终可以询问他们为什么没有这样做。如果你加入了 knative 或 knative-sandbox 组织,你将不再需要在你的 PR 上应用 ok-to-test 标签 - prow 将自动运行测试!因此,在你做出几次贡献后,请加入这些组织!
正如我们之前提到的,要将一个问题分配给自己,你可以评论 "/assign",Prow 会将该问题分配给你。你也可以执行 "/assign @用户名",Prow 会将该问题分配给用户名对应的用户。你也可以将该命令与 PR 一起使用,将其分配给特定用户。
你可能想要在你的 PR 上做的事情是,如果其中一个测试失败并且你认为是偶然事件,请重新运行测试。为此,只需评论 "/retest" 以重新运行所有测试,或评论 "/retest-required" 以仅重新运行所有失败的和必需的测试。
你还会发现一个有用的命令是 "/cc @用户名",它会请求用户名对应的用户的审阅。你可以在此命令中添加多个用户,并在一次操作中请求多个审阅(例如 "/cc @用户1 @用户2")。
要了解 Knative 的 Prow 实例支持的所有命令及其用法,你可以阅读 Prow 命令页面。