当前位置:   article > 正文

Linux部署单节点k8s_linux单节点部署kubernetes

linux单节点部署kubernetes

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

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

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

我使用的服务器IP:10.23.197.21

二、部署流程

  1. 预先准备

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


<code class="language-plaintext hljs">cat /etc/redhat-release</code>

1.1关闭防火墙


<code class="language-plaintext hljs">systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld</code>

1.2关闭SElinux

查看SElinux是否开启


<code class="language-plaintext hljs">getenforce</code>

临时关闭SElinux,重启后失效


<code class="language-plaintext hljs">setenforce 0</code>

永久关闭SElinux。


<code class="language-plaintext hljs">sed -i 's/enforcing/disabled/' /etc/selinux/config</code>

1.3关闭sawp分区

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


<code class="language-plaintext hljs">swapoff -a</code>

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


<code class="language-plaintext hljs">sed -ri 's/.*swap.*/#&/' /etc/fstab</code>

1.4时间同步

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


<code class="language-plaintext hljs">yum install ntpdate -y
ntpdate time.windows.com</code>

1.5将IPv4流量传递到iptables链

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


<code class="language-plaintext hljs">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</code>

<code class="language-plaintext hljs">#加载模块
modprobe br_netfilter
#查看模块是否加载
lsmod | grep br_netfilter
#生效
sysctl --system</code>

1.6开启ipvs

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


<code class="language-plaintext hljs">yum -y install ipset ipvsadm</code>

执行脚本


<code class="language-plaintext hljs">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</code>

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


<code class="language-plaintext hljs">chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4</code>

检查是否加载


<code class="language-plaintext hljs">lsmod | grep -e ipvs -e nf_conntrack_ipv4</code>

1.7设置主机名


<code class="language-plaintext hljs">hostnamectl set-hostname k8s-master</code>

添加/etc/hosts文件


<code class="language-plaintext hljs">cat >> /etc/hosts << EOF
10.23.197.21 k8s-master
EOF</code>

1.8安装docker

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

1.9更改docker的启动方式为systemd

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

刷新文件重启docker


<code class="language-plaintext hljs">systemctl daemon-reload
systemctl restart docker</code>

1.10重启


<code class="language-plaintext hljs">reboot</code>
  1. 部署k8s

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

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

2.1添加阿里云YUM源


<code class="language-plaintext hljs">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</code>

2.2安装三kubeadm、kubelet、kubectl

因为k8s版本更新较快,推荐使用某个固定版本,且最好在1.24以下的版本,因为在1.24后k8s已经弃用docker,安装方法可能会不同。


<code class="language-plaintext hljs">yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0</code>

设置kubelet开机自启动。


<code class="language-plaintext hljs">systemctl enable kubelet</code>

此处可以先启动systemctl start kubelet,查看kubelet是否可以正常启动,通常情况下kubeadm init初始化失败,大部分原因是kubelet启动异常。(这一步也可以省略)


<code class="language-plaintext hljs">systemctl start kubelet
systemctl status kubelet</code>

2.3集群初始化

kubeadm init集群初始化,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址。


<code class="language-plaintext hljs">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</code>

2.4使用kubectl工具

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

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


<code class="language-plaintext hljs">mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config</code>

2.5安装网络插件flannel


<code class="language-plaintext hljs">kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code>

查看网络插件安装情况,coredns会比较慢,大概需两分钟。


<code class="language-plaintext hljs">kubectl get pods -n kube-system</code>

查看node状态,会发现此时k8s-master状态为NotReady,稍等片刻即可,如果不安装flannel,状态会一直处于NotReady状态。


<code class="language-plaintext hljs">kubectl get nodes</code>

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

2.6组件异常

查看集群健康,发现scheduler、controller-manager组件状态为Unhealthy,原因是kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0。


<code class="language-plaintext hljs">kubectl get cs</code>

将kube-controller-manager.yaml、kube-scheduler.yaml文件中的“- --port=0”注释掉


<code class="language-plaintext hljs">cd /etc/kubernetes/manifests/
ll
#vim更改文件 
systemctl restart kubelet.service
systemctl status kubelet.service
kubectl get cs</code>

2.7删除污点

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


<code class="language-plaintext hljs">kubectl describe node k8s-master | grep Taints</code>
  1. [root@k8s-master ~]# kubectl describe node | grep Ta
  2. Taints: node-role.kubernetes.io/master:NoSchedule

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


<code class="language-plaintext hljs">kubectl taint nodes --all node-role.kubernetes.io/master-</code>

2.8测试资源部署

创建deployment资源任务


<code class="language-plaintext hljs">kubectl create deployment nginx --image=nginx</code>

暴露端口,创建svc


<code class="language-plaintext hljs">kubectl expose deployment nginx --port=80 --type=NodePort</code>

查看服务状态


<code class="language-plaintext hljs">kubectl get pods,svc -o wide</code>

<code class="language-plaintext hljs">curl [ServiceIP]:80</code>

可以显示nginx的html标签。

至此,单节点部署k8s完成,只不过当前集群只有一个个master节点。

三、注意事项

  1. 多节点部署

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


<code class="language-plaintext hljs">#例子
192.168.136.21 Master
192.168.136.22 Node01
192.168.136.23 Node02</code>
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/848834
推荐阅读
相关标签
  

闽ICP备14008679号