1.部署流程
项目需要最近在了解k8s,尝试使用虚拟机模拟集群环境,结合了不同的部署教程,给出一个基本的安装流程,以及遇到的问题。
安装环境:windows10+vmware(模拟集群环境)+ubuntu 16.04
思路:利用虚拟机模拟集群环境,虚拟机上安装ubuntu 16.04系统,创建了两个虚拟机,一个作为master节点(集群的总控节点,相当于集群的大脑),一个作为从节点node(相当于集群里可供调度的资源),二者的关系相当于将军-士兵,将军只有一个,士兵可以有很多,供将军调配。需要在所有的节点(master和所有node)上安装docker,kubeadm,kubelet,kubectl,master节点需要一些特别的配置,这是作为“大脑”的特殊地方。
- kubeadm:引导启动k8s集群的安装与启动。
- kubelet:在集群中所有节点上运行的核心组件,用来执行如启动pods和containers等操作。
- kubectl:操作集群的命令行工具。
安装命令:
https://blog.csdn.net/qq_14845119/article/details/83349471
https://www.cnblogs.com/rainingnight/p/using-kubeadm-to-create-a-cluster-1-13.html
因为我安装的过程遇到了太多的坑,主要精力花费在解决问题上了,所以安装过程没有截图了,所有的命令都可以在这里找到。
2.遇到的问题
遇到的大部分问题都在于访问限制,所以在一些命令中需要更换aliyun源,尤其是在集群初始化的时候。
1.kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=0.0.0.0 --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=Swap
这是集群的初始化命令,其中–pod-network-cidr参数指定的是pod网络的地址(对网络了解不深,为什么这么写的原因还不了解),–apiserver-advertise-address指定的是master节点的网络地址,–image-registry指定的是国内镜像地址
2.集群初始化遇到问题时,用该命令进行清理:sudo kubeadm reset
需要注意的是初始化之后有一系列的创建、拷贝admin.conf文件到$HOME/.kube/下的操作,而reset操作并不会清理这个目录,所以无比要手动删除,否则之后的操作会报错“Unable to connect to the server: x509: certificate signed by unknown authority”。
- The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
遇到该问题是在执行“kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml”命令时遇到的,解决办法就是添加该地址的ip到hosts文件里,操作可见这里
- The connection to the server localhost:8080 was refused - did you specify the right host or port?
遇到该问题同样是在执行apply kube-flannel.yml命令之后,解决办法见这里
- networkPlugin cni failed to set up pod “coredns-9d85f5447-2j4t8_kube-system” network: open /run/flannel/subnet.env: no such file or directory
遇到该问题是在获取命名空间中的全部pod时出现的,主要原因是coredns对应的pod一直没有running,针对这个问题有以下几种解决办法:
(1)查看指定路径下是否存在subnet.env文件
/run/flannel/subnet.env的内容:
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.224.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
(2)coredns pod的状态显示为“CrashLoopBackOff”
这个问题在报错中给出了官方的解决办法,造成这一问题的主要原因在于resolv.conf文件中的nameserver设置为了127.0.0.1,指向了自身,导致出现了环路,而k8s环境中的某种机制检测到了这种环路,所以不停的重启该pod。解决办法有两种:
(i)sudo情况下修改resolv.conf文件,将指向自身(127开头)的nameserver一行注释掉,添加8.8.8.8或114.114.114.114.(需要注意的是我的系统中resolv.conf文件存在多个,而etc目录下的resolv.conf连接到了run/resolvconf/resolv.conf,所以需要修改根源的文件内容,注意注意!),然后重启kubelet服务,
(ii)直接暴力删除coredns出错的节点,系统会自动重建该节点,如果进行了上述操作没有反应的话可以尝试这一招。
6.之前apply的flannel-pod可以正常running,但是在修改hostname之后状态一直为“pending”。
造成这一问题的原因在于:我在集群初始化之后修改了hostname(这一操作应当放在配置环境的开头,否则原来可以running的pod变成了pending,错误日志显示找不到修改后的hostname),解决办法就是kubeadm reset,然后重新操作。
7.[kubelet] Downloading configuration for the kubelet from the “kubelet-config-1.11” ConfigMap in the kube-system namespace configmaps “kubelet-config-1.11” is forbidden: User “system:bootstrap:7df77e” cannot get configmaps in the namespace "kube-system
这个错误出现在 在从节点上执行join命令加入master节点的时候,造成这一错误的原因在于master节点与“士兵”节点node的kubeadm,kubelet,kubectl或者docker版本不一致。在这种集群部署的过程中,版本还是一个非常重要的地方,应当时刻注意版本信息。解决办法就是将所有相关的组件都卸载,然后apt-get install时指定为master节点所采用的版本。
8.节点添加成功,但状态显示notready
出现这一情况时,在从节点上执行 journalctl -f -u kubelet 查看 kubelet日志,提示notready的原因是
“Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized”,造成这一问题的原因没有了解清楚,只是照做了它的操作,执行命令 docker images|grep flannel,之后再在master节点上get nodes 就显示ready了。
3.总结
新手入门,从来没有任何的部署经验,想要了解k8s的机制,最好的方法还是自己部署一遍,遇到错误变查边学对于了解大体的框架还是有很大帮助的。水平有限,欢迎指导。
【注意】最开始部署k8s完全是为了学习kubeflow,现在发现教程里的一个问题在于k8s版本过高,导致在该版本上配置kubeflow1.0不确定有没有问题,在利用apt-get 安装时,update之后的安装自动安装的是最新版本的docker和k8s,所以务必要自己指定安装的版本,以免部署之后发现不适配!!!!!!!!!!!!!!!