![再也不踩坑的kubernetes实战指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/323/27563323/b_27563323.jpg)
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集群规划
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-T12_5593.jpg?sign=1738895327-5KfWohroaNgsHH7bjejt0OFuIqLanPXR-0-b8f3678216417772be8886806ab12536)
各节点通信采用主机名的方式,这种方式与IP地址相比较更具有扩展性。以下介绍具体的安装步骤。
所有节点配置hosts,修改/etc/hosts如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5594.jpg?sign=1738895327-vbnAeq38tMNWBM3VHPgoNs3MpoGAkyHy-0-68b6bbe37f931136b59e1cc475e838f1)
所有节点关闭防火墙、selinux、dnsmasq、swap(如果开启防火墙需要开放对应的端口,配置较为复杂)。如果在云上部署,可以通过安全组进行安全配置。服务器配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5595.jpg?sign=1738895327-Dk1zqdgg9ukECoJZtR10KXelkYAvMrQM-0-d322542921821f45f7be9647b0715ccb)
关闭Selinux
setenforce 0
将/etc/sysconfig/selinux文件中的SELINUX改为disabled:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5596.jpg?sign=1738895327-Wg4vxf46gRIwwIRx7y4bMBLm7jJMZTPC-0-0bfc2bf73bcbe82275a819316bc6b56b)
关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
注释swap挂载选项:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5750.jpg?sign=1738895327-e9VR5p8C8Enh40UFiBNEz4hAQ8ZEj0uL-0-265c9ad39ea925390de7f849ab80012c)
所有节点同步时间。所有节点同步时间是必须的,并且需要加到开机自启动和计划任务中,如果节点时间不同步,会造成Etcd存储Kubernetes信息的键-值(key-value)数据库同步数据不正常,也会造成证书出现问题。时间同步配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5751.jpg?sign=1738895327-UpALLcsqnDyy5BZXkvI9GE9X5j9HD0tj-0-a18d4e1c03eafcd2b4fd8884bc18c7ca)
所有节点配置limit:
ulimit -SHn 65535
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5753.jpg?sign=1738895327-4yig9YFBN8z0BrDH7q72eM4rPkvLBYqX-0-2511fa985d618e54ebc52cd7ba16cc30)
Master01节点下载安装文件,本节所用的安装文件均放在chap01/1.1目录中。
在源码中的repo目录配置使用的是国内仓库源,将其复制到所有节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5754.jpg?sign=1738895327-yg4cWiqSHBp9kwlY6b1eN7MkzliGXXRl-0-4083216b989f4e9b18326a2d45655a4e)
所有节点配置repo源:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5755.jpg?sign=1738895327-Faf6WGtFdyKoJqkuRlqiRztPVrymSQFZ-0-6e939ecfd7795b9b3510f1c48f7f6acb)
所有节点升级系统并重启,此处升级没有升级内核,下节会单独升级内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5756.jpg?sign=1738895327-9tWX9lGIZEFlR6ApTXtU2ape6XIYjbwL-0-b820161fb223370b8c6588d2e731d6c8)
1.1.2 内核升级
在安装过程中,很多文档及网上资源不会提及到内核升级的部分,但升级内核可以减少一些不必要的Bug,也是安装过程中颇为重要的一步。
本例升级的内核版本为4.18,采用rpm的安装方式,Master01节点下载内核升级包:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5954.jpg?sign=1738895327-ZcnqhHMXS1lvehhFOCkfz5LtAbjrnKxs-0-6d744fc9df09817633a764489720b34e)
将内核升级包复制到其他节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5956.jpg?sign=1738895327-qyU6tEFYIdAWfBU4JT9ZcynYgesbZo1C-0-84b8a5ce4321ff60b4ee71d41aff3f8f)
所有节点升级内核:
yum localinstall -y kernel-ml*
所有节点修改内核启动顺序:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5958.jpg?sign=1738895327-kibdQfiBTPqwcUALxC1HC03OagLXBV82-0-fa45552a861feeba6a6f0c50eff768b7)
所有节点重启:
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即可:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5962.jpg?sign=1738895327-cZLt9Mvq0PzoCcfQvz9Usxl2pyDZOuCp-0-ad2fff5d7baa24147898754bcbd3d97d)
检查是否加载,并将其加入至开机自动加载(在目录/etc/sysconfig/modules/下创建一个k8s.modules写上上述命令即可):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5963.jpg?sign=1738895327-n3y1nbmTs8DOACpN2M9x2GOoV8kOEB5t-0-5fb5fb3e1cd9408b9331ae0b398a99c2)
开启一些K8S集群中必须的内核参数,所有节点配置K8S内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P15_6171.jpg?sign=1738895327-nb7Q07mrBXSrpU4omwJw8J2CVT0QJZhv-0-13138e1874c6cd9931be8ae8a42daa09)
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,请自行选择:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P15_6175.jpg?sign=1738895327-cQbXwSP5YyJJD7wVlay4pv5EWaT6bfUj-0-d3544535977f1f8b293d145a0d101404)
所有节点设置开机自启动Docker:
systemctl enable --now docker
默认配置的pause镜像使用gcr.io仓库,国内可能无法访问,所以这里配置Kubelet使用阿里云的pause镜像,使用kubeadm初始化时会读取该文件的变量:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P16_57151.jpg?sign=1738895327-aSCWE3wEU2HmhVEOEw1ozfPoKk3BxlR2-0-fcaa34cdc044fc0b2e71ff50b69cdbd9)
设置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配置相同):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P16_57154.jpg?sign=1738895327-oANmuPzNlbeeNNaWLNIhjeJF3yQqPb7s-0-ffcf5f1a60fae1bb0f7df6f16ba6e7ed)
所有Master节点配置KeepAlived。注意修改interface(服务器网卡)、priority(优先级,不同即可)、mcast_src_ip(本机IP),详细配置参考keepalived文档。
Master01节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P17_57156.jpg?sign=1738895327-3XXWjoHvFoJc3WQfDtA0VJstcSlpIgaZ-0-74f74183d8f970dcaff34c96e8a5ac1e)
Master02节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57158.jpg?sign=1738895327-axHeeceYv0IozWVN0PN6HFzs8avgL5w5-0-e238fd2f925d52eb4f0fecca77df3038)
Master03节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57159.jpg?sign=1738895327-eQsP5UuxSIw1dCGtjKJB7oD3PH5iM6nL-0-2c6c6dada6a6706b28ad51145fd8901a)
注意,上述的健康检查是关闭的,集群建立完成后再开启:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57161.jpg?sign=1738895327-XHfSVUx5DHOVZSUUDyHH3gnrX2GWCk1X-0-9076a3fc252404b5feddfc1b075c6933)
配置KeepAlived健康检查文件:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57162.jpg?sign=1738895327-jvol1kKzUXGNKo7iMoF3T2BBfZQttsrv-0-0005992908bc4bb04bcccb24991c3aa2)
启动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:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P20_57165.jpg?sign=1738895327-or0942UTViXcPb3D1HMXFlCl60VexPSy-0-884a0a08e2f208ac88c7de792ee7a691)
Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P21_57167.jpg?sign=1738895327-GTOpf7tXp3Fq4NaqIs22G6q1LELJQxrf-0-f083cde48d4ba3bfc11d01ca21a9fe32)
Master03:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P22_57168.jpg?sign=1738895327-hE4p6FfvLMNWQeRF8J5oQDA5GBFqx9Rw-0-74989f2ba062695b5c4b2550d0968d9c)
所有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值(令牌值):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_8126.jpg?sign=1738895327-747XkIIsWQ9uIoV8zcAlldYGgsjSL5an-0-9a5c700ec9035db5b948c53faff3588b)
所有Master节点配置环境变量,用于访问Kubernetes集群:
cat <<EOF >> /root/.bashrc export KUBECONFIG=/etc/kubernetes/admin.conf EOF source /root/.bashrc
查看节点状态:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_57175.jpg?sign=1738895327-4uh2idJIldgJwamLyjRMoeswxhRWDLpw-0-db6f990d7f123015d4e2ea9b0106c377)
采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_57176.jpg?sign=1738895327-Fnao3WyfbanyQBjG2XnNrT2ScdGbw21F-0-3b60455bae47136a9e11566edcaa1b97)
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节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P24_57178.jpg?sign=1738895327-Q3pXHXMmhaDzlMAi0MT6HrU2zfWfyxQl-0-a0992a00da0c57fefa2328a440b7291c)
和Master01一样,在Master02节点上提前下载镜像:
kubeadm config images pull --config /root/kubeadm-config.yaml
在Master02节点上创建证书及kubelet配置文件:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P24_57180.jpg?sign=1738895327-6Hn5mOHdqIPHevKScSIBhGOvRegWQjxT-0-1e6ea54ae7cc3cdecaa334c7ae1915e6)
重启Kubelet:
systemctl restart kubelet
将Master02的Etcd加入到Master01的Etcd集群中:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57182.jpg?sign=1738895327-1G0FOYANsr1QRaSRAf1Y1f4vo9F6TfvS-0-f21e209224e63ae6672d674916eb4271)
启动Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8553.jpg?sign=1738895327-SsOQo4l09Foj8RGTqDbpthITEvRKidA3-0-0fda8993f0af289b5a316a5f099ae8db)
配置Master03和配置Master02的步骤基本一致,除了配置Etcd集群时的IP地址和主机名信息不一致,其余步骤完全一致。
所有Master配置KUBECONFIG,用于访问集群:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8572.jpg?sign=1738895327-9M1icbFvUFSrAHIICOD3kZs6b1QW8IR1-0-1f461df0fb9ecda307a6c1844cecd2f1)
1.1.7 Node节点的配置
Node节点上主要部署公司的一些业务应用,生产环境中不建议Master节点部署系统组件之外的其他Pod,测试环境可以允许Master节点部署Pod以节省系统资源。
清理Node节点Kubelet配置:
kubeadm reset
使用kubeadm join将Node节点加入集群,使用的是刚才初始化Master生成的Token:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57186.jpg?sign=1738895327-AJ9YNGuiytQcibXGTZZSowM9hjEWvDXP-0-637efa7b00132d3fab56349abfb67ade)
所有Node节点配置相同,加入后查看节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57187.jpg?sign=1738895327-Kp92JM7hC8YCxeb19NKY7zE6ql2fup8h-0-cbc4db7c3e6e923acf5dd29c645a808b)
允许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/
等待几分钟可以查看获取的数据:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P26_57191.jpg?sign=1738895327-wYpDh3ziaWfJDgJPgQLzOBgK9UFy3im3-0-8ffff9d8f47432ca79914d5691ae82ec)
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
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P27_8995.jpg?sign=1738895327-bXvQ9mtJ2L79Ch2M4rLt5MGFoVWb87We-0-45108c53658bece51e88b604e3256139)
图1-1 谷歌浏览器Chrome的配置
访问Dashboard:https://192.168.20.10:30000,选择登录方式为令牌(即token方式),参考图1-2。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P28_9008.jpg?sign=1738895327-gVwckdx41zkPwmmJNkbdtWQzK8x0s9LC-0-45ff9f5c6a3625ce930f9d6f780c5da8)
图1-2 Dashboard登录方式
查看token值:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P28_57197.jpg?sign=1738895327-R1fXhNbOgblJJEOpUz4WOaXQmrjkt5pm-0-5a014b55ed163d5e1a2b83ef4dba720b)
将token值输入到令牌后,单击登录即可访问Dashboard,参考图1-3。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P29_9183.jpg?sign=1738895327-msYcAqeAk2kXjcN8xCUmZbJcWRi39GJd-0-74990b321604ca61ed9df5a4180032df)
图1-3 Dashboard页面
将Kube-proxy改为ipvs模式,因为在初始化集群的时候注释了ipvs配置,所以需要自行修改一下:
kubectl edit cm kube-proxy -n kube-system mode: “ipvs”
更新Kube-Proxy的Pod:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P29_57199.jpg?sign=1738895327-cVqEa8tPdJrlvi1cP9RmLL1xwJmVcBFN-0-0c12ddab996fa5210d77db61f13168eb)
验证Kube-Proxy模式
[root@K8S-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode ipvs