![再也不踩坑的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=1739500568-coE1iJy2vPWCiGq2DhyJke0q6qo0KK54-0-3aba63fb16c1a9a942e9281672a719f6)
各节点通信采用主机名的方式,这种方式与IP地址相比较更具有扩展性。以下介绍具体的安装步骤。
所有节点配置hosts,修改/etc/hosts如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5594.jpg?sign=1739500568-koZTfhZkYtiUdGgYqhCxg7xU8wUHfbEr-0-5502a9e8a1349959ec448deedd78a53d)
所有节点关闭防火墙、selinux、dnsmasq、swap(如果开启防火墙需要开放对应的端口,配置较为复杂)。如果在云上部署,可以通过安全组进行安全配置。服务器配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5595.jpg?sign=1739500568-kDvXgyJe9LPuSXdwaa2Jt91GoU7ARCEO-0-67810103bdf49ee11071ce62590e5520)
关闭Selinux
setenforce 0
将/etc/sysconfig/selinux文件中的SELINUX改为disabled:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5596.jpg?sign=1739500568-TTrza1ESpuAljWvEFtb76MAqf3fLP43X-0-93c1d98dd7a3e834a339e8dc0f3bdfa1)
关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
注释swap挂载选项:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5750.jpg?sign=1739500568-gYYkesUHJIvxkjSTUYuSMgu5AR6dDsG3-0-6ed7270ced98764f4ac3f7ed62b5e26e)
所有节点同步时间。所有节点同步时间是必须的,并且需要加到开机自启动和计划任务中,如果节点时间不同步,会造成Etcd存储Kubernetes信息的键-值(key-value)数据库同步数据不正常,也会造成证书出现问题。时间同步配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5751.jpg?sign=1739500568-hWLyLhmEfkktF2CYKqnY3VtzqRUurTEZ-0-8b8cfeb0a60c8054838c096c046c53aa)
所有节点配置limit:
ulimit -SHn 65535
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5753.jpg?sign=1739500568-mdR4jJkULToDNYJ1Rpbql7r6E3tH1ajl-0-79b13dc99a3a9d42e3f38e8f729024cf)
Master01节点下载安装文件,本节所用的安装文件均放在chap01/1.1目录中。
在源码中的repo目录配置使用的是国内仓库源,将其复制到所有节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5754.jpg?sign=1739500568-elIlkSiiMOBfGf9Bpch2uYKPETVgFwFn-0-a858d558a7dcab3024e576f423e942a8)
所有节点配置repo源:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5755.jpg?sign=1739500568-tVuFZuVHn41yV9YLHElOM0lBJVobZvBJ-0-75439dbb5423b2962e88b8f93f974fc8)
所有节点升级系统并重启,此处升级没有升级内核,下节会单独升级内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5756.jpg?sign=1739500568-hdPlF9Q8OsxiBLBwK2XAzp9qhCk4JAlw-0-a6a25fe01fefb50620e67901d0045d56)
1.1.2 内核升级
在安装过程中,很多文档及网上资源不会提及到内核升级的部分,但升级内核可以减少一些不必要的Bug,也是安装过程中颇为重要的一步。
本例升级的内核版本为4.18,采用rpm的安装方式,Master01节点下载内核升级包:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5954.jpg?sign=1739500568-eL4POWyi58oqlRhefjtHwPoh2EMYGYfx-0-94e142537930d7603e52da3c78c6f036)
将内核升级包复制到其他节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5956.jpg?sign=1739500568-IpRjcGjTvUEfVR7jGUcbpSWk95Mpi42L-0-50b70a7c86c37b5335928302d2fd1fbd)
所有节点升级内核:
yum localinstall -y kernel-ml*
所有节点修改内核启动顺序:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5958.jpg?sign=1739500568-MK2e2hLoSC1QEnfVfNKUB7O0O5OZMK8Z-0-516f832381ed5c1e155e1c24918ec485)
所有节点重启:
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=1739500568-2RpG26SIL53MjGNmwUUqhi3RzDXPEiuM-0-533aee8dee2ac1ada381c4399007ce30)
检查是否加载,并将其加入至开机自动加载(在目录/etc/sysconfig/modules/下创建一个k8s.modules写上上述命令即可):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5963.jpg?sign=1739500568-nYUyrRaP7rcEP2OOXepdkHzMqQ6jnxOU-0-8f0b459b143d390d0ac66e6e31acb2c0)
开启一些K8S集群中必须的内核参数,所有节点配置K8S内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P15_6171.jpg?sign=1739500568-X6KpbAe61IileSgOdsNH3Jd6OHUTjAtG-0-381cc07a91a9c8365469caeea5714fec)
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=1739500568-8lOVWMIzSY1ydJ7YoulzaOoC85R6Qf8m-0-8eb2f91da403b82323ee11abf12b3909)
所有节点设置开机自启动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=1739500568-b9vLE0hydqzOrETOTIiuscs7sdsBfYxK-0-938904b928b5101f9884a18be65348d9)
设置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=1739500568-0i1dVDSnLB7lix4JhCVbr9EJQCtCBglk-0-236551db3e824e36476533b7ffb62c0d)
所有Master节点配置KeepAlived。注意修改interface(服务器网卡)、priority(优先级,不同即可)、mcast_src_ip(本机IP),详细配置参考keepalived文档。
Master01节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P17_57156.jpg?sign=1739500568-3DohZ4hxqaBCu4lRoUEsGq8SyKY9CNIm-0-1dee05968f56df8a037d914597595c4e)
Master02节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57158.jpg?sign=1739500568-NciyzKurnNkiRU1ZIaFOFqgUI9Glwdpl-0-481a62c8a36fcc489c8da16e2a1b0208)
Master03节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57159.jpg?sign=1739500568-oYuiuDXxB7Ay7xBFNfEOYkO1c87kj5lu-0-a305446c844521308deca970da34eb04)
注意,上述的健康检查是关闭的,集群建立完成后再开启:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57161.jpg?sign=1739500568-NSnRy4hgkDBkRXlHHPVkcZYIhNjwhSON-0-daab03f206f8643278c91650e905e057)
配置KeepAlived健康检查文件:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57162.jpg?sign=1739500568-Zk4LpTVejgrIBy3Ff7e43j0kuG4me2hB-0-032b2a588add8554baae5075f9c89fd3)
启动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=1739500568-LLMIkEPk9VnL6RRoi5crRdkXi9dBt82s-0-ee9df9732a246936b523cbf114e482f6)
Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P21_57167.jpg?sign=1739500568-rvSQeQJPaba3jO2Q0Z3aixSbSUF6OG2M-0-c3c543b2bb3e4611b1f3c741b303baf6)
Master03:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P22_57168.jpg?sign=1739500568-t1hijIOBbJavOvsnYPuwCMmWWfTFOu26-0-f6f76891da7b20f1c6c32a915e203813)
所有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=1739500568-5mOnCN4kzDSBD0MvNR94tnZhgDBGGauE-0-e5a117a4c791430577e27c2ac2adbb9a)
所有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=1739500568-FbMEvYU08QANXSKyG54JQTUFgxO80xBg-0-45dbe792d6253c66ff742ce87ec3bf7a)
采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_57176.jpg?sign=1739500568-rRoxjpl5x7uzaKl1MKNBaKfm49cjrdVA-0-e94e15f177c2ea6e3a2c8cf8a0ae09bc)
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=1739500568-MijZ40xusraDd8JzN6yhinXYC81HsvZF-0-650ad6a37953a3453cbf765c29b12e54)
和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=1739500568-rcyaoOi3KvDW6Tmcu6vLHpdMpnjnTzHr-0-636354a2edf744a9f4102e78fea15877)
重启Kubelet:
systemctl restart kubelet
将Master02的Etcd加入到Master01的Etcd集群中:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57182.jpg?sign=1739500568-OqQWHdnVof44AQAsK28QLafgICeqhKuq-0-169afebfd1afba0d14bcbedbb15a4d20)
启动Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8553.jpg?sign=1739500568-FiyvmZHjVemqBkX6bhgcKACmoiCLmj5t-0-8211e193e68a4d53658cb092a0ea6a85)
配置Master03和配置Master02的步骤基本一致,除了配置Etcd集群时的IP地址和主机名信息不一致,其余步骤完全一致。
所有Master配置KUBECONFIG,用于访问集群:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8572.jpg?sign=1739500568-LQF3hp75dY5P27cDJPI8K1MQNV4ZgpuN-0-1f26590588db613ce2be0f63fc905577)
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=1739500568-wvTMe4mCy0ap1ewT1FCuo8EjX6vBr9ve-0-5335f75853e5b6008fbc46bc122a8e6e)
所有Node节点配置相同,加入后查看节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57187.jpg?sign=1739500568-ZkN0ZkuRdngmKUJEkyDCsrQWt5fzhtNk-0-c208ecc13c192cae84746181e25631bd)
允许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=1739500568-8KEHw0ojCm4nwydTnisEFQB2Gwd7EqPX-0-1156772f7fc80a2b9a4b9ff9717067b6)
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=1739500568-E0Pd3pPDef0NOfNEswYBfXVqyTY5fyns-0-7c0f7ff0019b618087a0b3718118d7d9)
图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=1739500568-DipFtQAUotTOlF1FPYO8KYBiBORBr9kI-0-d90517e8c25b1a16fcedf5cfe9ee9583)
图1-2 Dashboard登录方式
查看token值:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P28_57197.jpg?sign=1739500568-Zq3w7j2YeMxfJJ1FFZfUXKQD3GnpNLgg-0-40b965949e3dbfc49761e5390fb399f2)
将token值输入到令牌后,单击登录即可访问Dashboard,参考图1-3。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P29_9183.jpg?sign=1739500568-Vh1fhAg1NVsKXBAavKCoP8rnHgOxWx9c-0-0feed9316c0c92b87da06d71db33c430)
图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=1739500568-BbbqSOoAooDMHC8h6efUMV67wLt0WY24-0-7ead2e1860fa3edff9b3e7860479326a)
验证Kube-Proxy模式
[root@K8S-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode ipvs