第2章 安装Kubernetes

在第1章中,读者已经对Kubernetes有了初步的了解。接下来,本章将介绍Kubernetes的安装方法。Kubernetes的安装方式非常灵活,用户可以通过软件包管理工具进行安装,也可以通过kubeadmin管理工具进行安装,或者通过二进制文件进行安装,甚至可以通过源代码自己编译安装。本章将对Kubernetes的主要安装方式进行介绍。

本章涉及的知识点有:

2.1 通过软件包管理工具安装Kubernetes

Kubernetes为绝大部分的操作系统平台都提供了相应的软件包。通过软件包来安装Kubernetes是一种最简单的安装方式。对于初学者来说,通过这种方式可以快速搭建起Kubernetes的运行环境。本节将以CentOS为例,介绍如何通过软件包来安装Kubernetes。

2.1.1 软件包管理工具

大多数现代的Linux发行版都提供了一种中心化的机制,用来搜索和安装软件。软件通常都是存放在中心存储库中,并通过包的形式进行分发。处理包的工作被称为包管理。包提供了操作系统的基本组件,以及共享的库、应用程序、服务和文档。

目前,在Linux系统下常见的软件包格式主要有:RPM包、TAR包、bz2包、gz包以及deb包等。其中RPM包是最常见的Linux软件包形式,由美国RedHat公司开发,最初在其发布的RedHat Linux发行版中使用。目前RPM已经是Linux的软件包管理标准。TAR包是Linux的一种文件归档形式,非常多的文件都以TAR包形式压缩打包。bz2和gz都是比较常见的压缩包格式。deb则是Debian的制订的软件包管理形式。

在CentOS中,用户可以通过rpm命令或者yum命令来安装软件包,而yum则是最常用的软件包管理工具。yum命令的基本语法如下:


   yum [options] command

yum命令的选项比较多,其中最常用的主要有两个,其中一个是-skip-broken,该选项的功能是在安装指定软件包的时候,忽略依赖检查。尽管在某些特殊情况下,使用该选项可以将软件包安装上去,但是往往会导致软件包不能正常工作。因此,用户应该尽量避免使用该选项。另外一个选项为-y,由于在默认情况下,yum采用交互式安装软件包,因此,在安装过程中会不断询问用户一些问题,要求用户回答yes或者no。如果遇到问题比较多,的确会令人觉得非常烦琐。此时,用户可以使用-y选项,这意味着对于所有需要回答yes或者no的问题,一律自动选择yes。

常用的命令有erase、install以及search等。其中,erase命令用来将软件包从当前系统中删除,install命令用来安装指定的软件包,search命令用来搜索指定的软件包。这3个命令的语法相同,后面加上软件包名称即可。

2.1.2 节点规划

在本例中,部署了3台主机,其中1台为Master节点,另外2台为Node节点,其网络拓扑如图2-1所示。

图2-1 网络拓扑图

其中Master节点上面安装kubernetes-master和etcd软件包,Node节点上面安装kubernetes-node、etcd、Flannel以及Docker等软件包。kubernetes-master软件包包括kube-apiserver、kube-controller-manager以及kube-scheduler等组件及其管理工具。kubernetes-node包括kubelet以及管理工具。2个Node节点上面都安装etcd软件包,这样3个节点组成一个etcd集群。Flannel为网络组件,Docker运行容器。

2.1.3 安装前准备

在安装软件包之前,首先对所有节点的软件环境进行相应的配置和更新。

1.禁用SELinux

SELinux是2.6版本的Linux内核中提供的强制访问控制系统,在这种访问控制体系的限制下,进程只能访问某些指定的文件。尽管SELinux可以在很大程度上加强Linux的安全性,但是它会影响Kubernetes某些组件的功能,所以需要将其禁用,命令如下:


   [root@localhost ~]# setenforce 0

以上命令仅仅暂时禁用了SELinux,在系统重启之后,SELinux又会重新发挥作用。为了彻底禁用SELinux,用户需要修改其配置文件/etc/selinux/config。将其中的


   SELINUX=enforcing

修改为


   SELINUX=disabled
2.禁用firewalld

firewalld是CentOS 7开始采用的防火墙系统,代替之前的iptables。用户可以通过firewalld来加强系统的安全,关闭或者开放某些端口。firewalld会影响Docker的网络功能,所以在安装部署前需要将其禁用,命令如下:


   [root@localhost ~]# systemctl stop firewalld
   [root@localhost ~]# systemctl disable firewalld
3.更新软件包

在安装部署Kubernetes之前,用户应该更新当前系统的软件包,保持所有的软件包都是最新版本,命令如下:


   [root@localhost ~]# yum -y update
4.同步系统时间

用户需要先将三台服务器的时间通过NTP进行同步,否则,在后面的运行中可能会提示错误,命令如下:


   [root@localhost ~]# ntpdate -u cn.pool.ntp.org

其中cn.pool.ntp.org为中国的网络时间协议(NTP)服务器。

2.1.4 etcd集群配置

前面已经介绍过,etcd是一个高可用的分布式键值数据库。Kubernetes利用etcd来存储某些数据。为了提高可用性,在本例中我们在3台服务器上面都部署etcd,形成一个拥有3个节点的集群。

在Master节点上面执行以下命令:


   [root@localhost ~]# yum -y install kubernetes-master etcd

然后修改etcd配置文件/etc/etcd/etcd.conf,内容如下:

在上面的配置文件中,主要需要修改的选项如下:

1.ETCD_LISTEN_PEER_URLS

该选项用来指定etcd节点监听的URL,用于与其他分布式etcd节点通信,实现各个etcd节点的数据通信、交互、选举以及数据同步等功能。该URL采用协议、IP和端口相组合的形式,可以是:


   http://ip:port

或者:


   https://ip:port

在本例中,节点的IP地址为192.168.1.121,默认的端口为2380。用户可以通过该选项同时指定多个URL,各URL之间通过逗号隔开。

2.ETCD_LISTEN_CLIENT_URLS

该选项用于指定对外提供服务的地址,即etcd API的地址,etcd客户端通过该URL访问etcd服务器。该选项同样采用协议、IP地址和端口组合的形式,其默认端口为2379。

3.ETCD_NAME

该选项用来指定etcd节点的名称,该名称用于在集群中标识本etcd节点。

4.ETCD_INITIAL_ADVERTISE_PEER_URLS

该选项指定节点同伴监听地址,这个值会告诉etcd集群中其他etcd节点,该地址用来在etcd集群中传递数据。

5.ETCD_ADVERTISE_CLIENT_URLS

该选项用来指定当前etcd节点对外公告的客户端监听地址,这个值会告诉集群中其他节点。

6.ETCD_INITIAL_CLUSTER