参考文档:k8s集群环境的搭建 · 语雀

一、为什么要部署单节点k8s?

通常来说k8s集群至少是需要三个节点或三个节点以上来搭建,单由于在公司环境中做多集群管理平台rancher测试,且没有多余服务器资源,所以必须在一台服务器上rancher和k8s集群,所以就有了单节点部署k8s集群。

我使用的服务器IP:10.23.197.21

二、部署流程

  1. 预先准备

检查系统版本,要求系统版本在7.5以上。


cat /etc/redhat-release

1.1关闭防火墙


systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

1.2关闭SElinux

查看SElinux是否开启


getenforce

临时关闭SElinux,重启后失效


setenforce 0

永久关闭SElinux。


sed -i 's/enforcing/disabled/' /etc/selinux/config

1.3关闭sawp分区

临时关闭分区,重启后失效


swapoff -a

永久关闭swap分区,需要重启


sed -ri 's/.*swap.*/#&/' /etc/fstab

1.4时间同步

如果是多节点部署,每个节点都需要同步时间。


yum install ntpdate -y
ntpdate time.windows.com

1.5将IPv4流量传递到iptables链

将节点上IPv4流量传递到iptables的链(这一步网上有很多方法,方法都不太一样,),这里使用serivce默认的ipvs代理模型。如果是多节点,每个节点都需要下面这个步骤。


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

1.6开启ipvs

在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块,安装ipset和ipvsadm。如果是多节点,每个节点都需要下面这个步骤。


yum -y install ipset ipvsadm

执行脚本


cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

授权、运行、检查是否加载


chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

检查是否加载


lsmod | grep -e ipvs -e nf_conntrack_ipv4

1.7设置主机名


hostnamectl set-hostname k8s-master

添加/etc/hosts文件


cat >> /etc/hosts << EOF
10.23.197.21 k8s-master
EOF

1.8安装docker

请参考docker--安装docker-ce_docker-engine docker-ce_luo_guibin的博客-CSDN博客

1.9更改docker的启动方式为systemd

在/etc/docker/daemon.json将cgroupfs更改为systemd。

刷新文件重启docker


systemctl daemon-reload
systemctl restart docker

1.10重启


reboot
  1. 部署k8s

部署k8s目前主流的方式有kubeadm、minikube、二进制包。minikube可以在单节点快速搭建一套完整的k8s集群,kubeadm是快速搭建k8s集群的工具包,二进制包是从官网上下载每个组件的二进制包,此方式对于理解kubernetes组件更加有效,同样也会比较繁琐。

我们选择kubeadm部署单节点,如果你有多余的服务器设备(虚拟机或物理机),只需要通过kubeadm join加入集群网络即可。

2.1添加阿里云YUM源


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

2.2安装三kubeadm、kubelet、kubectl

因为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

2.3集群初始化

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

2.4使用kubectl工具

出现join init ......字样表示集群初始化成功

根据提示,在节点上使用kubectl工具


mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

2.5安装网络插件flannel


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

注意!初始化集群后dnscorePod默认处于Pending状态,网络组件flannel安装完成后dnscorePod才会处于Running状态。 

2.6组件异常

查看集群健康,发现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

2.7删除污点

由于是单节点,master默认不接受任务调度,需要删除污点


kubectl describe node k8s-master | grep Taints
[root@k8s-master ~]# kubectl describe node | grep Ta
Taints:             node-role.kubernetes.io/master:NoSchedule

发现master节点有污点(即NoSchedule字样),删除master污点


kubectl taint nodes --all node-role.kubernetes.io/master-

2.8测试资源部署

创建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节点。

三、注意事项

  1. 多节点部署

假设是多节点部署注意更改/etc/hosts文件,设置工作节点的hostname,并添加每个节点的hosts文件。


#例子
192.168.136.21 Master
192.168.136.22 Node01
192.168.136.23 Node02
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐