![再也不踩坑的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=1739404522-umhLs7dNPzD1rsO0H0ax3soxfvYAQagD-0-c680224b204266e973dba31eb9111408)
各节点通信采用主机名的方式,这种方式与IP地址相比较更具有扩展性。以下介绍具体的安装步骤。
所有节点配置hosts,修改/etc/hosts如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5594.jpg?sign=1739404522-P1CyFp7HhvyG8Rej8VGYBTH252atulXu-0-ca2ec7c639f9b6bdf6b3dbad82060154)
所有节点关闭防火墙、selinux、dnsmasq、swap(如果开启防火墙需要开放对应的端口,配置较为复杂)。如果在云上部署,可以通过安全组进行安全配置。服务器配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5595.jpg?sign=1739404522-rmScGuhlP71h0R9EBMPJtJIeHQXyPMUo-0-3d6d7d9515305ca7a729a4c79180be82)
关闭Selinux
setenforce 0
将/etc/sysconfig/selinux文件中的SELINUX改为disabled:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5596.jpg?sign=1739404522-lZVxOs8eLNa4vTg5tq2KKaT3bONIDDc1-0-2ea6195b2b7576af4c812f8b33e5907c)
关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
注释swap挂载选项:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5750.jpg?sign=1739404522-6O7IgRgh3TNOuSuzMXC6LOGfVKhNv5aX-0-4b438999fe6dca352a785af98e7acab9)
所有节点同步时间。所有节点同步时间是必须的,并且需要加到开机自启动和计划任务中,如果节点时间不同步,会造成Etcd存储Kubernetes信息的键-值(key-value)数据库同步数据不正常,也会造成证书出现问题。时间同步配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5751.jpg?sign=1739404522-bmmK176zOWSgKcI2eavQCeubnekvWwvU-0-5bd7b23012ed087c3498b98fed54d6b5)
所有节点配置limit:
ulimit -SHn 65535
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5753.jpg?sign=1739404522-OMSMqGPmLm6NmGnk8odNcjw9TigiyBBA-0-d753f0e6d39c867e99f75e50d480a0ad)
Master01节点下载安装文件,本节所用的安装文件均放在chap01/1.1目录中。
在源码中的repo目录配置使用的是国内仓库源,将其复制到所有节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5754.jpg?sign=1739404522-d6uq23BHNC9x7t4S63uC6JUh5LxGmgBW-0-730a461a66c0fd8d0ca6488c5c992cb6)
所有节点配置repo源:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5755.jpg?sign=1739404522-D9ErC8uiUePBcL1TrIFq3QuwN97WYClC-0-cbff92c1d71c0a47e427de25662e2083)
所有节点升级系统并重启,此处升级没有升级内核,下节会单独升级内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5756.jpg?sign=1739404522-6Fh3i4C14qhv2A2KX93gWQXu2ubg6mP0-0-7579d506b5c29dd2e9b3d0e3a433337d)
1.1.2 内核升级
在安装过程中,很多文档及网上资源不会提及到内核升级的部分,但升级内核可以减少一些不必要的Bug,也是安装过程中颇为重要的一步。
本例升级的内核版本为4.18,采用rpm的安装方式,Master01节点下载内核升级包:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5954.jpg?sign=1739404522-cd6AHhjgjTPepciYVqVg7QyWRgQ0QYDe-0-77e5a9abdf479330da7573f297475896)
将内核升级包复制到其他节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5956.jpg?sign=1739404522-t5FgASVYAq5J8kLo9ZnnNTigy7Z1HltP-0-500fdddc1bc327b7ee1d3946b9e524ae)
所有节点升级内核:
yum localinstall -y kernel-ml*
所有节点修改内核启动顺序:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5958.jpg?sign=1739404522-pUA9s7LQfCrtTXPXLBY8gCYwXLaT06qb-0-87f105250532ca34d401f1e6f077a46a)
所有节点重启:
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=1739404522-2ZFQ0PJ7dVS0pJYSw5XYlEFN0Q5e3ET8-0-a5c87174fbdd563a8f985ae5cd1c419a)
检查是否加载,并将其加入至开机自动加载(在目录/etc/sysconfig/modules/下创建一个k8s.modules写上上述命令即可):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5963.jpg?sign=1739404522-TNTPGl3Yz5yejofX5p6nugoY4LaysN8m-0-b4c437bb96ed733d11274662170c9c0d)
开启一些K8S集群中必须的内核参数,所有节点配置K8S内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P15_6171.jpg?sign=1739404522-I9EVWAJfpsTXbd6Cy2cynC4HTURffnrR-0-d88b40b1a6e4914fb76fae23d95a4141)
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=1739404522-rlu8NTjFTlPLySvARN0bk0FN8qgqGbhf-0-8c76bb76606daced039097fbf3f24dce)
所有节点设置开机自启动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=1739404522-mcFpgrMQslZpM0umZTVZH1zA2D2Ct7Wi-0-c96273c7655613f43dc6fc74f941e7c5)
设置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=1739404522-lMBH2Mojn72skwq7Z6EoJoRsLkfAnsY9-0-a54703eb0f0f6834517884d3bc5d7405)
所有Master节点配置KeepAlived。注意修改interface(服务器网卡)、priority(优先级,不同即可)、mcast_src_ip(本机IP),详细配置参考keepalived文档。
Master01节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P17_57156.jpg?sign=1739404522-nV4UzY9aO6wCQIkA4qBHAarsicc6YiDx-0-2616fab9727e8172c710ea9824d272d9)
Master02节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57158.jpg?sign=1739404522-R90gFNW3ghnhNLxigf1sSiuOoCSb2FBX-0-03bc36d4a1e696e3744e7b0786de1527)
Master03节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57159.jpg?sign=1739404522-AvSTCdVdcsjBek2JB1LXPm2KqzhbjvuT-0-9c5554595b652f7c9ca5ad07983ad49f)
注意,上述的健康检查是关闭的,集群建立完成后再开启:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57161.jpg?sign=1739404522-fUkoKNewvyFibj61yOyAA88rOYc95498-0-821d0dd4d8f96b2dfbc2f6baa8e3c4d9)
配置KeepAlived健康检查文件:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57162.jpg?sign=1739404522-Dns8XWamCstMpyfYp0M54JO5BDOMmyo7-0-73d077bb4790dad94ba5a16b62256267)
启动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=1739404522-17dVlgfCIEeoHsguTu5FUhsaTfpoLt8J-0-b3212a5b2d4733456f8e864917d882a3)
Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P21_57167.jpg?sign=1739404522-hulQ3HvzWM0wkvGw2kw2WTOU3f6vLtp3-0-0ddaaf1751f9b4fa926dae600de8661c)
Master03:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P22_57168.jpg?sign=1739404522-UWhX1R5LR7yKZP0pzGwbM4DQeBYYKpYm-0-20d7e5b3f24dccfeb07766a01d09a192)
所有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=1739404522-6xYbzgvCaSq3M7zPMPAt5S1ctEOO0mtZ-0-5e5a41a141d95741cc693a2663db1f9f)
所有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=1739404522-Yes6saTTdJwotVISUiAOkHFCEl55CnHZ-0-79967b77a31cba78da649bf3e81343d2)
采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_57176.jpg?sign=1739404522-AYioIqFP3QBkzIyyKs9yw4UgJ4wtStMg-0-4f694605d86ec3f759c9fe0e106fe8bb)
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=1739404522-nFpX4NKHsZsKoZaHGSL4573QQXhHsu9d-0-c57277b140572d652e819184e608fe1a)
和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=1739404522-Zq4lIHL4TZTAXbVLSoqcJcQTs5Nvo8TX-0-8651fcfd3328200489b1434fa532764c)
重启Kubelet:
systemctl restart kubelet
将Master02的Etcd加入到Master01的Etcd集群中:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57182.jpg?sign=1739404522-LYTufIkXA8XvArGA3Jqz8ijcCZXvR86Z-0-7a5c798424c8258df9f6d7ff7de4a02a)
启动Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8553.jpg?sign=1739404522-9xEqdbm2jR6iDqyLL6tjisQc5UD1Jgts-0-ef2ca94dd5b59681523fd157d7ff9bfb)
配置Master03和配置Master02的步骤基本一致,除了配置Etcd集群时的IP地址和主机名信息不一致,其余步骤完全一致。
所有Master配置KUBECONFIG,用于访问集群:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8572.jpg?sign=1739404522-Wp3yuiZUydaHN3qjeLcJ23jf20lMcWc2-0-9f5e4f7c3051207c91beab48395792f8)
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=1739404522-m2R3wEXjyCni4T4uyKTuLmipzD54eiKT-0-4e74433cddf976b772eb89893d3d8e31)
所有Node节点配置相同,加入后查看节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57187.jpg?sign=1739404522-mnkQWwi8vVm3fvxiEaz8CT2dplU7B7Vc-0-56f0a300f7445b914a0aebb84eff137c)
允许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=1739404522-najCm0DPYae64U6awfakfokhwvuh7Y62-0-7ec24093ae5b97ff4d85e7d12969073c)
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=1739404522-oPGhUT2YiqUpHlvOyY0GQbWCawxlww4J-0-9eb919cae8928740947c506cc1e8e4d0)
图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=1739404522-GLVVtpoRzoQ7unhE3BRKfIrHbx6M0mdb-0-a931bb19a5f1cb5690c39bb41b13f4b3)
图1-2 Dashboard登录方式
查看token值:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P28_57197.jpg?sign=1739404522-kNyNIAHYfGp3C1Uupm9p1p7iJ5u0MsX1-0-3c8784a2a1df5a7b1ad669be051994d5)
将token值输入到令牌后,单击登录即可访问Dashboard,参考图1-3。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P29_9183.jpg?sign=1739404522-snqadUk02gnNngUp7drQuErH8fOtoWxt-0-84ec98f95d800d277135580261361c77)
图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=1739404522-HnTaVunZX40h4EtedBp2U80cmcjmn9Zk-0-6aa07a7de571b864e8c69b4f92b3434b)
验证Kube-Proxy模式
[root@K8S-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode ipvs