2.2 配置Kubernetes集群
![](https://bookbk.img.zhangyue01.com/group61/M00/77/93/CmQUOF8KrwOEGX6fAAAAAB76RfE908976629.png?v=ywDc_OF-&t=CmQUOF8KrwM.)
现在,应用被打包在一个容器镜像中,并通过Docker Hub给大家使用,可以将它部署到Kubernetes集群中,而不是直接在Docker中运行。但是需要先设置集群。
设置一个完整的、多节点的Kubernetes集群并不是一项简单的工作,特别是如果你不精通Linux和网络管理的话。一个适当的Kubernetes安装需要包含多个物理或虚拟机,并需要正确地设置网络,以便在Kubernetes集群内运行的所有容器都可以在相同的扁平网络环境内相互连通。
安装Kubernetes集群的方法有许多。这些方法在http://kubernetes.io的文档中有详细描述。我们不会在这里列出所有,因为内容在不断变化,但Kubernetes可以在本地的开发机器、自己组织的机器集群或是虚拟机提供商(Google Compute Engine、Amazon EC2、Microsoft Azure等)上运行,或者使用托管的Kubernetes集群,如Google Kubernetes Engine(以前称为Google Container Engine)。
在这一章中,将介绍用两种简单的方法构建可运行的Kubernetes集群,你将会看到如何在本地机器上运行单节点Kubernetes集群,以及如何访问运行在Google Kubernetes Engine(GKE)上的托管集群。
第三个选项是使用 kubeadm 工具安装一个集群,这会在附录B中介绍,这里的说明向你展示了如何使用虚拟机建立一个三节点的Kubernetes集群,但是建议你在阅读本书的前11章之后再尝试。
另一个选择是在亚马逊的AWS(Amazon Web Services)上安装Kubernetes。为此,可以查看 kops 工具,它是在前面一段提到的 kubeadm 基础之上构建的,可以在http://github.com/kubernetes/kops中找到。它帮助你在AWS上部署生产级、高可用的Kubernetes集群,并最终会支持其他平台(Google Kubernetes Engine、VMware、vSphere等)。
2.2.1 用Minikube运行一个本地单节点Kubernetes集群
使用Minikube是运行Kubernetes集群最简单、最快捷的途径。Minikube是一个构建单节点集群的工具,对于测试Kubernetes和本地开发应用都非常有用。
虽然我们不能展示与管理多节点应用相关的一些Kubernetes特性,但是单节点集群足以探索本书中讨论的大多数主题。
安装Minikube
Minikube是一个需要下载并放到路径中的二进制文件。它适用于OSX、Linux和Windows系统。最好访问GitHub上的Minikube代码仓库(http://github.com/kubernetes/minikube),按照说明来安装它。
例如,在OSX和Linux系统上,可以使用一个命令下载Minikube并进行设置。对于OSX系统,命令是这样的:
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-EepJyAAAAAEVtKF4486399202.jpg?v=MEnODihH&t=CmQUOF8Kru8.)
在Linux系统中,可以下载另一个版本(将URL中的 “darwin” 替换为“linux”)。在Windows系统中,可以手动下载文件,将其重命名为minikube.exe,并把它加到路径中。Minikube在VM中通过VirtualBox或KVM运行Kubernetes,所以在启动Minikube集群之前,还需要安装VM。
使用Minikue启动一个Kubernetes集群
当你在本地安装了Minikube之后,可以立即使用下面的命令启动Kubernetes集群。
代码清单2.10 启动一个Minikube虚拟机
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-Eb2ePAAAAALGfGQE667967169.jpg?v=KRwqbnwE&t=CmQUOF8Kru8.)
启动集群需要花费超过一分钟的时间,所以在命令完成之前不要中断它。
安装Kubernetes客户端(kubectl)
要与Kubernetes进行交互,还需要 kubectl CLI客户端。同样,需要做的就是下载它,并放在路径中。例如,OSX系统的最新稳定版本可以通过以下命令下载并安装:
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-EcujmAAAAAEz63JA260585734.jpg?v=HLN9_X-L&t=CmQUOF8Kru8.)
要下载用于Linux或Windows系统的kubectl,用 linux 或 windows 替换URL中的 darwin。
注意 如果你需要使用多个Kubernetes集群(例如,Minikube和GKE),请参考附录A,了解如何在不同的 kubectl 上下文中设置和切换。
使用kubectl查看集群是否正常工作
要验证集群是否正常工作,可以使用以下所示的 kubectl cluster-info命令。
代码清单2.11 展示集群信息
![](https://bookbk.img.zhangyue01.com/group61/M00/77/AE/CmQUOV8Kru-ETMIfAAAAAIdlncE734106210.jpg?v=WUImHXli&t=CmQUOV8Kru8.)
这里显示集群已经启动。它显示了各种Kubernetes组件的URL,包括API服务器和Web控制台。
提示 可以运行 minikube ssh 登录到Minikube VM并从内部探索它。例如,可以查看在节点上运行的进程。
2.2.2 使用Google Kubernetes Engine托管Kubernetes集群
如果你想探索一个完善的多节点Kubernetes集群,可以使用托管的Google Kubernetes Engine(GKE)集群。这样,无须手动设置所有的集群节点和网络,因为这对于刚开始使用Kubernetes的人来说太复杂了。使用例如GKE这样的托管解决方案可以确保不会出现配置错误、不工作或部分工作的集群。
配置一个Google Cloud项目并且下载必需的客户端二进制
在设置新的Kubernetes集群之前,需要设置GKE环境。因为这个过程可能会改变,所以不在这里列出具体的说明。阅读https://cloud.google.com/containerengine/docs/before-begin中的说明后就可以开始了。
整个过程大致包括:
1.注册谷歌账户,如果你还没有注册过。
2.在Google Cloud Platform控制台中创建一个项目。
3.开启账单。这会需要你的信用卡信息,但是谷歌提供了为期12个月的免费试用。而且在免费试用结束后不会自动续费。
4.开启Kubernetes Engine API。
5.下载安装Google Cloud SDK(这包含 gcloud 命令行工具,需要创建一个Kubernetes集群)。
6.使用 gcloud components install kubectl 安装 kubectl 命令行工具。
注意 某些操作(例如步骤2中的操作)可能需要几分钟才能完成,所以在此期间可以喝杯咖啡放松一下。
创建一个三节点Kubernetes集群
完成安装后,可以使用下面代码清单中的命令创建一个包含三个工作节点的Kubernetes集群。
代码清单2.12 在GKE上创建一个三节点集群
![](https://bookbk.img.zhangyue01.com/group61/M00/77/AE/CmQUOV8Kru-ERM9PAAAAAJb1lWE465880571.jpg?v=8CCAy5eY&t=CmQUOV8Kru8.)
现在已经有一个正在运行的Kubernetes集群,包含了三个工作节点,如图 2.4所示。你在使用三个节点来更好地演示适用于多节点的特性,如果需要的话可以使用较少数量的节点。
获取集群概览
图 2.4 能够让你对集群,以及如何与集群交互有一个初步的认识。每个节点运行着Docker、Kubelet和kube-proxy。可以通过 kubectl 命令行客户端向运行在主节点上的Kubernetes API服务器发出REST请求以与集群交互。
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-EAZ9XAAAAAIK770s494629495.jpg?v=OI9_dOlA&t=CmQUOF8Kru8.)
图2.4 如何与三节点Kubernetes集群进行交互
通过列出集群节点查看集群是否在运行
现在可以使用kubectl命令列出集群中的所有节点,如下面的代码清单所示。
代码清单2.13 使用kubectl列出集群节点
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-EX2G6AAAAAHgKJ5g808892629.jpg?v=cv74fJu2&t=CmQUOF8Kru8.)
kubectl get 命令可以列出各种Kubernetes对象。你将会经常使用到它,但它通常只会显示对象最基本的信息。
提示 可以使用 gcloud compute ssh <node-name> 登录到其中一个节点,查看节点上运行了什么。
查看对象的更多信息
要查看关于对象的更详细的信息,可以使用 kubectl describe 命令,它显示了更多信息:
![](https://bookbk.img.zhangyue01.com/group61/M00/77/AE/CmQUOV8Kru-EYdskAAAAAKFRKm4039711495.jpg?v=CwRSPzop&t=CmQUOV8Kru8.)
这里省略了 describe 命令的实际输出,因为内容非常多且在书中是完全不可读的。输出显示了节点的状态、CPU和内存数据、系统信息、运行容器的节点等。
在前面的 kubectl describe 示例中,显式地指定了节点的名称,但也可以执行一个简单的 kubectl describe node 命令,而无须指定节点名,它将打印出所有节点的描述信息。
提示 当只有一个给定类型的对象存在时,不指定对象名就运行 description和 get 命令是很提倡的,这样不会浪费时间输入或复制、粘贴对象的名称。
当我们讨论减少输入的时候,开始在Kubernetes运行第一个应用程序之前,先学习如何让 kubectl 命令的使用变得更容易。
2.2.3 为kubectl配置别名和命令行补齐
kubectl 会被经常使用。很快你就会发现每次不得不打全命令是非常痛苦的。在继续之前,花一分钟为kubectl 设置别名和tab命令补全可让使用变得简单。
创建别名
在整本书中,一直会使用 kubectl 可执行文件的全名,但是你可以添加一个较短的别名,如 k,这样就不用每次都输入 kubectl 了。如果还没有设置别名,这里会告诉你如何定义。将下面的代码添加到 ~/.bashrc 或类似的文件中:
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-ECjJAAAAAAIXmlVQ351798238.jpg?v=EZg2Ljd6&t=CmQUOF8Kru8.)
注意 如果你已经在用 gcloud 配置集群,就已经有可执行文件 k 了。
为kuebctl配置tab补全
即使使用短别名k,仍然需要输入许多内容。幸运的是,kubectl命令还可以配置bash和zsh shell的代码补全。tab补全不仅可以补全命令名,还能补全对象名。例如,无须在前面的示例中输入整个节点名,只需输入
![](https://bookbk.img.zhangyue01.com/group61/M00/77/AE/CmQUOV8Kru-EADTZAAAAAEJ1T34527662809.jpg?v=xLubGb4J&t=CmQUOV8Kru8.)
需要先安装一个叫作 bashcompletion 的包来启用bash中的tab命令补全,然后可以运行接下来的命令(也需要加到 ~/.bashrc 或类似的文件中):
![](https://bookbk.img.zhangyue01.com/group61/M00/77/AE/CmQUOV8Kru-EG3zoAAAAAKgGQDw345514927.jpg?v=T-XtcUG6&t=CmQUOV8Kru8.)
但是需要注意的是,tab命令行补全只在使用完整的 kubectl 命令时会起作用(当使用别名 k 时不会起作用)。需要改变 kubectl completion 的输出来修复:
![](https://bookbk.img.zhangyue01.com/group61/M00/77/8F/CmQUOF8Kru-Ee14-AAAAAEZMbQ8551170250.jpg?v=znam4Nr_&t=CmQUOF8Kru8.)
注意 不幸的是,在写作本书之时,别名的shell命令补全在MacOS系统上并不起作用。如果需要使用命令行补全,就需要使用完整的 kubectl 命令。
现在你已经准备好无须输入太多就可以与集群进行交互。现在终于可以在Kubernetes上运行第一个应用了。