
1.1 kubeadm高可用安装K8S集群(1.11.x和1.12.x)
本节主要演示使用Kubeadm安装Kubernetes高可用集群,笔者公司大部分线下测试环境均采用Kubeadm安装,这也是目前官方默认的安装方式,比二进制安装方式更加简单,可以让初学者快速上手并测试。目前GitHub上也有很多基于Ansible的自动化安装方式,但是为了更好地学习Kubernetes,还是建议体验一下Kubernetes的手动安装过程,以熟悉Kubernetes的各个组件。
截止到本书截稿前,官方最新的稳定版本为1.14,本章的内容会涉及到1.11、1.12、1.13和1.14版本的安装,对于Kubeadm来说,安装1.11.x版本和1.12.x类似,只需更改对应的Kubernetes版本号即可。本节主要演示的是1.11.x和1.12.x的安装。
1.1.1 基本环境配置
本次安装使用5台Linux服务器,系统版本为CentOS 7.5,分为3台Master、2台Node,其中Node的配置相同。Master节点主要部署的组件有KeepAlived、HAProxy、Etcd、Kubelet、APIServer、Controller、Scheduler,Node节点主要部署的为Kubelet,详情见表1-1。其中的概念可以参考第2章Docker和Kubernetes基础部分的内容。
表1-1 高可用Kubernetes集群规划

各节点通信采用主机名的方式,这种方式与IP地址相比较更具有扩展性。以下介绍具体的安装步骤。
所有节点配置hosts,修改/etc/hosts如下:

所有节点关闭防火墙、selinux、dnsmasq、swap(如果开启防火墙需要开放对应的端口,配置较为复杂)。如果在云上部署,可以通过安全组进行安全配置。服务器配置如下:

关闭Selinux
setenforce 0
将/etc/sysconfig/selinux文件中的SELINUX改为disabled:

关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
注释swap挂载选项:

所有节点同步时间。所有节点同步时间是必须的,并且需要加到开机自启动和计划任务中,如果节点时间不同步,会造成Etcd存储Kubernetes信息的键-值(key-value)数据库同步数据不正常,也会造成证书出现问题。时间同步配置如下:

所有节点配置limit:
ulimit -SHn 65535
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:

Master01节点下载安装文件,本节所用的安装文件均放在chap01/1.1目录中。
在源码中的repo目录配置使用的是国内仓库源,将其复制到所有节点:

所有节点配置repo源:

所有节点升级系统并重启,此处升级没有升级内核,下节会单独升级内核:

1.1.2 内核升级
在安装过程中,很多文档及网上资源不会提及到内核升级的部分,但升级内核可以减少一些不必要的Bug,也是安装过程中颇为重要的一步。
本例升级的内核版本为4.18,采用rpm的安装方式,Master01节点下载内核升级包:

将内核升级包复制到其他节点:

所有节点升级内核:
yum localinstall -y kernel-ml*
所有节点修改内核启动顺序:

所有节点重启:
reboot
所有节点再次启动后确认内核版本:
uname -r
本书的Kube-Proxy均采用ipvs模式,该模式也是新版默认支持的代理模式,性能比iptables要高,如果服务器未配置安装ipvs,将转换为iptables模式。所有节点安装ipvsadm:
yum install ipvsadm ipset sysstat conntrack libseccomp -y
所有节点配置ipvs模块,在内核4.19版本nf_conntrack_ipv4已经改为nf_conntrack,本例安装的内核为4.18,使用nf_conntrack_ipv4即可:

检查是否加载,并将其加入至开机自动加载(在目录/etc/sysconfig/modules/下创建一个k8s.modules写上上述命令即可):

开启一些K8S集群中必须的内核参数,所有节点配置K8S内核:

1.1.3 基本组件安装
本节主要安装的是集群中用到的各种组件,比如Docker-ce、Kubernetes各组件等。
查看可用docker-ce版本:
yum list docker-ce.x86_64 --showduplicates | sort -r
目前官方经过测试的Docker版本有1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06,可自行选择。
这里安装的Docker版本为17.09,其他版本自行更改即可,所有节点安装docker-ce-17.09:
yum -y install docker-ce-17.09.1.ce-1.el7.centos
和docker-ce一样,首先查看可用Kubeadm组件版本:
yum list kubeadm.x86_64 --showduplicates | sort -r
所有节点安装K8S组件。本例安装的为1.12.3,可以将版本改为1.11.x或1.12.x,请自行选择:

所有节点设置开机自启动Docker:
systemctl enable --now docker
默认配置的pause镜像使用gcr.io仓库,国内可能无法访问,所以这里配置Kubelet使用阿里云的pause镜像,使用kubeadm初始化时会读取该文件的变量:

设置Kubelet开机自启动:
systemctl daemon-reload systemctl enable --now kubelet
1.1.4 集群初始化
本节进行Kubernetes集群初始化,主要目的是生成集群中用到的证书和配置文件。在二进制安装过程中,证书和配置文件需要自行生成。
本例高可用采用的是HAProxy+Keepalived,HAProxy和KeepAlived以守护进程的方式在所有Master节点部署。通过yum安装HAProxy和KeepAlived:
yum install keepalived haproxy -y
所有Master节点配置HAProxy(详细配置参考HAProxy文档,所有Master节点的HAProxy配置相同):

所有Master节点配置KeepAlived。注意修改interface(服务器网卡)、priority(优先级,不同即可)、mcast_src_ip(本机IP),详细配置参考keepalived文档。
Master01节点的配置:

Master02节点的配置:

Master03节点的配置:

注意,上述的健康检查是关闭的,集群建立完成后再开启:

配置KeepAlived健康检查文件:

启动haproxy和keepalived
[root@K8S-master01 keepalived]# systemctl enable --now haproxy [root@K8S-master01 keepalived]# systemctl enable --now keepalived
注意
高可用方式不一定非要采用HAProxy和KeepAlived,在云上的话可以使用云上的负载均衡,比如在阿里云上可以使用阿里云内部的SLB,就无须再配置HAProxy和KeepAlived,只需要将对应的VIP改成SLB的地址即可。在企业内部可以使用F5硬件负载均衡,反向代理到每台Master节点的6443端口即可。
Kubeadm的安装方式可以配合使用kubeadm-config文件来初始化集群,所以需要提前创建各Master节点的kubeadm-config。由于国内网络的问题,需要将集群镜像的仓库地址改成imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers。
各Master节点的配置文件如下:
Master01:

Master02:

Master03:

所有Master节点提前下载镜像,可以节省初始化时间:
kubeadm config images pull --config /root/kubeadm-config.yaml
Master01节点初始化,初始化以后会在/etc/kubernetes目录下生成对应的证书和配置文件,之后其他Master节点加入Master01即可:
kubeadm init --config /root/kubeadm-config.yaml
如果初始化失败,重置后再次初始化,命令如下:
kubeadm reset
初始化成功以后,会产生Token值,用于其他节点加入时使用,因此要记录下初始化成功生成的token值(令牌值):

所有Master节点配置环境变量,用于访问Kubernetes集群:
cat <<EOF >> /root/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf EOF source /root/.bashrc
查看节点状态:

采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:

1.1.5 Calico组件的安装
Calico作为Kubernetes集群的网络组件,主要用来为Kubernetes创建和管理一个三层网络,为每个容器分配一个可路由的IP地址,实现集群中Pod之间的通信。
安装Calico 3.3.2:
kubectl create -f calico/calico.yaml -f calico/upgrade/rbac-kdd.yaml
再次查看Pod和Node节点的状态,可以发现CoreDNS已经处于Running状态,且Node的STATUS变成了Ready状态,此时表示Calico安装成功:
kubectl get po,node -n kube-system
1.1.6 高可用Master
本节介绍Kubernetes的高可用配置,如果暂时不需要高可用集群可以略过此节,然后将其VIP改为Master01节点的IP地址即可。在生产线上Master组件的高可用是很重要的一部分,可用于防止Master节点宕机后对集群造成的影响。
复制证书到其他Master节点:

和Master01一样,在Master02节点上提前下载镜像:
kubeadm config images pull --config /root/kubeadm-config.yaml
在Master02节点上创建证书及kubelet配置文件:

重启Kubelet:
systemctl restart kubelet
将Master02的Etcd加入到Master01的Etcd集群中:

启动Master02:

配置Master03和配置Master02的步骤基本一致,除了配置Etcd集群时的IP地址和主机名信息不一致,其余步骤完全一致。
所有Master配置KUBECONFIG,用于访问集群:

1.1.7 Node节点的配置
Node节点上主要部署公司的一些业务应用,生产环境中不建议Master节点部署系统组件之外的其他Pod,测试环境可以允许Master节点部署Pod以节省系统资源。
清理Node节点Kubelet配置:
kubeadm reset
使用kubeadm join将Node节点加入集群,使用的是刚才初始化Master生成的Token:

所有Node节点配置相同,加入后查看节点:

允许Master节点部署Pod,但并不是必需的,生产环境中请勿允许Master节点部署系统组件之外的其他Pod,以免升级集群或维护时对业务造成影响。
kubectl taint nodes --all node-role.kubernetes.io/master-
1.1.8 Metrics-Server部署
在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率。
所有Master节点允许HPA通过接口采集数据(新版本默认开启),修改后Pod会自动重启:
vi /etc/kubernetes/manifests/kube-controller-manager.yaml - --horizontal-pod-autoscaler-use-rest-clients=false
安装Metrics-server:
kubectl apply -f metrics-server/
等待几分钟可以查看获取的数据:

1.1.9 Dashboard部署
Dashboard用于展示集群中的各类资源,同时也可以通过Dashboard实时查看Pod的日志和在容器中执行一些命令等。
安装Dashboard:
kubectl apply -f dashboard/
安装heapster,虽然新版的Kubernetes用metrics-server顶替了heapster获取集群资源监控数据,但是1.x版本的Dashboard还是使用heapster获取集群的资源数据,所以部署Dashboard 1.x版本还是需要先安装heapster。如果不需要Dashboard展示资源监控数据或者使用Dashboard 2.x版本,则可以不安装heapster。
kubectl apply -f heapster/
在谷歌浏览器(Chrome)启动文件中加入启动参数,用于解决无法访问Dashboard的问题,参考图1-1。
--test-type --ignore-certificate-errors

图1-1 谷歌浏览器Chrome的配置
访问Dashboard:https://192.168.20.10:30000,选择登录方式为令牌(即token方式),参考图1-2。

图1-2 Dashboard登录方式
查看token值:

将token值输入到令牌后,单击登录即可访问Dashboard,参考图1-3。

图1-3 Dashboard页面
将Kube-proxy改为ipvs模式,因为在初始化集群的时候注释了ipvs配置,所以需要自行修改一下:
kubectl edit cm kube-proxy -n kube-system mode: “ipvs”
更新Kube-Proxy的Pod:

验证Kube-Proxy模式
[root@K8S-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode ipvs