
1.3 二进制高可用安装K8S集群(1.13.x和1.14.x)
上一节讲解了使用Kubeadm安装高可用Kubernetes集群,虽然现在kubeadm是官方默认的安装方式,但是在生产环境中仍然不建议使用Kubeadm安装方式。在实际测试中,二进制安装方式比Kubeadm安装方式更加稳定可靠,并且集群的恢复能力比Kubeadm要高。不过在线下的测试环境,为了能够快速实现测试及部署可以使用Kubeadm安装方式,等到在生产环境中时仍然建议采用二进制安装方式。
本节介绍Kubernetes 1.13.x和1.14.x版本的高可用集群的安装,在二进制安装方式下,很多步骤需要自己手动完成,比如证书和配置文件的生成等,在二进制安装过程中,其他版本的安装过程基本一致,替换二进制文件的版本即可。
关于基本环境的配置请参考1.1.1节(yum仓库配置可省略),同样采用5台主机,3台Master和2台Node。
注意
与之前不同的是,本例的VIP为192.168.20.110
1.3.1 基本组件安装
关于内核升级,请参考1.1.2节。
和Kubeadm安装方式一致,同样需要提前安装集群中必需的组件。
所有节点安装Docker:

所有节点开启Docker并设置为开机自启动:
systemctl enable --now docker
下载Kubernetes,本例安装的是13.1,其他版本请自行修改:

也可在GitHub上下载:

下载Etcd文件,如果安装的是1.14.x版,则可以选择安装Etcd的3.3.10版:

将各组件分发至其他节点:

所有Master节点安装HAProxy和KeepAlived,可参考1.1.4节
1.3.2 CNI安装
CNI(Container Network Interface,容器网络接口)是CNCF旗下的一个项目,由一组用于配置容器的网络接口的规范和库组成。CNI主要用于解决容器网络互联的配置并支持多种网络模式。CNI的安装步骤如下。
所有节点创建CNI目录:
mkdir -p /opt/cni/bin
Master01下载CNI,如果安装的是1.14.x版本,可以安装CNI的0.7.5版本:

将CNI分发至其他节点:

1.3.3 生成证书
在Kubeadm安装方式下,初始化时会自动生成证书,但在二进制安装方式下,需要手动生成证书,可以使用OpenSSL或者cfssl。具体操作步骤如下:
Master01安装cfssl:

所有Master节点创建Etcd证书目录:
mkdir /etc/etcd/ssl -p
Master01生成Etcd证书:

将证书复制到其他节点,当前Etcd集群部署在Master节点上,在大规模集群环境中建议部署在集群之外,并且使用SSD硬盘作为Etcd的存储:

生成Kubernetes CA:

生成API Server证书,10.96.0.1是Cluster IP的Kubernetes端点,用于集群里的Pod调用K8S的API Server,使用时注意不要和公司网络在同一个网段:

创建Front Proxy证书:

生成ControllerManager证书:

创建ControllerManager的kubeconfig文件,注意修改--server的地址:

生成Scheduler证书:

生成Scheduler的kubeconfig文件,注意修改--server的地址:

生成Admin Certificate:

生成Admin的kubeconfig文件,注意修改--server的地址:

生成所有Master节点的Kubelet凭证:

复制证书到其他节点:

生成所有Master节点的kubeconfig文件,注意修改--server的地址:

创建ServiceAccount Key:

复制到其他节点:

1.3.4 系统组件配置
在二进制安装方式下,Kubernetes的组件都是以守护进程的方式运行在宿主机上,相比于Kubeadm安装方式,虽然配置过程较复杂,但是程序运行较稳定,并且恢复能力较强。
首先配置高可用Etcd集群。在Master01节点上创建etcd-master01的配置文件,注意修改对应的IP地址和name(名字):

etcd-master02配置文件:

etcd-master03配置文件:

所有Master节点配置etcd.service:

所有Master节点启动Etcd:
mkdir /etc/kubernetes/pki/etcd ln -s /etc/etcd/ssl/* /etc/kubernetes/pki/etcd/ systemctl daemon-reload systemctl enable --now etcd
查看状态:

本例高可用配置同样使用的是HAProxy和KeepAlived,具体参考1.1.4节。
之后配置Kubernetes集群中的Master组件。
在所有节点创建相关目录:

所有Master创建kube-apiserver文件,主要修改advertise-address和etcd-servers,如果在之前修改了ClusterIP的网段(默认10.96.0.0),此时也要修改service-cluster-ip-range的值:

注意
Initializers选项在kube-apiserver 1.14.x版本的--enable-admission-plugins已停用。

所有Master节点启动kube-apiserver:
systemctl enable --now kube-apiserver
所有Master创建kube-controller-manager.service,注意修改cluster-cidr的值,此值为Pod IP的网段,不要和宿主机在同一个网段:

所有Master节点启动kube-controller-manager:
systemctl daemon-reload systemctl enable --now kube-controller-manager
所有Master创建kube-scheduler:

所有Master启动scheduler:
systemctl daemon-reload systemctl enable --now kube-scheduler
查看集群状态。注意如果修改了ClusterIP的范围,kubernetes的端点Service就会有所不同,此时采用的是默认的10.96.0.0网段:

此时未配置网络组件,可能会出现如下报错,可忽略:

1.3.5 TLS Bootstrapping配置
建立TLS Bootstrapping RBAC与Secret,用来解决手动对每台节点单独签署凭证的问题。
建立bootstrap-kubelet.conf的kubernetes config文件:

建立bootstrap secret,注意token-id与token-secret的值和上述命令set-credentials的--token对应:



创建bootstrap:
[root@K8S-master01 1.2.1]# kubectl create -f bootstrap-rbac.yaml
1.3.6 Node节点的配置
Node节点只需要启动Kubelet即可,具体配置步骤如下。
将证书复制到Node节点:

配置10-kubelet.conf文件,因为Node节点采用自动颁发证书的方式,所以此文件需要添加KUBELET_KUBECONFIG_ARGS参数,如果已经配置了,就无需再配置。
所有Node节点创建相关目录:

所有Node节点配置Kubelet,如果Master节点也需要运行Pod(在生产环境中不建议,在测试环境中为了节省资源可以运行Pod),同样需要配置kubelet,Master节点和Node节点的kubelet配置唯一的区别是Master节点的--node-labels为node-role.kubernetes.io/master='',Node节点的为node-role.kubernetes.io/node=''。因为Master节点已经有证书,所以无需再次复制证书,直接创建kubelet的配置文件即可。Kubelet service文件如下:

Kubelet Service参数文件如下:

配置Kubelet配置文件。注意clusterDNS的地址,如果之前修改了ClusterIP的网段,需要将ClusterDNS的地址改成同网段的地址:



所有节点启动kubelet,启动后会自动生成kubelet.kubeconfig文件,并且controller-manager会自动为kubelet颁发证书:
systemctl daemon-reload systemctl enable --now kubelet
查看集群状态:

1.3.7 Kube-Proxy配置
Kube-Proxy用于实现Pod和Pod之间以及外部到Pod的访问,这些访问主要有三种实现方式,在部署过程中无须理会实现方式,具体原理请参考本书的2.2.13节。
以下介绍kube-Proxy的配置步骤。
创建Kube-Proxy的ServiceAccount:

创建kube-proxy的kubeconfig:

复制kube-proxy的文件至所有节点:

所有节点启动kube-proxy:
systemctl enable --now kube-proxy
1.3.8 Calico配置
安装Calico,请参考1.2.3节,更改<your-pod-cidr>的值为上述创建的PodIP网段:
POD_CIDR="<your-pod-cidr>" \ sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico/v3.6.1/calico.yaml
创建Calico:

查看Calico Pods的状态:

查看集群的状态,此时报错日志已解决:

1.3.9 CoreDNS的配置
CoreDNS用于集群中Pod解析Service的名字,Kubernetes基于CoreDNS用于服务发现功能。
安装CoreDNS 1.3.1版本(写本书时的最新版)。如果之前修改了PodIP的网段,需要自行修改此文件的ClusterIP参数:

查看CoreDNS的Pods状态:

解析测试:

解析Kubernetes service:

1.3.10 Metrics-Server配置
安装metrics-server:

查看Pod状态:

查看Node资源使用:

1.3.11 Dashboard配置
安装heapster:
[root@k8s-master01 1.2.1]# kubectl apply -f heapster/
安装Dashboard:

查看Pod的状态:

通过NodePort访问https://VIP:30000。
选择令牌,参考图1-4。

图1-4 Dashboard登录方式选择令牌
输入令牌(令牌获取参考1.1.9小节)后登录,即可登录到Dashboard页面,参考图1-5。

图1-5 Dashboard页面