Kubernetes实战:构建生产级应用平台
上QQ阅读APP看书,第一时间看更新

2.5 机器安装

当集群的机器被启动时,它们将需要一个操作系统,安装某些软件包,并编写配置。你还需要一些工具或程序来确定环境和其他变量值,应用它们,并调度启动Kubernetes容器化组件的过程。

这里通常有两种被广泛使用的策略:

•配置管理工具

•机器镜像

2.5.1 配置管理工具

随着软件安装在虚拟机上并直接在主机上运行,配置管理工具(如Ansible、Chef、Puppet和Salt)变得流行起来。这些工具对于自动化大量远程机器的配置非常有用。它们遵循不同的模式,但总的来说,管理员可以声明性地规定机器必须是什么样子,并以自动化的方式应用该规定。

这些配置管理工具允许你可靠地建立机器的一致性,并且每台机器都可以得到一套有效且相同的软件和配置。它通常是通过声明式的配置来完成的,这些配置将被版本控制器检查。

Kubernetes的不足之处在于集群节点上线的速度和可靠性。如果加入一个新的工作节点到集群的过程中包括一个配置管理工具,执行通过网络连接拉动资源软件包的安装,你就会为该集群节点的加入过程消耗大量时间。此外,在配置和安装过程中可能会发生错误。从暂时不可用的软件包库到丢失或不正确的变量,都可能导致配置管理过程失败。这就完全中断了集群节点的加入。如果你依靠该节点来加入一个资源受限的自动扩展集群,很可能会引发可用性相关的问题。

2.5.2 机器镜像

使用机器镜像是一个更好的选择。如果你使用安装了所有所需软件包的机器镜像,软件在机器启动时就可以运行了。没有依赖网络和可用的软件包库的软件包安装。机器镜像提高了加入集群节点的可靠性,并大大缩短了节点准备就绪的时间。

这种方法的另一个好处是,你通常可以使用你熟悉的配置管理工具来建立机器镜像。例如,使用HashiCorp的Packer(https://www.packer.io),你可以使用Ansible来建立一个亚马逊机器镜像,并在需要的时候将这个预建的镜像应用到你的实例上。运行Ansible playbook构建机器镜像时出现错误并不是什么大事。与此相反,如果发生错误的工作节点加入集群,可能会引起重大的生产事故。

你应该在版本控制中保留用于构建的资源,安装的所有方面都可以保持声明性,并且检查存储库的任何人都很清楚这些信息。任何时候需要升级或安全补丁时,资源可以被更新、提交,最好是在合并后根据管道自动运行。

有些决策涉及艰难的取舍。有些非常显而易见,刚刚所提及的使用预构建的机器镜像便是其中之一。

2.5.3 安装什么

你需要在机器上安装什么呢?

首先,你需要一个操作系统。一个Kubernetes常用并经过测试的Linux发行版是安全的选择。RHEL/CentOS或Ubuntu都可以。如果你有企业支持或者你对其他发行版有兴趣,并且你愿意在测试和开发方面投入一些额外的时间,那也是可以的。如果你选择为容器设计的发行版,如Flatcar Container Linux(https://www.flatcar-linux.org),那么这将更好。

然后,你将需要一个容器运行时,如Docker或containerd。因为在运行容器时,必须有一个容器运行时。

接下来是kubelet。这是Kubernetes和被它调度的容器之间的接口。它是安装在被调度容器机器上的组件。Kubernetes是一个容器化的世界。现在被广泛认同的观点是Kubernetes本身也在容器中运行。也就是说,kubelet是作为主机上的一个普通二进制或进程运行的组件之一。有人试图将kubelet作为容器运行,但这只会使事情变得复杂。请不要这样做。

在主机上安装kubelet,在容器中运行Kubernetes的其他部分。这个模型清晰且实用。

到目前为止,我们有一个Linux操作系统,一个运行容器的容器运行时,以及Kubernetes和容器运行时之间的一个接口。现在,我们需要一些能够启动Kubernetes控制平面的东西。kubelet可以让容器运行,但如果没有控制平面,它还不知道要启动什么Kubernetes Pod。这就是kubeadm和静态Pod的用武之地。

kubeadm远不是唯一可以执行这种引导的工具。但它已经在社区中获得了广泛的应用和支持,并在许多企业生产系统中成功使用。它是一个命令行程序,在某种程度上,它将打印出静态Pod声明文件,以使Kubernetes启动和运行。kubelet可以被配置为监视主机上的一个目录,并为它在那里发现的任何Pod声明文件运行Pod。kubeadm将适当地配置kubelet,并根据需要存入声明文件。这将启动最核心且基本的Kubernetes控制平面组件,特别是etcd、kube-apiserver、kube-scheduler和kube-controller-manager。

此后,kubelet将从提交给Kubernetes API的声明文件中获得所有进一步的指示来创建Pod。此外,kubeadm将生成引导令牌,你可以用它来安全地将其他节点加入你的新集群中。

最后,你需要某种引导工具。Cluster API项目为此使用了Kubernetes的自定义资源和控制器。但安装在主机上的命令行程序也很好用。这个工具的主要功能是调用kubeadm和管理运行时配置。当机器启动时,提供给该应用程序的参数允许它配置Kubernetes的引导。例如,在AWS中,你可以利用用户数据来运行你的引导工具,并向它传递参数,这些参数将告知哪些标志应该被添加到kubeadm命令中,或者在kubeadm配置文件中包括什么。它将至少包括一个运行时的配置,告诉引导工具是用kubeadm init创建一个新的集群,还是用kubeadm join将机器加入一个现有的集群。它还应该包括一个安全的目录,以便在初始化时存储启动令牌,或者在加入时检索启动令牌。这些令牌可以确保只有经过批准的机器才能连接到你的集群,所以要谨慎操作。为了清楚地了解需要向你的引导工具提供哪些运行时配置,请使用kubeadm手动安装Kubernetes,这在官方文档中有详细说明。当你完成这些步骤时,就会发现在你的环境中需要什么来满足你的要求。图2-5说明了在一个新的Kubernetes集群中创建第一个控制平面节点所涉及的步骤。

图2-5:引导一台机器来初始化Kubernetes

现在我们已经介绍了在作为Kubernetes集群一部分的机器上应该安装什么,让我们继续讨论在容器中运行的软件,来完成Kubernetes的控制平面。