本次集群搭建采用比较流行的kubeadm方式,相比于二进制的安装配置kubernetes集群的方式,在流程上更加简单,因为省去了手工创建众多的配置文件,减少了很多出错的可能。kubeadm作为Kubernetes官方提供的集群部署管理工具,采用“一键式”指令进行集群的快速初始化和安装,极大地简化了部署过程,消除了集群安装的痛点。
一:准备工作
在安装前需规划好集群的网络及安装的版本,根据实际项目需要提前准备足够性能的服务器。本次搭建采用全离线安装的方式,需提前准备好集群搭建所需的离线资源,包括docker及其依赖,kubelet_v1.13,kubeadm_v1.13,kubectl_v1.13,网络组件cri-tools_1.11.0及其依赖,还有相应模块镜像文件。
kubelet&kubeadm&kubectl&cni安装包
Docker_v18及其依赖
镜像文件
二:环境配置及软件安装
Master和Node节点均需进行该章节的操作。
1,关闭防火墙
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
2,修改hostname(很重要)
hostnamectl set-hostname <newhostname>
改完后要检查一下有没有生效:
此处有一个坑,如果漏掉这个步骤或者修改没有生效的话,在后续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则修改成功
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
6,安装docker
Docker的离线安装包及其依赖已经提前准备好在本地
rpm -ivh docker/* --nodeps --force
systemctl daemon-reload
systemctl enable docker
systemctl start docker
7,安装 kubelet,kubeadm,kubectl, cni-plugins
使用 kubeadm 来进行搭建,已提前下载好kubelet,kubeadm,kubectl, cni-plugins的安装包及依赖,可以直接安装
rpm -ivh * --nodeps --force
systemctl enable kubelet && systemctl start kubelet
经过以上步骤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
检查一下导入的镜像是否齐全
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状态
POD的运行状态
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
至此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
查看导入的镜像
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节点加入成功加入了集群
后续的节点加入集群只需要重复上面的过程即可
五:总结
本集群搭建完全基于离线的环境来搭建集群,对于在内网中无法获取相关kubernetes相关资源具有参考意义。