![再也不踩坑的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=1738886777-x9Ba6vO2f8o8ggLUrv0PyPevfOS8EBNC-0-96ed5aacf386ad72a071f835b039c555)
各节点通信采用主机名的方式,这种方式与IP地址相比较更具有扩展性。以下介绍具体的安装步骤。
所有节点配置hosts,修改/etc/hosts如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5594.jpg?sign=1738886777-owUSL8AHFMaP8yFv9nUBfL0cBrqGclsa-0-f3d0f9166c82061944fb0314dbec7a5e)
所有节点关闭防火墙、selinux、dnsmasq、swap(如果开启防火墙需要开放对应的端口,配置较为复杂)。如果在云上部署,可以通过安全组进行安全配置。服务器配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5595.jpg?sign=1738886777-KCWvcyNDd2YSe70tGuBDZnRDjZmntW6B-0-e718373d2a30356e600b8ca6e581f339)
关闭Selinux
setenforce 0
将/etc/sysconfig/selinux文件中的SELINUX改为disabled:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P12_5596.jpg?sign=1738886777-0pveTqvNTE1ASvqJ6fYs4lJIfRDWLtkh-0-492b1373f1984486bb8d0d7a94da9970)
关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
注释swap挂载选项:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5750.jpg?sign=1738886777-s7IWXR982F0x0fVuoIa3UzFg2jLEpwud-0-f647748a9827e8d84870e0dc37d03866)
所有节点同步时间。所有节点同步时间是必须的,并且需要加到开机自启动和计划任务中,如果节点时间不同步,会造成Etcd存储Kubernetes信息的键-值(key-value)数据库同步数据不正常,也会造成证书出现问题。时间同步配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5751.jpg?sign=1738886777-0J7PiMZwAjEC1T0HkqPmXmTjtXltgcDW-0-c8c91c2b4f9f39c83d6a800005bfde28)
所有节点配置limit:
ulimit -SHn 65535
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS上需要单独一台kubectl服务器。密钥配置如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5753.jpg?sign=1738886777-pwbl5LwgkN9L6Y3ve93J4wLEy3BHmncQ-0-d2715bf7992368b37db37770fe0b2865)
Master01节点下载安装文件,本节所用的安装文件均放在chap01/1.1目录中。
在源码中的repo目录配置使用的是国内仓库源,将其复制到所有节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5754.jpg?sign=1738886777-wDYZ6bYrgYdAC7ttTKO9bhbU9IJdaBsU-0-7e2d826e8a0d267827779a655917dd63)
所有节点配置repo源:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5755.jpg?sign=1738886777-d9ZEvSSivmxvTeCBoF8F9NEgceX2WZeR-0-bedd20ad6b566120d89e027fb1dc4500)
所有节点升级系统并重启,此处升级没有升级内核,下节会单独升级内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5756.jpg?sign=1738886777-azxO7LqISNONDC7Itn9rU1OgNIVsHYsB-0-702acaffe9a611e51dc34f23993be56a)
1.1.2 内核升级
在安装过程中,很多文档及网上资源不会提及到内核升级的部分,但升级内核可以减少一些不必要的Bug,也是安装过程中颇为重要的一步。
本例升级的内核版本为4.18,采用rpm的安装方式,Master01节点下载内核升级包:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P13_5954.jpg?sign=1738886777-ALwUVs7Fw03hrR3K7kCWXCL5TCZIO2bv-0-5e81eadb1d308fc70b41d18ce741a488)
将内核升级包复制到其他节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5956.jpg?sign=1738886777-Qb4Be41j940NvdHBnny5GeCWOQfORvAi-0-f4df70d4ade2575a2ebaa3f142bb7123)
所有节点升级内核:
yum localinstall -y kernel-ml*
所有节点修改内核启动顺序:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5958.jpg?sign=1738886777-UMkIlPlvKDsUkyWHDsnldoV60OMhqi2E-0-4013caf8e32558b047b4b8644b897891)
所有节点重启:
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=1738886777-GwLIKxgiyAzCnQnWcmkI8ebMcjRvmvDE-0-917c6b254ea87f3aa47dfe8d06d1899c)
检查是否加载,并将其加入至开机自动加载(在目录/etc/sysconfig/modules/下创建一个k8s.modules写上上述命令即可):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P14_5963.jpg?sign=1738886777-S0nLyr2Ceubwkpn5iy999qQsXpQQAvfE-0-2dca779f8d80469a9d0e230cfb48deba)
开启一些K8S集群中必须的内核参数,所有节点配置K8S内核:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P15_6171.jpg?sign=1738886777-ASPq0rF3Q9zEJ7xYtQO86T44olFOI13w-0-84d8108408aae87c8aae8e769ba3a074)
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=1738886777-GPNClwBKPfX2GohjdIrDG6BZJuHoP4vI-0-8da616836d3a743074aea0bb24d23f3b)
所有节点设置开机自启动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=1738886777-SQHSSiaHc5JbGuZOUTSWqpnpzYWfmBIk-0-87a0f356de10a8e3ddcbee9ca44cee1a)
设置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=1738886777-qwhIUB2ks9dzKw7HXhUn9RtqKburXb6e-0-0a0b6ac4ca7010dea0c5f816f3bbb27c)
所有Master节点配置KeepAlived。注意修改interface(服务器网卡)、priority(优先级,不同即可)、mcast_src_ip(本机IP),详细配置参考keepalived文档。
Master01节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P17_57156.jpg?sign=1738886777-UWwLcrqlneuyYjo250tAHQcOgv2Ecx2Q-0-a5eb8cbf54d5094122cdfdc2adb710cc)
Master02节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57158.jpg?sign=1738886777-6ZBSRSzTtAI3x6wiBIW4muTswD12EBhn-0-0626a752b043d76470da3cf046e022b7)
Master03节点的配置:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P18_57159.jpg?sign=1738886777-dK1s7016c4g5BlLtmdmXSCRFVoutBw0J-0-f476c8d7e408d17452de0985a3494e07)
注意,上述的健康检查是关闭的,集群建立完成后再开启:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57161.jpg?sign=1738886777-urksN0EG4R6lL0YHQ5isOzNJX1q4me9U-0-b26ec211a2d3747fc8d85e169d0003bb)
配置KeepAlived健康检查文件:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P19_57162.jpg?sign=1738886777-qJNi7cVyNDg8a9d8pQ4Dyj2KJ6Q4tVbL-0-bfa65bde4d8da8c7b4c2e4a433f7f46e)
启动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=1738886777-RI3cCEDLlBCjp1ZiHYWeHmFtvQYmJWX4-0-942fa0c4f835aa6b0034d497162627ff)
Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P21_57167.jpg?sign=1738886777-R7Dv4RodaUTH410Yu0aILuVJK7OsETDk-0-7f24ca6157c5637970b86408cf55d5f1)
Master03:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P22_57168.jpg?sign=1738886777-TDHdx97694cVV0yRJ5VV9NCfoGEb5frb-0-0b6bba0c4fff28161b2c3e1e3630712b)
所有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=1738886777-YKi5qYBuSgCkUar9jUeKKMYCaycixE6Y-0-ded1133083b455550a52b15836196a5f)
所有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=1738886777-mW6tTL43lLmthEhZU90JqpItCUEZ6gPh-0-e9f66d24f59af02606685163ac2d42d7)
采用初始化安装方式,所有的系统组件均以容器的方式运行并且在kube-system命名空间内,此时可以查看Pod状态:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P23_57176.jpg?sign=1738886777-9lq4PlOsgPaL6TOreo2VkNeJAjYTZ70R-0-4bf8799d37e460e3a124a077bc3290e9)
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=1738886777-m80YdNUCK6yxeLgKraGgqIuqlEjP7sXs-0-5853dd4859f364e5e6da83f58d276479)
和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=1738886777-y7PynaceNnkfgHAp75YHpTKPLsxQJz2J-0-d6622074d371750cf746376e79885831)
重启Kubelet:
systemctl restart kubelet
将Master02的Etcd加入到Master01的Etcd集群中:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57182.jpg?sign=1738886777-2X56vRpu5efsJ2uA3vr8iGZ6eR8bFc5B-0-aa9d52c2c11085ae59bca0376ad53648)
启动Master02:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8553.jpg?sign=1738886777-e2VL8As8c1CY1TIzbesLIQs05uKJq46k-0-d703ba27af0284553ac53f965be38c50)
配置Master03和配置Master02的步骤基本一致,除了配置Etcd集群时的IP地址和主机名信息不一致,其余步骤完全一致。
所有Master配置KUBECONFIG,用于访问集群:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_8572.jpg?sign=1738886777-Qkx3rc7anuSVhQeMICHu3jpkGOL3Z4DB-0-16df5fdd54ea7c7e7856109941cc0317)
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=1738886777-60Md8zks2bjbZnxQmqPHJolceEbn5LDy-0-1a09212cefadffdd1d07fd7e1883d048)
所有Node节点配置相同,加入后查看节点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P25_57187.jpg?sign=1738886777-LP5kqo5rHJwSZTTAZeCONdMRGXhQpFEr-0-8e4d8a519ddc9a6393d8fb59a89a11c5)
允许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=1738886777-G5CGEBy4hLukeriB8udpsw365Z8bjh8X-0-f8f9512f7b814be45706412326dbf485)
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=1738886777-d8WQzODxMpeeq0XSNyzYizd6o7SvuqBy-0-0aace6d58cdc1b08687f2614bf4b3fba)
图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=1738886777-MI7sn0cBk8qN3lxqpMBhfHzILTNHskVk-0-76ce222b88e590f7821522e6e84b99fc)
图1-2 Dashboard登录方式
查看token值:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P28_57197.jpg?sign=1738886777-ztosn7tXElWncYtseqQWGOnzhoqHgcKJ-0-6f83ae60ad18821f5fc7242bd73a6fc3)
将token值输入到令牌后,单击登录即可访问Dashboard,参考图1-3。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P29_9183.jpg?sign=1738886777-wBC9tk8VgVxJW5raX8vjAIyAlbr3PJcI-0-dd292b46d2e522f9dc39235086c056ea)
图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=1738886777-lkyUSMPNakE46rnQYsxqH8J0Tf7mzMKc-0-373ced7cfd7089f2afb95ccffa0394b0)
验证Kube-Proxy模式
[root@K8S-master01 1.1.1]# curl 127.0.0.1:10249/proxyMode ipvs