本次集群搭建采用比较流行的kubeadm方式,相比于二进制的安装配置kubernetes集群的方式,在流程上更加简单,因为省去了手工创建众多的配置文件,减少了很多出错的可能。kubeadm作为Kubernetes官方提供的集群部署管理工具,采用“一键式”指令进行集群的快速初始化和安装,极大地简化了部署过程,消除了集群安装的痛点。

一:准备工作 

        在安装前需规划好集群的网络及安装的版本,根据实际项目需要提前准备足够性能的服务器。本次搭建采用全离线安装的方式,需提前准备好集群搭建所需的离线资源,包括docker及其依赖,kubelet_v1.13,kubeadm_v1.13,kubectl_v1.13,网络组件cri-tools_1.11.0及其依赖,还有相应模块镜像文件。


k8s部署prometheus 离线安装 离线安装k8s集群_kubernetes

kubelet&kubeadm&kubectl&cni安装包

k8s部署prometheus 离线安装 离线安装k8s集群_云原生_02

Docker_v18及其依赖

k8s部署prometheus 离线安装 离线安装k8s集群_docker_03

镜像文件

    

 二:环境配置及软件安装

Master和Node节点均需进行该章节的操作。

1,关闭防火墙

systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

2,修改hostname(很重要)

hostnamectl set-hostname <newhostname>

 改完后要检查一下有没有生效:

k8s部署prometheus 离线安装 离线安装k8s集群_离线_04

         此处有一个坑,如果漏掉这个步骤或者修改没有生效的话,在后续node节点加入集群的时候,如果master节点采用默认的hostname,则会和master节点的hostname重合,导致master节点上的相关组件pod反复重启。

3,关闭系统的Swap

        修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止重启后swap启用,Kubernetes 1.8开始要求关闭系统的Swap。如果不关闭,默认配置下kubelet将无法启动。

swapoff -a
vim /etc/fstab

 #把这行注释: /dev/mapper/centos-swap swap

free -h 检查 swap 是否关闭,若全为0则修改成功

k8s部署prometheus 离线安装 离线安装k8s集群_离线_05

4,禁用SELINUX

setenforce 0
vi /etc/selinux/config
#SELINUX修改为disabled
SELINUX=disabled

 5,开启桥接网络支持

出于安全考虑,Linux系统默认是禁止数据包转发的。转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。

kube-proxy的ipvs模式和calico(都涉及路由转发)及flannel都需要主机开启ipv4转发。另外,不使用k8s,即使只使用docker的时候,以下两种情况也依赖ipv4转发:

<1>当同一主机上的两个跨bridge(跨bridge相当于跨网段,跨网络需要路由)的容器互访

<2>从容器内访问外部

操作:新建/etc/sysctl.d/k8s.conf文件,文件内容如下:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

执行:sysctl -p /etc/sysctl.d/k8s.conf

k8s部署prometheus 离线安装 离线安装k8s集群_V1.13.0_06

 6,安装docker

Docker的离线安装包及其依赖已经提前准备好在本地

rpm -ivh docker/* --nodeps --force
systemctl daemon-reload
systemctl enable docker
systemctl start docker

k8s部署prometheus 离线安装 离线安装k8s集群_kubernetes_07

 7,安装 kubelet,kubeadm,kubectl, cni-plugins

        使用 kubeadm 来进行搭建,已提前下载好kubelet,kubeadm,kubectl, cni-plugins的安装包及依赖,可以直接安装

rpm -ivh * --nodeps --force
systemctl enable kubelet && systemctl start kubelet

k8s部署prometheus 离线安装 离线安装k8s集群_离线_08

 经过以上步骤master和node节点的kubernetes基础环境配置已经完成

三:MASTER节点上初始化集群

1,导入镜像

        前面讲到kubeadm安装的方式比二进制方便快捷,是因为kubeadm方式,很多集群依赖的组件都是以容器方式运行在Master节点上。所以在master节点上需要准备好运行容器所需要的镜像,同样镜像文件也已经提前下载到了本地,只需导入即可。 

docker load < coredns.tar
docker load < etcd.tar
docker load < flannel.tar
docker load < kube-apiserver.tar
docker load < kube-controller-manager.tar
docker load < kube-proxy.tar
docker load < kube-scheduler.tar
docker load < pause.tar

检查一下导入的镜像是否齐全

k8s部署prometheus 离线安装 离线安装k8s集群_kubernetes_09

 2,初始化集群

kubeadm init   --kubernetes-version=v1.13.0   --pod-network-cidr=10.244.0.0/16   --apiserver-advertise-address=X.X.X.X --token-ttl 0

参数解释:

--kubernetes-version:初始化集群的版本,这里是v1.13.0,如果没指定版本,会请求 https://storage.googleapis.com/kubernetes-release/release/stable-1.9.txt ,如果没翻墙网,就超时报错

--pod-network-cidr:通过这个值来设定pod网络的IP地址网段;设置了这个值以后,控制平面会自动给每个节点设置CIDRs。Flannel网络默认是10.244.0.0/16,由于开发云只需连到POD里进行开发,可以通过暴露端口的方式进行连接,故这里采用Flannel默认的网络配置。

--apiserver-advertise-address:指定api服务监听的IP

--token-ttl: 默认的token有效期24小时, 设置为0表示永不过期

当然kubeadm init还有很多可灵活配置的参数,可以根据自己需求来指定不同的参数。可以参考该链接:kubeadm init | Kubernetes

        初始化后的打印会给出一系列的提示信息,相关信息对于理解集群的初始化过程非常有用,建议仔细阅读。在初始化的结尾会提示后续的操作。 

3,根据提示 ,要使用集群需要执行以下命令

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

        此时可以看一下集群的状态,由于网络没有配置,coredns的容器没有起来,mater节点仍处于NotReady状态

k8s部署prometheus 离线安装 离线安装k8s集群_离线_10

 POD的运行状态

k8s部署prometheus 离线安装 离线安装k8s集群_离线_11

4,同样在提示中也指明了下一步You should now deploy a pod network to the cluster,需要为集群部署一个POD网络。这里选用Flannel网络,需要提前准备好部署Flannel网络所需要的部署文件。

kubectl apply -f kube-flannel.yml

        这里需要注意,如果MASTER节点不止一张网卡的话,需在配置文件中指定监听的网卡,不然会默认监听顺序第一的网卡。

        需要在kube-flannel.yml文件中指定具体的网卡,在如下位置加入- --iface=enp2s0

k8s部署prometheus 离线安装 离线安装k8s集群_kubernetes_12

         至此MASTER节点的环境的基本部署已经完成,此时可以看一下MASTER节点的状态,正常情况下已经处于Ready状态,组件的POD也已经全都起来了。如果初始化失败,也可以用kubeadm reset来恢复,当然这个命令只是在实验的时候用,在生成环境慎用。另外,默认是不开启kubectl命令的自动补齐功能,为方便后续运维开启该功能

echo 'source <(kubectl completion bash)' >> /etc/profile
source /etc/profile

四:NODE节点加入集群

        NODE节点只需导入必要的镜像即可加入集群 

1,导入镜像

docker load < pause.tar
docker load < kube-proxy.tar
docker load < flannel.tar

查看导入的镜像

k8s部署prometheus 离线安装 离线安装k8s集群_云原生_13

 2,加入集群

在kubeadm init初始化的提示最后一步指明了NODE节点加入集群的方法

kubeadm joinX.X.X.X:6443 --token XXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXXXXXX

        万一上述的初始化过程没有记录下来,没有kubeadm join这条命令,也可在master节点上执行下面命令获取master的join token

kubeadm token create --print-join-command

        执行kubeadm join命令后重点关注node节点hostname,如果修改成功会显示你设置的node名,如果没有修改成功则此处会显示默认的主机名localhost.localdomain,这时不会提示失败,如果刚好master节点的主机名也是这个,则节点加入后会导致MASTER节点的组件POD一直在反复重启,切记

        此时在master看,可以看到node节点加入成功加入了集群

k8s部署prometheus 离线安装 离线安装k8s集群_离线_14

         后续的节点加入集群只需要重复上面的过程即可

五:总结

        本集群搭建完全基于离线的环境来搭建集群,对于在内网中无法获取相关kubernetes相关资源具有参考意义。