砥砺奋进谱新篇,且看旧貌换新颜。欢迎访问新的 IBM Developer 中文网站! 了解详情

面向 Kubernetes 开发者的设置指南

本设置指南主要面向正在或将要参与 Kubernetes 开源项目以及为之做贡献的开发者、技术作家和测试人员。例如,它适用于以下各类人员:想要为 Kubernetes 进行文档编辑、代码修复和草拟新功能;开发和使用各种使用 Kubernetes API 的应用程序,如概要分析、监视和集成工具;开发专门利用 Kubernetes 功能集的服务。

文章一开头先介绍了基础知识。接下来将帮助您设置开发环境。随后,您将了解如何在 Kubernetes 项目中使用 GitHub 和 Git。最后几部分则在开发、构建和测试方面提出了一些建议,您因而可以为 Kubernetes 项目贡献有用的代码。

一些基础问题

如果您是 Kubernetes 新手,在我们开始之前,您可能会遇到一些问题。

什么是 Kubernetes?

Kubernetes 是一组用 go 编写的应用程序。这些应用程序一起形成了管理容器的交互式平台。

Kubernetes 源代码位于何处?

Kubernetes 在 GitHub 上提供。

Kubernetes 是 OSS 吗?

Kubernetes 是 Google 捐赠给云原生计算基金会 (CNCF) 的开源软件。

Kubernetes 在何处运行?

Kubernetes 可在许多操作系统/分发版上运行。但是,本指南将向您展示在 Ubuntu 上开发和测试 Kubernetes 的设置步骤。

前提条件

要遵循此设置指南,您需要满足以下前提条件:

  • 具有一个 GitHub 帐户
  • 掌握 Git、bash 和 Linux 方面的基础知识

预估时间

在按照本设置指南中这些步骤的顺序执行操作时,各个步骤的预估时间完全由您来决定。一些开发者会使用跳过链接,他们或许只是将本文用作参考。而另一些人则可能需要半天、一整天甚至几天乃至一周的时间,例如,您遇到了很多问题,或者对 OSS 开发、测试或 Linux 很陌生。

为解决此类时间差异,我提供了一些可跳过的地方。当某些操作即使是专家也需要花费很长时间时,我会告诉您。我还会提供一些捷径,让您能够从小处着手构建和测试,从而加快速度。具体操作需要多长时间取决于您的硬件。例如,某些测试操作在速度较快的集群上可能只需要 10 分钟,而在速度较慢的笔记本电脑上则有可能需要长达 20 个小时。

您的开发环境

首先创建基本的 Kubernetes 开发环境:

如果您已按照自己喜欢的方式完成了所有设置,可随时跳至 GitHub 和 Kubernetes 项目

设置您的主机操作系统

您需要做的第一件事就是安装 Ubuntu。Ubuntu 16.04 或 18.04 LTS 服务器或桌面版就足够用了。您也可以使用较新的非 LTS 发行版,这取决于您。我现在通过最新的 Virtual Box 在 iMac 上的虚拟机 (VM) 中运行 16.04 LTS 桌面版,通过 Virtual Box 在 Mac 笔记本电脑上运行 18.04 LTS 桌面版,在使用最常用零部件组装的裸机服务器上则运行 18.04 LTS 服务器版。

您当然可以使用虚拟机进行 Kubernetes 开发,我就是这样做的,所以,如果您没有资源来构建自己的服务器,请不要灰心。

要在 Virtual Box 上设置 Ubuntu,应完成以下步骤:

考虑以下有关 Virtual Box 设置的建议:

  • 基本内存 8g
  • 140g vdi 硬盘驱动器
  • 共享剪贴板 — 仅双向(如果安装桌面版)
  • 显存 128mb(如果安装桌面版)
  • 网络:NAT
  • 必须安装访客附加组件(如果是桌面版,单击 VirtualBox VM > Devices > Insert Guest Additions CD Image…)
  • 端口转发规则(参阅高级 Network 部分中的按钮):

    Virtual Box 中的端口转发规则

设置 Ubuntu

如果使用 Ubuntu 桌面版,则创建一个终端:

Ubuntu 终端

然后运行软件更新程序:

Ubuntu 软件更新程序

以下截屏展示了如何从终端运行 apt-get 更新:

从终端运行 apt-get 命令

使用并配置 ssh

如果安装了 Ubuntu 桌面版并且要运行 ssh,可完成以下步骤以开始使用 ssh:

使用您的 PC 或 Mac 客户端通过 ssh 连接到您的 Ubuntu 服务器或桌面版。如果安装了 Ubuntu 桌面版并希望运行 ssh,则运行以下命令:

$ sudo apt-get install openssh-server
$ sudo service ssh start or sudo /etc/init.d/ssh start
$ ssh -v localhost

然后从客户端机器(使用密码)登录到 ssh 服务器:

登录到 ssh 服务器

对于可选的无密码 ssh,完成以下步骤:

运行端到端 Kubernetes 测试以往通常需要配置无密码的 ssh(使用密钥而不是密码)。如果您不想设置无密码的 ssh,可直接跳至安装 Go

首先使用以下命令生成 Ubuntu 公钥和私钥:

$ ssh-keygen -t rsa

然后使用默认位置并输入密码,或者只按 ENTER 键:

$ ssh-copy-id mike@10.0.2.15

在 Mac 上,从 ~/.ssh 目录运行以下命令以生成密钥:

$ ssh-keygen -b 1024 -t rsa -f id_rsa -P ""

将 Mac 公钥(例如,cat ~/.ssh/d_rsa.pub)复制粘贴到您的 ubuntu guest /home/user/.ssh/authorized_keys 文件中。

接下来,为无密码 ssh 配置 Ubuntu 访客:

$ sudo nano /etc/ssh/sshd\_config

对 UN 注释/配置进行以下编辑:

PubkeyAuthentication yes

AuthorizedKeyFile %h/.ssh/authorized\_keys

PasswordAuthentication no

PermitRootLogin without-password

重新启动:

$ sudo service ssh restart or sudo /etc/init.d/ssh restart

然后,进行测试:

$ ssh mike@ubuntu (ubuntu = hostname) or 127.0.0.1 or 10.0.2.15 ...

确保正常工作,然后退出。

由于您将通过无密码形式以 root 用户身份登录,因此可以采取一种便捷方法,将用户公钥和私钥以及 authorized_keys 复制到 /root/.ssh,例如:

$ sudo cp ~/.ssh/authorized_keys /root/.ssh/authorized_keys (you may have to mkdir /root/.ssh)
$ sudo cp ~/.ssh/id_rsa /root/.ssh/id_rsa
$ sudo cp ~/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub

您现在应能从 Mac 终端上的用户帐户,以 root 用户或普通用户身份不使用密码通过 ssh 连接到访客 Ubuntu:

终端 1:

ssh -p 2222 root@127.0.0.1

终端 2:

ssh -p 2222 mike@127.0.0.1

您还应该能利用 Ubuntu 主机上的用户帐户或 root 用户帐户,通过 ssh 连接到 Ubuntu 主机上的用户帐户和 root 用户帐户:

$ ssh root@10.0.2.15
$ sudo ssh root@10.0.2.15

安装 Go

在安装时,确保安装 Kubernetes 支持的最新版本的 Go(或尽可能接近)。

https://golang.org/dl/ 中选择所需的版本,然后使用 curl 将其下载到本地主机:

  $ curl -O https://storage.googleapis.com/golang/go1.13.9.linux-amd64.tar.gz

完成以下安装步骤:

$ tar -xvf go1.13.9.linux-amd64.tar.gz
$ sudo mv go /usr/local
$ rm go1.13.9.linux-amd64.tar.gz

为适用的用户配置环境变量,例如,当前登录的用户 (~):

$ sudo nano ~/.profile

$ sudo nano /root/.profile

现在,通过添加以下行将导出路径语句添加到这些文件:

$ export PATH=$PATH:/usr/local/go/bin:/home/mike/go/bin

注:/usr/local/go/bin 用于运行 go 随附的 go 二进制文件,/home/username/go/bin 用于运行您使用 go 构建的任何 go 应用程序。

测试配置:

$ go version

go version go1.13.9 linux/amd64

要以 sudo 方式运行用户个人资料编辑,可运行以下命令:

$ sudo su --

# source /home/mike/.profile

尽管风险更大,但您可以 root 用户身份登录并通过 visudo 更改 sudo secure_path 来添加 go 的路径:

# visudo

编辑默认 sudo secure_path

Defaults
secure\_path=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/go/bin:/home/mike/go/bin\"

测试您的 sudo 配置:

$ sudo go version

go version go1.13.9 linux/amd64

安装 Docker 和 containerd

有关更多信息,可参阅在 Ubuntu 上安装 Docker Engine

要安装 Docker,应先更新软件包:

$ sudo apt-get update

然后移除任何先前版本:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

安装 https 传输支持:

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common

添加 Docker 的 GPG 密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

将 Docker 的稳定发行版添加为 apt 存储库:

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

安装最新稳定版本的 Docker 和 containerd:

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

要选择特定版本的 Docker,可运行以下命令:

$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

测试您的 Docker 安装:

$ sudo docker run hello-world

将您自己添加到以 sudo 方式运行的 Docker 组中,因此您无需输入 sudo 即可运行 Docker:

$ sudo usermod -aG docker mike

重新引导您的 Ubuntu 主机:

$ sudo shutdown -r

重新引导完主机后,使用 ssh 重新登录到您的主机,然后再次测试 docker,这次不使用 sudo:

$ docker run hello-world

安装构建工具

运行以下命令:

$ sudo apt-get install build-essential

安装 jq

运行以下命令以安装 jq(JSON 处理器):

$ sudo apt-get install jq

安装 python-pip 和 pyyaml

运行以下命令以安装 python-pip 和 pyyaml:

$ sudo apt-get install python-pip

$ sudo pip install pyyaml

GitHub 和 Kubernetes 项目

首先,让我们看一下如何建立分支,然后克隆您的分支。接着,介绍一些关于个人资料和客户端配置的注意事项。最后,您将了解 Kubernetes 项目的 Git 工作流。

建立分支

在 GitHub 上为以下项创建开发分支:

克隆您的分支

通常,在克隆 github.com 源代码存储库时,您可以使用 $GOPATH/src/github.com 路径或 ~/go/src/github.com/projectname 路径(表示 GitHub 中源代码的路径)。这样可以方便使用 go get 类型命令拉取 GitHub 托管的数据包。

但是,出于遗留的原因,Kubernetes 包被命名为 k8s.io/kubernetes,而不是您可能想到的 github.com/kubernetes/kubernetes。因此,要让所有开发工具正常工作并能在磁盘上找到您的数据包代码,就需要将克隆版本放在 k8s.io 目录中。

使用以下步骤从您的 name/kubernetes 分支创建 k8s.io/kubernetes 源代码树:

mike@mike-VirtualBox:~/go/src$ mkdir k8s.io
mike@mike-VirtualBox:~/go/src$ cd k8s.io
$ git clone https://github.com/mikebrow/kubernetes.git
$ git clone https://github.com/mikebrow/website.git
$ git clone https://github.com/mikebrow/test-infra.git

结果:源文件从您的分支复制(克隆)到 go/src/k8s.io/kubernetesk8s.io/website 目录。Git 在您的本地硬盘上为您的 git hub 分支创建一个主分支。

检查分支的状态:

$ cd kubernetes

$ git status

On branch master
Your branch is up-to-date with 'origin/master`.
nothing to commit, working directory clean

GitHub 个人资料建议

考虑以下 GitHub 个人资料建议:

  • 向您的公开个人资料添加一个电子邮箱
  • 启用双因素身份验证

Git 客户端配置建议

考虑以下客户端配置建议:

user.* 条目设置为全局和/或本地:

$ git config --local user.name "full name here"

$ git config --local user.email "email address here"

$ git config --global user.name "full name here"

$ git config --global user.email "email address here"

让推送变得更容易:

$ git config --global push.default simple

运行以下命令,这样就不需要每次都记住 GitHub 凭证:

$ git config credential.helper store

告知 git 跟踪针对 kubernetes/kubernetes 在您的硬盘上对克隆分支的更改:

$ git remote add upstream https://github.com/kubernetes/kubernetes.git

运行 git config -l 的结果应类似于:

user.name=Mike Brown
user.email=brownwm@us.ibm.com
push.default=simple
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://github.com/mikebrow/kubernetes.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.upstream.url=https://github.com/kubernetes/kubernetes.git
remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/*
credential.helper=store

Kubernetes 开源项目的 Git 工作流

下图显示了一个查找和修复 GitHub 上开源产品问题的典型 Git 工作流。尽管此工作流是为 Docker 设计的,但它也适用于 Kubernetes。

从终端运行 apt-get 命令

在下面的 Kubernetes 问题中找到要处理的内容:https://github.com/kubernetes/kubernetes/issues

Kubernetes OSS 中的问题截屏

在您找到的问题上添加一条注释。

如果您有任何疑问,尽管大胆提出。

如果希望解决问题,请说出您的问题。例如,添加一个句子,说明您正在调用 #dibs,以表明您正在解决此问题。

如果您不确定自己能否解决该问题,至少应该使用 #investigating 表明您正在执行调查分析。虽然没有为您分配,但这会让其他人知道您以后可能会调用 dibs。

Kubernetes 开发(安装 etcd)

在构建 Kubernetes 之前,您需要安装 etcd。Kubernetes 随附以下脚本来安装 etcd:

$ hack/install-etcd.sh

将显示的 etcd 路径添加到您的用户个人资料。例如,使用以下命令将 /home/mike/go/src/k8s.io/kubernetes/third_party/etcd 添加到您的路径:

$ sudo nano ~/.profile

$ sudo nano /root/.profile

如果需要,可将其添加到 sudo 的 secure\_path

$ sudo su -
# visudo

现在,安全路径应类似如下:

Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/go/bin:/home/mike/go/bin:/home/mike/go/src/k8s.io/kubernetes/third_party/etcd"

重新引导您的主机:

$ sudo shutdown -r

重新引导完主机后,使用 ssh 重新登录到您的主机,然后测试 etcd:

$ etcd --version
$ sudo etcd --version

使用 make 构建 Kubernetes

使用 help 目标显示 make 选项:

$ make help

一些免责声明和警告:首次构建、验证和测试时,Kubernetes 需要很长时间,因为它正在构建和下载大量的大型容器镜像。某些下载可能会失败,这会在您首次甚至是第二次尝试运行它们时,导致意外的构建和测试失败。另外,由于测试的某些或许多部分可能会发生“主要”错误,而您将在这些错误基础上构建,并且某些错误仅在长时间超时后才会发生,因此需要耐心。即使所有内容都已下载且没有任何错误,构建、验证和测试步骤预计也要花费大量时间。

如果要构建一切以在本地运行 Kubernetes,可使用 all 目标:

$ sudo make all

如果只想构建软件包/可执行文件之一,可使用 make WHAT=cmd/package\_name。例如,要构建 kublet 服务器,可运行以下命令:

$ sudo make WHAT=cmd/kublet

根据您所做的更改,可能不会始终构建客户端/服务器软件包。如果要强制同步二者(清除/移除构建二进制文件),可使用 clean:

$ sudo make clean

要生成发行版,可运行以下命令:

$ sudo make release

要在不运行测试的情况下生成发行版,可运行以下命令:

$ sudo make release-skip-tests

测试 Kubernetes(单元和集成测试)

在将更改提交到本地开发分支之前,建议您先运行验证、单元和集成测试。根据更改的类型,您可能还需要运行端到端测试存储桶。

在将 PR 推送到 kubernetes/kubernetes 之前,构建要完成的验证测试(例如,预提交验证):

$ sudo make verify

针对单元测试运行以下命令:

$ sudo make test

仅针对 pkg/api/pod 测试运行以下命令:

$ sudo make test WHAT=./pkg/api/pod

仅在详细模式下运行 kubelet 测试:

$ sudo make test WHAT=./pkg/kubelet GOFLAGS=-v

在详细模式下运行 pod 和 kubelet 测试:

$ sudo make test WHAT="./pkg/api/pod ./pkg/kubelet" GOFLAGS=-v

针对集成测试运行以下命令:

$ sudo make test-integration

针对 kubelet 集成测试运行以下命令:

$ sudo make test-integration WHAT=./test/integration/kubelet

在详细模式下运行 pod 集成测试:

$ sudo make test-integration WHAT=./test/integration/pods GOFLAGS="-v"

Kubernetes 端到端测试

以下部分展示如何运行 Kubernetes 端到端或 e2e 测试。

1. 安装 kubetest

运行以下命令来安装 kubetest:

$ cd ../test-infra
$ sudo GO111MODULE=on go install ./kubetest
$ cd ../kubernetes

2. 启动本地集群

运行 Kubernetes e2e 测试需要使用集群。e2e 测试可在任何兼容 Kubernetes 的集群上运行。本指南展示了如何创建一个在 Linux 环境中运行的单节点集群。如果遵循上述说明,那么该集群将在裸机上的 VM 或 Ubuntu 主机中以 Ubuntu 访客帐户运行。您使用了两个终端。

有关端到端测试的注意事项:对于默认的 e2e 测试选项,当客户端和服务器的版本不同步时,将不会运行 e2e 测试。现在可以通过设置 check_version_skew=false,对不一致的版本运行 e2e。

在终端 1 中,构建 Kubernetes 并启动您的本地集群:

$ sudo make clean
$ sudo make
$ sudo PATH=$PATH hack/local-up-cluster.sh

在终端 2 中,将 kubectl 配置为与本地集群交互:

$ export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig

检查您的单节点本地集群的状态:

$ cluster/kubectl.sh get nodes

NAME        STATUS    AGE
127.0.0.1   Ready     3h

3. 运行 e2e 测试

在终端 2 中,运行 e2e 密钥测试存储桶:

$ sudo kubetest --provider=local --test --test_args="--minStartupPods=1 --ginkgo.focus=Secrets"

注:minStartupPods 设置为 1,以反映本地集群中只有一个节点。

现在运行所有 e2e 测试(这需要很长时间才能完成):

$ sudo kubetest --provider=local --test --test_args="--minStartupPods=1"

完成 Kubernetes 集群的使用后,可在终端 1 中使用 ctrl-C 快速将其关闭。

有关端到端测试的更多信息,可参阅 e2e-tests

Kubernetes 端到端节点测试

以下部分展示如何运行 Kubernetes 端到端节点测试,也称为 e2e-node 测试。

1. 安装 ginkgo

运行以下命令:

$ sudo go get -u github.com/onsi/ginkgo/ginkgo
$ sudo go get -u github.com/onsi/gomega/...

2. 启动集群

在终端 1 中,启动您的本地单节点集群:

$ sudo PATH=$PATH hack/local-up-cluster.sh

在终端 2 中,将 kubectl 配置为与本地集群交互:

$ export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig

3. 运行 e2e-node 测试

在本地运行 Sysctls e2e-node 测试:

$ sudo make test-e2e-node PARALLELISM=1 FOCUS=Sysctls

运行所有 e2e-node tests(这需要很长时间才能完成):

$ sudo make test-e2e-node PARALLELISM=1

有关端到端节点测试的更多信息在 e2e-node-tests 文档中提供。

构建生成的文件

kubernetes/kubernetes 树中编辑用于生成其他源文件的源文件之后,必须在执行 git commit 之前更新生成的文件。运行以下命令:

$ sudo make update

Running update-generated-protobuf
Running update-codegen
Running update-generated-runtime
Running update-generated-device-plugin
...

Kubernetes 文档网站

如果您想为 Kubernetes 文档贡献一份力量,可遵循这些说明进行操作。

其他事宜

您不应该就此止步,还应该执行其他一些任务:

  • 在提交更改之前,在每个更改的文件上运行 gofmt -s -w file.go
  • 在提交更改之前,在每个更改的文件上运行 golint。(Kubernetes 团队目前没有使用 lint。但它不会造成任何影响。)
  • 在创建或修改功能时,记得更新文档。
  • 记住添加测试案例来包含您的更改。
  • 在提交修复方法或关闭问题时,应在以下提交消息中引用它们:Closes #XXXXFixes #XXXX
  • 在每次提交后,运行测试套件并保证通过测试。
  • 在编码的过程中频繁地同步和执行 rebase,以跟上主节点的进度。

结束语

我希望本指南可帮助您开始 Kubernetes 开发之旅。查看并遵循 Kubernetes 社区准则,成为成功的贡献者、成员、审查者、批准者(又名“提交者”、“维护者”)和/或子项目负责人。

您可以通过 brownwm@us.ibm.comhttps://twitter.com/mikebrow 与我联系。

本文翻译自:Setup guide for Kubernetes developers(2020-05-15)