离线部署的前提(亲测成功,其他的不保证):
麒麟系统的内核: 4.19.90-25.2.v2101.gfb01.ky10.aarch64
Docker : v 20.10.7
k8s:v1.23.4
另外,k8s部署的服务器内存建议预留大一些。
准备相关的包:ipvsadm包(ipvsadm),
docker的二进制包(docker-二进制包),
k8s组件的rpm包(k8s-rpm),
k8s相关的镜像文件(k8s-image),
k8s环境的依赖项(k8s-dependency),
配置文件(yaml),
搭建本地仓库的镜像包(registry-image)
未部署过k8s的环境,在部署过程中系统会提示缺少一些依赖项,相关的依赖项放置在k8s-dependency中。
本次部署基于两台银河麒麟v10计算机,一台作为k8s的调度节点master,一台作为k8s的工作节点node,修改两台计算机的网络配置(如果是多网卡的话,配置ip对应的网络配置文件),设置静态ip:
cd /etc/sysconfig/network-scripts //网络配置文件在这里 ls cp ./ifcfg-ens33 ./ifcfg-ens33.bak //修改系统文件前养成做备份的习惯 vim ifcfg-ens33
修改以下内容:
BOOTPROTO=static ONBOOT=yes
添加以下内容:
IPADDR=192.168.0.190 NETMASK=255.255.255.0 GATEWAY=192.168.0.2 DNS=8.8.8.8
修改域名解析文件:
vim /etc/resolv.conf 添加: nameserver 8.8.8.8
重启网络服务:
service network restart 或 systemctl restart network
查看系统ip:
ip addr
两台计算机都要进行的操作(1,2,3,4,5)
1.查看麒麟系统的内核
uname -a
2. 环境初始化
1)主机名解析
vim /etc/hosts 192.168.0.190 master 192.168.0.193 node
190的机子:
vim /etc/hostname master
193的机子:
vim /etc/hostname node
2) 时间同步(麒麟系统自带了chronyd)
systemctl start chronyd //开启时间同步 systemctl enable chronyd //设置时间同步开机自启 date //验证
其实,时间同步这样操作并没有真的实现时间同步,也是在后续学习中知道的,实现时间同步的操作,我另外写了一篇小博客,感兴趣的请移步:
3) 禁用iptables和firewalld
systemctl stop firewalld systemctl disable firewalld systemctl stop iptables systemctl disable iptables
4) 禁用selinux(linux下的一个安全服务,必须禁用)
vim /etc/selinux/config SELINUX=disabled
正常情况下selinux=enforcing
5) 禁用swap分区(主要是注释最后一行)
vim /etc/fstab UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 # /dev/mapper/centos-swap swap swap defaults 0 0 //注释这条
6) 修改系统的内核参数
vim /etc/sysctl.d/kubernetes.conf 添加以下内容: net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
重新加载配置:
sysctl -p
也可能是下面的内容:
加载网桥过滤模块:
modprobe br_netfilter
查看网桥过滤模块是否加载成功:
lsmod | grep br_netfilter
7) 配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。
麒麟系统自带了Ipset,因此安装ipvsadm:
rpm -ivh ipvsadm-1.31-2.ky10.aarch64.rpm
做软连接:
ln -sf /usr/lib64/libLLVM-7.so /usr/lib64/libLLVM-7.0.0.so
貌似不做也行,目前没看出会有影响。
添加需要加载的模块写入脚本文件:
cat <<EOF > /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF
为脚本文件添加执行权限:
chmod +x /etc/sysconfig/modules/ipvs.modules
执行脚本文件:
/bin/bash /etc/sysconfig/modules/ipvs.modules
查看对应的模块是否加载成功:
lsmod | grep -e ip_vs -e nf_conntrack
8) 重启服务器
上述操作修改了很多系统的配置文件,必须重启,不能省略。
reboot
3. 安装docker
具体操作参看docker-二进制安装部分。
https://blog.csdn.net/q_hsolucky/article/details/124253860?spm=1001.2014.3001.5501
4. 安装k8s组件
rpm -ivh *.rpm
可能会提示缺少conntrack和socat依赖项:
需要安装k8s-dependency下的包:
rpm -ivh *.rpm --nodeps --force
重新安装k8s的组件rpm包:
rpm -ivh *.rpm
配置kubelet的cgroup:
vim /etc/sysconfig/kubelet 添加: KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
设置kubelet开机自启
systemctl enable kubelet
会有创建link的信息生成。
查看安装的k8s相关的包:
rpm -qa | grep kube
5. 准备镜像
(k8s组件及网络插件calico及界面管理工具kuboard)
加载k8s集群镜像(在镜像所在的文件夹执行下面的命令):
给dockerload.sh文件添加执行权限并运行:
chmod +x dockerload.sh ./dockerload.sh
查看镜像加载结果:
docker images
k8s.gcr.io/coredns需要重打标签:
docker tag k8s.gcr.io/coredns:1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
最终镜像结果如下:
6. 在master上操作
创建集群:
kubeadm init \ --kubernetes-version=v1.23.4 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=192.168.0.190
出现集群创建成功:
按照提示进行操作:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
7. 在node1上操作
把创建集群最下面的命令粘贴过来:
kubeadm join..... //每个人的都不一样,请复制自己的
出现可以使用kubectl get nodes查看节点信息证明集群初步搭建好了
另外加入节点时,需要相应的kubeadm join命令,可能会有没有及时记下集群初始化的命令或者过了几天后又需要增加节点的情况,临时生成的token只有24小时时效,使用kubeadm token list查看token没有结果时,说明token过期,需要重新生成:
kubeadm token create --print-join-command (生成临时的token,若生成永久token,再加上 --ttl=0)
报错ipv4的问题,请修改:
net.ipv4.ip_forward=0需要将其值改为1,具体修改在/proc/sys/net/ipv4/ip_forward文件
8. 在master上查看节点信息
kubectl get nodes -o wide
至此,初步搭建好集群,master和node1的状态为Notready,原因是未安装网络插件。
9. 安装网络插件calico
(请按照自己的镜像包名字进行docker load)
加载calico镜像(在master,node1上均加载):
docker load < calico-kube-controllers.tar docker load < calico-pod2daemon-flexvol.tar docker load < calico-node.tar docker load < calico-cni.tar
基于进行安装(在master上执行即可),在该文件所在目录下执行:
kubectl apply -f calico.yaml
ps:部署的时候由于服务器是多网卡不是很顺利,因此指定了calico的网卡,使用的话请注意修改为你自己的网卡名称。
稍等一会,查看节点状态,可以先看一下组件的状态:
kubectl get pod -n kube-system
Ps: 组件的状态为“初始化”或“容器在创建”时表示服务在启动过程中,不用着急,继续等一会,状态会变为running,说明k8s集群及组件服务都正常工作了。
组件的状态为“镜像拉取失败”等内容说明配置有问题或者镜像版本不匹配,
具体可以使用命令查看:
kubectl describe pod pod名称 -n kube-system
拉取镜像太慢导致net/http:TLS handshake timeout错误,重启docker服务:
service docker restart
pod状态为running后查看节点的状态:
kubectl get nodes 或 kubectl get nodes -o wide
此时应该为ready,不代表部署成功了,还是要看看kube-system下pob的状态
ready,不代表部署成功了,还是要看看kube-system下pob的状态,不要着急状态不是running,多等一会再次查看,直到所有组件的服务都为running:
kubectl get pod -n kube-system 或 kubectl get pod --all-namespaces -o wide
10. 安装界面化管理工具
在安装的节点上加载kuboard镜像,metrics-server的镜像包每个节点上都要有:
docker load < kuboard.tar docker load < metrics-server_v0.5.0.tar
Ps: yaml文件对空格非常敏感,尽量不要动原始内容,不要随便点空格
安装(在master上执行):
kubectl apply -f kuboard-v3.yaml
Kuboard-v3版本使用默认的账号密码登录:
账号:admin
密码:Kuboard123
访问方式:http://192.168.0.190:30080
将下面的命令信息粘贴到master上,会生成kuboard-agent.yaml文件,安装文件:
kubectl apply -f kuboard-agent.yaml
集群没有成为已就绪状态,执行该页面验证命令
Metrics-server是集群核心监控数据的聚合器,通俗的说,它存储了集群中各节点的监控数据,并且提供了API以供分析和使用。
Metrics-server在kubernetes集群中表现为一个deployment对象。不过准确的说,它是deployment,service,clusterrole,clusterrolebinding,apiservice,rolebinding资源对象的综合体。
Metrics-server的主要作用为为kube-scheduler,HorizontalPodAutoscaler等k8s核心组件,以及kubectl top命令和dashboard等UI组件提供数据来源。
在master上执行:
kubectl apply -f metrics-server-v0.5.0.yaml
污点
Master一般默认作为调度节点,让其工作的话 ,将master作为node加入node:
kubectl taint nodes --all node-role.kubernetes.io/master-
给master打上污点:NoSchedule:一定不能被调度
kubectl taint nodes k8s-master1 node-role.kubernetes.io/master=NoSchedule-
查看污点:
kubectl describe node k8s-master1 | grep Taints
最终部署好的k8s通过可视化管理工具kuboard查看结果:
总结:k8s离线部署也是趟了n多坑,至今还会遇到各种问题,希望可以和谐的与大家共同探讨、学习与进步,撒花~~~~,可以正确安装的话希望可以点个赞,非常感谢~~~
如果需要上述的安装包的话,请移步:
k8s-v1.23.4-arm版本的离线包-kubernetes文档类资源-CSDN下载
PS: 需要的人多的话,每个人都发邮箱实在有些麻烦,我有点懒,不介意的话可以用几个积分下载一下。