参考文档:https://www.yuque.com/fairy-era/yg511q/hg3u04#27a2b370(大佬文档)
通常来说k8s集群至少是需要三个节点或三个节点以上来搭建,单由于在公司环境中做多集群管理平台rancher测试,且没有多余服务器资源,所以必须在一台服务器上rancher和k8s集群,所以就有了单节点部署k8s集群。
我使用的服务器IP:10.23.197.21
检查系统版本,要求系统版本在7.5以上。
cat /etc/redhat-release
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
查看SElinux是否开启
getenforce
临时关闭SElinux,不推荐使用,重启后失效。
setenforce 0
永久关闭SElinux,推荐使用。
sed -i 's/enforcing/disabled/' /etc/selinux/config
临时关闭分区,重启后失效
swapoff -a
永久关闭swap分区,需要重启
sed -ri 's/.*swap.*/#&/' /etc/fstab
将节点上IPv4流量传递到iptables的链(这一步网上有很多方法,方法都不太一样,单节点部署可以略过这一步),这里使用serivce默认的iptables代理模型,如果使用ipvs代理模型,需要另外安装ipset和ipvsadm组件。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
#加载模块
modprobe br_netfilter
#查看模块是否加载
lsmod | grep br_netfilter
#生效
sysctl --system
如果是多节点部署,每个节点都需要同步时间。
yum install ntpdate -y
hostnamectl set-hostname k8s-master
添加/etc/hosts文件
cat >> /etc/hosts << EOF
10.23.197.21 k8s-master
10.23.197.21 etcd
10.23.197.21 registry
EOF
请参考https://blog.csdn.net/weixin_48878440/article/details/122152407?spm=1001.2014.3001.5501
在/etc/docker/daemon.json将cgroupfs更改为systemd。
刷新文件重启docker
systemctl daemon-reload
systemctl restart docker
reboot
部署k8s目前主流的方式有kubeadm、minikube、二进制包。minikube可以在单节点快速搭建一套完整的k8s集群,kubeadm是快速搭建k8s集群的工具包,二进制包是从官网上下载每个组件的二进制包,此方式对于理解kubernetes组件更加有效,同样也会比较繁琐。
我们选择kubeadm部署单节点,如果你有多余的服务器设备(虚拟机或物理机),只需要通过kubeadm join加入集群网络即可。
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
因为k8s版本更新较快,推荐使用某个固定版本,且最好在1.24以下的版本,因为在1.24后k8s已经弃用docker,安装方法可能会不同。
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
设置kubelet开机自启动。
systemctl enable kubelet
此处可以先启动systemctl start kubelet,查看kubelet是否可以正常启动,通常情况下kubeadm init初始化失败,大部分原因是kubelet启动异常。(这一步也可以省略)
systemctl start kubelet
systemctl status kubelet
kubeadm init集群初始化,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址。
kubeadm init \
--apiserver-advertise-address=10.23.197.21 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
出现join init ......字样表示集群初始化成功
根据提示,在节点上使用kubectl工具
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看网络插件安装情况,coredns会比较慢,大概需两分钟。
kubectl get pods -n kube-system
查看node状态,会发现此时k8s-master状态为NotReady,稍等片刻即可,如果不安装flannel,状态会一直处于NotReady状态。
kubectl get nodes
查看集群健康,发现scheduler、controller-manager组件状态为Unhealthy,原因是kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0。
kubectl get cs
将kube-controller-manager.yaml、kube-scheduler.yaml文件中的“- --port=0”注释掉
cd /etc/kubernetes/manifests/
ll
#vim更改文件
systemctl restart kubelet.service
systemctl status kubelet.service
kubectl get cs
由于是单节点,master默认不接受任务调度,需要删除污点
kubectl describe node k8s-master | grep Taints
发现master节点有污点(即NoSchedule字样),删除master污点
kubectl taint nodes --all node-role.kubernetes.io/master-
创建deployment资源任务
kubectl create deployment nginx --image=nginx
暴露端口,创建svc
kubectl expose deployment nginx --port=80 --type=NodePort
查看服务状态
kubectl get pods,svc -o wide
curl [ServiceIP]:80
可以显示nginx的html标签。
至此,单节点部署k8s完成,只不过当前集群只有一个个master节点。
假设是多节点部署注意更改/etc/hosts文件,设置工作节点的hostname,并添加每个节点的hosts文件。
#例子
192.168.136.21 Master
192.168.136.22 Node01
192.168.136.23 Node02