一、前言
搭建kubernetes需要充足的时间与耐心,遇到报错时要及时排查,不要焦急,一定能搭建成功!
二、搭建流程
2.1 安装doccker服务与配置
安装docker-ce
[root@hd1.com ~]# for i in 1 2 3;do ssh hd${i}.com yum -y install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io && systemctl start docker && systemctl enable docker.service ;done
配置docker镜像加速器和驱动
[root@hd1.com ~]#vim /etc/docker/daemon.json { "registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] }
修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。
[root@hd1.com ~]# systemctl daemon-reload && systemctl restart docker [root@hd1.com ~]# systemctl status docker [root@hd1.com ~]#for i in 1 2 3;do scp /etc/docker/daemon.json hd${i}.com:/etc/docker/ ;done [root@hd1.com ~]# for i in 1 2 3;do ssh hd${i}.com systemctl daemon-reload && systemctl restart docker ;done
安装初始化k8s需要的软件包
[root@hd1.com ~]# for i in 1 2 3;do ssh hd${i}.com yum -y install kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 && systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet ;done
可以看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。
2.2 安装初始化k8s所需软件包
[root@hd1.com ~]# for i in 1 2 3;do ssh hd${i}.com yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 && systemctl enable kubelet && systemctl start kubelet & systemctl status kubelet ;done
执行后可看到kubelet不是running状态,是因为k8s组件还未完全,是正常的
每个软件包的作用:
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.3 kubeadm初始化k8s集群
把初始化k8s集群需要的离线镜像包上传到hd1.com、hd2.com、hd3.com机器上,手动解压:
[root@hd1.com ~]# rz [root@hd1.com ~]# for i in 2 3;do scp k8simage-1-20-6.tar.gz hd${i}.com:/root/ [root@hd1.com ~]# for i in 2 3;do ssh hd${i}.com docker load -i k8simage-1-20-6.tar.gz
使用kubeadm初始化k8s集群(仅master机)
[root@hd1.com ~]# kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=192.168.1.11 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification
注:
①--image-repository registry.aliyuncs.com/google_containers:手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8s.grc.io拉取镜像,但是k8s.gcr.io访问不到,所以需要指定从registry.aliyuncs.com/google_containers仓库拉取镜像。
②初始化后所给的命令是把node节点加入集群,需要保存下来,每个人的都不一样
置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理
[root@hd1.com ~]# mkdir -p $HOME/.kube [root@hd1.com ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@hd1.com ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@hd1.com ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hd1.com NotReady control-plane,master 60s v1.20.6
此时集群状态还是NotReady状态,因为没有安装网络插件。
2.4 扩容k8s集群
在hd1.com上查看加入节点的命令:
[root@hd1.com ~]# kubeadm token create --print-join-command
显示如下:
kubeadm join 192.168.1.11:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
使用上述命令或初始化最后所给的命令,把两个node节点加入k8s集群:
[root@hd2.com~]# kubeadm join 192.168.1.11:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a [root@hd3.com~]# kubeadm join 192.168.1.11:6443 --token i3u8gu.n1d6fy40jdxgqjpu --discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
在hd1.com上查看集群节点状况:
[root@hd1.com ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hd1.com NotReady control-plane,master 53m v1.20.6 hd2.com NotReady <none> 59s v1.20.6 hd3.com NotReady <none> 59s v1.20.6
可以看到hd2.com、hd3.com的ROLES角色为空,<none>就表示这个节点是工作节点。
可以把hd2.com和hd3.com的ROLES变成work,按照如下方法:
[root@hd1.com ~]# kubectl label node hd2.com node-role.kubernetes.io/worker=worker [root@hd1.com ~]# kubectl label node hd3.com node-role.kubernetes.io/worker=worker
注意:上面状态都是NotReady状态,说明没有安装网络插件
2.5 安装kubernetes网络组件-Calico
上传calico.yaml到hd1.com上,使用yaml文件安装calico 网络插件 。
[root@hd1.com ~]# rz [root@hd1.com ~]# kubectl apply -f calico.yaml [root@hd1.com ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hd1.com Ready control-plane,master 58m v1.20.6 hd2.com Ready <none> 5m46s v1.20.6 hd3.com Ready <none> 5m46s v1.20.6 [root@hd1.com ~]# kubectl get pod -n kube-system
2.6 测试在k8s创建pod是否可以正常访问网络
把busybox-1-28.tar.gz上传到hd2.com、hd3.com节点,手动解压
[root@hd2.com ~]# docker load -i busybox-1-28.tar.gz [root@hd3.com ~]# docker load -i busybox-1-28.tar.gz [root@hd1.com ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh / # ping www.baidu.com PING www.baidu.com (39.156.66.18): 56 data bytes 64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了
2.7 测试k8s集群中部署tomcat服务
把tomcat.tar.gz上传到hd2.com、hd3.com,手动解压
[root@hd2.com ~]# docker load -i tomcat.tar.gz [root@hd3.com ~]# docker load -i tomcat.tar.gz [root@hd1.com ~]# kubectl apply -f tomcat.yaml [root@hd1.com ~]# kubectl get pods NAME READY STATUS RESTARTS AGE demo-pod 1/1 Running 0 10s #查看ip地址 [root@hd1 ~]# kubectl get pods -o wide|grep 10 demo-pod 1/1 Running 0 2m15s 10.244.156.132 hd2.com [root@hd1.com ~]# kubectl apply -f tomcat-service.yaml [root@hd1.com ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.255.0.1 <none> 443/TCP 158m tomcat NodePort 10.255.227.179 <none> 8080:30080/TCP 19m
在浏览器访问hd2.com节点的ip:30080即可请求到浏览器