IBM Developer 中国团队
发布: 2017-02-15
Kubernetes 是一组用 go 编写的应用程序。这些应用程序一起形成了管理容器的交互式平台。 Kubernetes 也是开源的,可在 GitHub 上获得。 Kubernetes 由 Google 捐赠给 Cloud Native Computing Foundation。Kubernetes 可在许多操作系统上运行。但是,对于本指南,我们将展示如何通过设置 Ubuntu 并在其上开发和测试 Kubernetes。
开发环境需求
基本的 Kubernetes 开发环境具有以下要求:
- Linux 终端
- ssh
- golang
- Docker
- Git 和 GitHub 帐户
- godep
如果您已使用自己喜欢的方式完成所有这些设置,那么可以跳到”分支和克隆”。
在虚拟机上设置主机操作系统
您需要做的第一件事就是安装 Ubuntu。Ubuntu 16.04 LTS 服务器或桌面版就足够用了。也可以使用 14.04、15.10 等版本,决定权在您手上。我在 Mac® 上的一个虚拟机 (VM) 中通过最新的 Virtual Box 运行 Ubuntu 16.04 LTS。在 Virtual Box 上设置 Ubuntu:
- 下载并安装 Virtual Box
- 下载一个 Ubuntu 16.04 ISO 文件(服务器/桌面版)
- 使用刚下载的 Ubuntu ISO 创建一个新 vbox。
Virtual Box 设置(建议)
基础内存 4g
80g vdi 硬盘
共享剪贴板 – 仅双向(如果安装桌面版)
虚拟内存 128mb(如果安装桌面版)
网络:NAT
安装 Guest Additions(这个是必须的)
VirtualBox VM -> Devices -> Insert Guest Additions CD Image…(如果安装桌面版)
端口转发

设置 Ubuntu
如果使用 Ubuntu 桌面版,请继续创建一个终端图标:
然后运行软件更新程序:

从终端运行 apt-get update 命令:

开始使用 ssh
使用您的 pc/mac 客户端通过 ssh 连接到您的 Ubuntu 服务器/桌面版。如果安装了 Ubuntu 桌面版并希望运行 ssh:
1 | $ sudo apt-get install openssh-server |
Show moreShow more icon
从客户端机器(使用密码)登录到 ssh 服务器:

在这个示例中,上面指定的路由处理程序将 127.0.0.1:2222 TCP/IP 包转发到在 VM 中运行的访客 ssh 服务器。访客 ssh 服务器在端口 22 上监听发往 IP 地址 10.0.2.15 的数据包。在其他设置中,您可能拥有不同的 IP 地址,也可能没有启用端口转发。例如,如果您的访客的 IP 地址为 192.168.120.129(通过命令 $ hostname -I 从终端返回),而且没有设置端口转发规则,那么可以通过下面的命令登录:
1 | $ ssh [email protected] |
Show moreShow more icon
配置 ssh
运行 e2e Kubernetes 测试需要配置无密码的 ssh(使用密钥而不是密码)。
首先从 Ubuntu 终端生成 Ubuntu 公钥和私钥: $ ssh-keygen -t rsa 使用默认位置并输入一个密码,或者仅单击 Enter $ ssh-copy-id mike@10.0.2.15。
然后在 Mac 终端中的您的 Mac 上,从 ~/.ssh 目录输入:
$ ssh-keygen -b 1024 -t rsa -f id_rsa -P "" 将您的 Mac 公钥(例如cat ~/.ssh/id_rsa.pub)复制并粘贴到 Ubuntu 访客的 /home/mike/.ssh/authorized_keys 文件中。完成此操作的一种方法是,通过 ssh 连接到您的主机,并通过 nano 编辑 authorized_keys 文件。请在设置无密码 ssh 之前执行这一步。尝试在不支持剪切和粘贴的终端编辑器中输入公钥是无意义的。
接下来在 Ubuntu 终端上为您的 Ubuntu 访客配置无密码 ssh:
1 | $ sudo nano /etc/ssh/sshd_config |
Show moreShow more icon
取消注释/配置:
1 | PubkeyAuthentication yes |
Show moreShow more icon
测试它:
1 | $ ssh mike@ubuntu (ubuntu = 主机名) 或 ssh 127.0.0.1 或 ssh 10.0.2.15... |
Show moreShow more icon
确保该连接有效,然后退出。
因为我们将通过无密码形式以 root 用户身份登录,所以让我们采取一种便捷方法,将用户公私钥和 authorized_keys 复制到 /root/.ssh,例如:
1 | $ sudo cp ~/.ssh/authorized_keys /root/.ssh/authorized_keys(您可能需要执行 mkdir /root/.ssh) |
Show moreShow more icon
您现在应能从 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 用户帐户:
1 | $ ssh [email protected] |
Show moreShow more icon
安装 go
1 | $ sudo curl -O https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz |
Show moreShow more icon
解压:
1 | $ sudo tar -xvf go1.6.linux-amd64.tar.gz |
Show moreShow more icon
配置环境变量:
1 | $ sudo nano ~/.profile |
Show moreShow more icon
添加以下行:
1 | export GOPATH=/home/mike/go |
Show moreShow more icon
测试配置:
1 | mike@mike-VirtualBox:~/go$ go version |
Show moreShow more icon
要利用用户个人资料以 root 用户身份来运行,可以编辑以下内容:
1 | $ sudo su – |
Show moreShow more icon
测试您的配置:
1 | root@mike-VirtualBox:~# go version |
Show moreShow more icon
安装 Docker
请访问: https://docs.docker.com/engine/installation/linux/ubuntulinux/
安装 Docker:
1 | $ sudo apt-get update |
Show moreShow more icon
文件应包含以下内容(对于 14.04 版,它又被称为 trusty):deb https://apt.dockerproject.org/repo ubuntu-trusty main 文件应包含以下内容(对于 16.04,它又被称为 xenial):deb https://apt.dockerproject.org/repo ubuntu-xenial main 要安装 Docker 的 beta 版本,可使用 testing 代替 main。
1 | $ sudo apt-get update |
Show moreShow more icon
要挑选一个特定的 Docker 版本:sudo apt-get install docker-engine=1.10.3-0~trusty
1 | $ sudo service docker start |
Show moreShow more icon
测试您的 Docker 安装:
1 | $ sudo docker run hello-world |
Show moreShow more icon
将您自己添加到 Docker 组中,该组以 sudo 身份运行:
1 | $ sudo usermod -aG docker mike |
Show moreShow more icon
重新登录,再次测试您的 Docker 安装:
1 | $ docker run hello-world |
Show moreShow more icon
安装 etcd
1 | $ curl -L https://github.com/coreos/etcd/releases/download/v3.0.4/etcd-v3.0.4-linux-amd64.tar.gz -o etcd-v3.0.4-linux-amd64.tar.gz |
Show moreShow more icon
将 /home/mike/etcd-v3.0.4-linux-amd64 添加到您的 ~/.profile 路径中
在第一个终端中,运行:
1 | $ etcd |
Show moreShow more icon
在第二个终端中,运行:
1 | $ etcdctl set mykey "this is a test" |
Show moreShow more icon
建立分支
在 github 上为两个终端创建您的开发分支:

克隆您的分支
通常,当克隆 github.com 源代码存储库时,会使用路径 $GOPATH/src/(github 中的源代码的路径)。这是为了方便使用 go get type 命令获取 github 托管的数据包。但是,出于遗留的原因,Kubernetes 包被命名为 k8s.io/kubernetes,而不是您可能想到的 github.com/kubernetes/kubernetes。因此,要让所有开发工具正常工作并能在磁盘上找到您的数据包代码,需要将克隆版本放在 k8s.io 目录中。
使用以下步骤从您的名称/kubernetes 分支创建 k8s.io/kubernetes 源代码树:
1 | mike@mike-VirtualBox:~/go/src$ mkdir k8s.io |
Show moreShow more icon
结果:源文件从您的分支复制(克隆)到 go/src/k8s.io/kubernetes 和 k8s.io/kubernetes.github.io.git 目录。Git 在您的本地硬盘上为您的 github 分支创建一个主分支。
检查分支的状态:
1 | $ cd kubernetes |
Show moreShow more icon
Github 个人资料建议
- 向您的公开个人资料添加一个电子邮箱
- 启用双因素身份验证
Git 客户端配置建议
将 user.* 条目设置为全局和/或本地:
1 | $ git config --local user.name "Full name here" |
Show moreShow more icon
或:
1 | $ git config --global user.name "Full name here" |
Show moreShow more icon
让推送变得更容易:
1 | $ git config --global push.default simple |
Show moreShow more icon
所以您不需要每次都记住 github 凭证:
1 | $ git config credential.helper store |
Show moreShow more icon
添加一个远程命名上游,以便在硬盘上的克隆分支与 kubernetes/kubernetes 之间获取/推送更改:
1 | $ git remote add upstream https://github.com/kubernetes/kubernetes.git |
Show moreShow more icon
运行 git config -l 的结果应类似于:
1 | user.name=Mike Brown |
Show moreShow more icon
推荐 Kubernetes 团队执行以下步骤。备注:下面的链接向 git 提交命令添加了一个非常大的构建和验证命令集合,在您提交对您的分支所做的更改时,会运行该集合。
1 | $ cd .git/hooks/ |
Show moreShow more icon
如果没有链接 pre-commit 命令,您可能推送了一个不合格的 PR。例如,如果您修改了 k8s.io/kubernetes 分支上的文档,而且您没有运行相应的文档脚本,您可能会签入被错误修改的文档。
Git 工作流
下图显示了一个查找和修复 GitHub 上的开源产品的问题的典型 git 工作流。尽管此工作流是为 Docker 设计的,但它也适用于 Kubernetes。

如下图所示,在这里查找要解决的问题: https://github.com/kubernetes/kubernetes/issues

在您找到的问题上添加一条注释。
- 如果您有任何疑问,也请不要害羞。
- 如果希望解决问题,请说出您的问题。
调用 #dibs
向问题添加一条 #dibs 注释,告诉其他人您将尝试解决该问题。调用 dibs 是一句口语,表明其他人承认您首先要求解决此问题。它相当于在向观众提出一个问题时,您先举手了。
如果您不确定自己能否解决该问题……至少应该使用一条 #investigating 注释宣告您正在执行调查分析。这个问题没有分配给您,这并不表示您有解决方法,但它可以让其他人知道,您在以后可能调用 dibs 或打开一个拉取请求。
构建 Kubernetes
要构建在本地运行的二进制程序:
1 | $ sudo make |
Show moreShow more icon
e2e 测试说明:对于默认的 e2e 测试选项,当客户端和服务器的版本不同步时,e2e 测试不会运行。新增:您现在可以设置 check_version_skew=false,以便使用不同步的版本来运行 e2e。
根据您所做的更改,不一定要构建客户端/服务器。要强制二者同步(清除/删除构建二进制文件),可使用:
1 | $ sudo make clean |
Show moreShow more icon
要生成一个版本:
1 | $ make release |
Show moreShow more icon
要生成一个版本而不运行测试:
1 | $ make release-skip-tests |
Show moreShow more icon
测试 Kubernetes(单元和集成测试)
单元测试:
1 | $ sudo make test |
Show moreShow more icon
仅运行 pkg/api 测试:
1 | mike@mike-VirtualBox:~/go/src/k8s.io/kubernetes$ sudo WHAT=../../k8s.io/kubernetes/pkg/api make test |
Show moreShow more icon
集成测试:
1 | $ sudo make test-integration |
Show moreShow more icon
Kubernetes e2e 测试
运行 Kubernetes e2e 测试需要使用集群。e2e 测试可在任何兼容 Kubernetes 的集群上运行。本指南展示了如何创建一个在 Linux 环境中运行的单节点集群。如果按照上述说明进行操作,此集群将在您的 VM 中的 Ubuntu 访客系统中运行。我们将使用两个终端。
在终端 1 中,构建 Kubernetes:
1 | $ sudo make clean |
Show moreShow more icon
在运行本地集群之前确保你已经安装 cfssl:
1 | $ go get -u github.com/cloudflare/cfssl/cmd/... |
Show moreShow more icon
启动您的本地集群:
1 | $ sudo PATH=$PATH KUBERNETES_PROVIDER=local hack/local-up-cluster.sh |
Show moreShow more icon
在终端 2 中,配置 kubectl 来与本地集群交互:
1 | $ export KUBERNETES_PROVIDER=local |
Show moreShow more icon
检查您的单节点本地集群的状态:
1 | $ cluster/kubectl.sh get nodes |
Show moreShow more icon
为在单节点本地集群上运行 e2e 测试,可将以下代码添加到 ~/.profile 中进行配置:
1 | export KUBECONFIG=/home/mike/.kube/config |
Show moreShow more icon
检查您的环境:
1 | mike@mike-VirtualBox:~/go/src/k8s.io/kubernetes$ env | grep kube |
Show moreShow more icon
构建和运行 e2e 测试:
1 | $ KUBE_MASTER_IP=localhost:6443 KUBE_MASTER=https://localhost:6443 go run hack/e2e.go -v --test --test_args="--host=https://localhost:6443" |
Show moreShow more icon
仅执行 e2e 一致性测试:
1 | $ KUBE_MASTER_IP=localhost:6443 KUBE_MASTER=https://localhost:6443 go run hack/e2e.go |
Show moreShow more icon
完成 Kubernetes 集群的使用后,可在终端 1 中按 ctrl-c 来快速关闭它。
运行文档相关脚本
编辑 kubernetes/kubernetes 分支中的文档相关文件后,在执行 git 提交之前使用它们:
$ sudo hack/update-all.sh备注:需要为 sudo 和 $user 安装 gedep
也可以调用以下命令,或者执行一次提交并确定您需要运行以下哪条命令:
1 | $ sudo hack/update-generated-docs.sh |
Show moreShow more icon
kubernetes.github.io 文档
许多 kubernetes md 文件(文档文件)已从 kubernetes/kubernetes 存储库转移到 kubernetes/kubernetes.github.io 存储库。
例如,文档网站 http://kubernetes.io/docs/ 上发布的文档是从 kubernetes/kubernetes.github.io 存储库生成的。
如果您已按照之前的说明进行操作,那么您会有一个名为 ~/go/src/k8s.io/kubernetes.github.io 的目录,其中包含这些文件。
可按照以下操作说明,构建并托管 kubernetes 文档网站的一个本地版本:
1 | http://kubernetes.io/editdocs/ |
Show moreShow more icon
通过这种方式,您可以编辑文档,并预览在 kubertnetes.io 上的更改效果。
指导原则/要做的事情:
- 在提交更改之前,在每个更改的文件上运行 gofmt -s -w file.go。
- 在提交更改之前,在每个更改的文件上运行 golint。(Kubernetes 团队目前没有使用 lint。但它不会造成任何影响。)
- 在创建或修改功能时,记得更新文档。
- 记住添加测试案例来包含您的更改。
- 在提交修复方法或关闭问题时,应在提交消息 Closes #XXXX 或 Fixes #XXXX 中引用它们。
- 在每次提交后,运行测试套件并保证通过测试。
- 在编码的过程中频繁地同步和执行 rebase,以跟上主节点的进度。
希望本指南可以帮助您开始执行 Kubernetes 开发。