赞
踩
参考文档:k8s集群环境的搭建 · 语雀
通常来说k8s集群至少是需要三个节点或三个节点以上来搭建,单由于在公司环境中做多集群管理平台rancher测试,且没有多余服务器资源,所以必须在一台服务器上rancher和k8s集群,所以就有了单节点部署k8s集群。
我使用的服务器IP:10.23.197.21
检查系统版本,要求系统版本在7.5以上。
<code class="language-plaintext hljs">cat /etc/redhat-release</code>
<code class="language-plaintext hljs">systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld</code>
查看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>
临时关闭分区,重启后失效
<code class="language-plaintext hljs">swapoff -a</code>
永久关闭swap分区,需要重启
<code class="language-plaintext hljs">sed -ri 's/.*swap.*/#&/' /etc/fstab</code>
如果是多节点部署,每个节点都需要同步时间。
<code class="language-plaintext hljs">yum install ntpdate -y
ntpdate time.windows.com</code>
将节点上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>
在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>
<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>
请参考docker--安装docker-ce_docker-engine docker-ce_luo_guibin的博客-CSDN博客
在/etc/docker/daemon.json将cgroupfs更改为systemd。
刷新文件重启docker
<code class="language-plaintext hljs">systemctl daemon-reload
systemctl restart docker</code>
<code class="language-plaintext hljs">reboot</code>
部署k8s目前主流的方式有kubeadm、minikube、二进制包。minikube可以在单节点快速搭建一套完整的k8s集群,kubeadm是快速搭建k8s集群的工具包,二进制包是从官网上下载每个组件的二进制包,此方式对于理解kubernetes组件更加有效,同样也会比较繁琐。
我们选择kubeadm部署单节点,如果你有多余的服务器设备(虚拟机或物理机),只需要通过kubeadm join加入集群网络即可。
<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>
因为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>
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>
出现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>
<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状态。
查看集群健康,发现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>
由于是单节点,master默认不接受任务调度,需要删除污点
<code class="language-plaintext hljs">kubectl describe node k8s-master | grep Taints</code>
- [root@k8s-master ~]# kubectl describe node | grep Ta
- 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>
创建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节点。
假设是多节点部署注意更改/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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。