尝试用虚拟机手工搭建k8s集群,本文是搭建流程简单记录,使用了三台CentOS虚拟机节点作为物理Node,由于众所周知的原因,公网引发问题不计其数,所以需要一些额外的垃圾步骤,并且过程中遇到了很多莫名巧妙的问题,多次重新安装了虚拟机及中间的一些Trouble Shooting,为了确保流程简洁此处暂时省略少部分细节。
网络拓扑
使用三台虚拟机运行Linux,一台作为Master Node使用,两台作为Slave Node使用,网络配置如下,其中Bridge网络作为OAM网络及极端情况下挂VPN下载镜像及组件等(整个过程实际没有使用VPN),Internal网络作为Node之间的联络网络,Pod网络是Calico自建网络。
配置虚拟机系统及软件安装
创建1台虚拟机作为Mater节点,安装系统,CPU至少使用2核,单核会导致k8s报错,内存我设置为2GB,硬盘给了10GB,这些硬件配置安装好系统后也可以更改。常规安装CentOS,安装完成后更改主机名为,
1 | hostnamectl --static set-hostname master |
更新Docker源
1 | cd /etc/yum.repos.d/ |
创建Kubernetes源,kubernetes.repo,文件内容为,
1 | [kubernetes] |
开始安装并启动相应服务,
1 | yum install docker-ce |
修改一些系统参数,尝试了不修改这些参数,在部署过程中会报错,导致部署失败,查看相关原因都跟这几个参数有关。
1 | #SELINUX |
做好以上配置后,再克隆2台虚拟机作为NodeA和NodeB工作节点。
配置k8s Master节点
获取所需容器镜像
由于不能直连其中涉及到的域名,所以只能额外增加了这步操作,查看所需的镜像。也可以通过配置Proxy或者开VPN的方式,这样不需要提前下载镜像。
1 | [root@master ~]# kubeadm config images list |
准备如下shell脚本文件并运行,之后使用docker image ls可以看到下载好的镜像。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
images=(
kube-apiserver:v1.14.2
kube-controller-manager:v1.14.2
kube-scheduler:v1.14.2
kube-proxy:v1.14.2
pause:3.1
etcd:3.3.10
coredns:1.3.1
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
done
确认下载image,
1 | [root@k8s-master ~]# docker image ls |
初始化Master节点(使用kubeadm reset可以回滚)
1 | kubeadm init --apiserver-advertise-address 192.168.56.117 --pod-network-cidr=10.244.0.0/16 |
1 | [root@master ~]# kubeadm init --apiserver-advertise-address 192.168.56.117 --pod-network-cidr=10.244.0.0/16 |
1 | mkdir -p $HOME/.kube |
配置k8s Slave节点
修改两台worker节点主机名
1 | #nodea |
在master,nodea,nodeb上修改/etc/hosts文件,
1 | 192.168.56.117 master |
在nodea和nodeb上执行,(使用kubeadm reset可以回滚)
1 | kubeadm join 192.168.56.117:6443 --token cn6unj.8xj0rfk7w9a49x5y \ |
在master上执行,
1 | [root@master ~]# kubectl get nodes |
查看NotReady的原因,
1 | [root@k8s-master ~]# kubectl describe node k8s-nodea |
安装网络插件
此处使用calico插件,
1 | kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml |
查看Node状态,
1 | [root@master ~]# kubectl get nodes |
查看Pod状态,
1 | [root@master ~]# kubectl get pods --all-namespaces |
以上就完成了k8s集群的配置工作。
运行一个应用
创建一个myweb.yaml文件,
1 | apiVersion: v1 |
在集群上运行镜像,
1 | [root@master ~]# kubectl create -f myweb.yml |
过程中遇到的一个小问题
安装网络插件后,查看Node状态和Pod状态,
1 | [root@master ~]# kubectl get nodes |
查看原因,
1 | [root@master ~]# kubectl describe pod kube-proxy-86j9l --namespace=kube-system |
拉缺失镜像
1 | [root@nodeb ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 |
再次查看失败原因,
1 | [root@master ~]# kubectl describe pod calico-node-p2nft --namespace=kube-system |
拉缺失镜像,换了几个国内源终于找到了一个。
1 | [root@nodea ~]# docker pull quay-mirror.qiniu.com/calico/cni:v3.7.2 |