搭建K8s集群
搭建K8s集群
前言:本次将通过kubeadm部署1个master节点,2个worker节点K8s集群,本次集群使用的容器运行工具为docker(题外话:K8s的容器运行工具也可以用docker、containerd、cio等等,其中containerd是一个轻量级、工业级的容器运行工具,containerd是docker公司捐献给cncf基金会的,所以docker的功能会比containerd的功能多,并且需要值得注意的是K8s在1.24版本后并未抛弃docker,只是在K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd)
安装K8s集群的准备条件:
1、准备3台主机,虚拟机也行,每台主机的内存都要在2GB以上,cpu都要在2颗以上,否则后续初始化K8s时会不通过,别不信邪,我亲身经历了的,后面搭建集群的人就不要学我了,血的教训(别说我骗你们,有图有真相)
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Mem]: the system RAM (972 MB) is less than the minimum 1700 MB
[ERROR CRI]: container runtime is not running: output: E1019 23:31:30.275460 2642 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
2、各主机间能通过网络互相通信(ping一下就知道通不通了)
3、禁用各主机上的swap设备(下面有教程,自己跟着来就行)
4、各主机时间同步(下面有教程,自己跟着来就行)
1、首先需要准备3台服务器或虚拟机,分别作为master、worker1、worker2节点(若是用虚拟机搭建集群,安装一台,其他两台克隆第一台即可;以下连接为虚拟机安装CentOS7的教程,有需要的同学可以看看)
https://blog.csdn.net/m0_64284147/article/details/126199002
2、禁止每个节点上的swap分区
swapoff -a
然后使用以下命令查看是否禁用成功
free -mh
禁用前:
禁用后:
3、关闭每个节点上的防火墙
临时关闭:
systemctl stop firewalld
永久关闭:
systemctl disable firewalld
效果图:
5、关闭每个节点上的selinux
临时关闭:
setenforce 0
永久关闭:
sed -i 's/enforcing/disabled/' /etc/selinux/config
5、分别在3个节点上输入以下命令,更改每个节点上的主机名称,方便后续的查看
hostnamectl set-hostname 要改的名字
输入以下命令查看主机名
hostname
master节点的效果图:
6、在master节点里添加hosts
cat >> /etc/hosts << EOF
主节点ip master
工作节点ip worker1
工作节点ip worker2
EOF
例:(每台机器的Ip不同,截图仅供参考)
效果图:
7、分别在3个节点上输入以下命令,将桥接的IPV4流量传递到iptables的链(同一节点的不同pod是利用linux bridge在网路的第二层进行通讯,由于没有原路返回造成pod请求services时的session无法收到返回值而连接超时,所以需要进行设置让第二层的bridge在转发时也通过第三层的iptables进行通信。)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
输入以下命令使设置生效
sysctl --system
master节点的效果图:
8、让3个节点上的时间保持一致
(1)分别在3个节点上输入以下命令安装软件包ntpdate
yum install ntpdate -y
(2)分别在3个节点上输入以下命令同步时间
ntpdate ntp1.aliyun.com
国内常用的NTP服务器
1、cn.pool.ntp.org 中国开源免费NTP服务器
2、ntp1.aliyun.com 阿里云NTP服务器
3、ntp2.aliyun.com 阿里云NTP服务器
4、time1.aliyun.com 阿里云NTP服务器
5、time2.aliyun.com 阿里云NTP服务器
效果图:
9、由于要让K8s的容器运行工具Docker,所以需要先安装Docker
我的另一篇文章关于Docker的安装教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126025ru
以上文章的安装教程是根据官方文档来进行的,比较繁琐,又需要安装的与Docker相关的东西,会占用内存,以下提供另一种简单的只安装Docker引擎的安装教程
(1)分别在3个节点上输入以下命令从阿里云上下载Docker的仓库配置文件
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
效果图:
(2)分别在3个节点上输入以下命令命令安装Docker
yum -y install docker-ce-20.10.17
(3)分别在3个节点上输入以下命令启动Docker并设置Docker开机自启动
systemctl enable docker && systemctl start docker
master节点效果图:
(4)分别在3个节点上输入以下命令查看Docker的版本
docker version
master节点效果图:
10、配置阿里云镜像加速器,加快对Docker镜像的下载速度(因为Docker的镜像仓库在国外,不配置,下载镜像的速度会比较慢甚至被墙了的话Docker镜像就下载不下来了,注意!!!3个节点都要设置)
我的另一篇文章关于配置阿里云镜像加速器的教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126807095
11、K8s在1.24版本后并未抛弃docker,而是K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd,然后K8s集群通过cri-dockerd联系到docker(注意每个节点都要安装)
项目地址:https://github.com/Mirantis/cri-dockerd
(1)查看主机的系统内核版本
uname -r
master节点效果图:
(2)根据主机的系统内核版本来选择相应的包
rpm二进制包:已经使用GCC编译后的(二进制已经可以被操作系统直接执行了)
tar源码包:需要编译(源码包就是你能看懂的,基于字符的,还需要进行编译)
(3)根据自己主机的系统内核版本下载相应的包
例:
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm
master节点效果图:
(4)安装cri-dockerd
例:
yum install -y cri-dockerd-0.2.6-3.el7.x86_64.rpm
效果图:
(5)查看cri-dockerd.sock
cd /var/run/
12、分别在3个节点上添加阿里云的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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
master节点效果图:
12、分别在3个节点上安装kubeadm、kubelet和kubectl(不选择版本会默认安装最新,我安装时kubeadm的最新版本为1.25.4)
yum install -y --nogpgcheck kubelet kubeadm kubectl
master节点效果图(仅供参考,反正安装过程中没报错就是安装成功了):
13、查看安装的kubeadm的版本
kubeadm version
效果图:
kubeadm config images list
效果图:
14、分别在3个节点上设置开机自启动
systemctl enable kubelet
master节点效果图:
另:附上取消开机自启动的命令
systemctl disable kubelet
15、整合kubelet和cri-dockerd
需要注意的是,15及以下16步整合kubelet和cri-dockerd的操作也可以不用做,而是直接在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项。 (而且我也做了配置,不知道是不是我个人没配对的原因,最后还是没效果需要在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项)
(1)编辑cri-docker.service文件
vim /usr/lib/systemd/system/cri-docker.service
(2)把ExecStart的属性值变成以下内容
#各配置参数的解释
--network-plugin:指定网络插件规范的类型,这里要使用CNI;
--cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
--cni-cache-dir:CNI插件使用的缓存目录;
--cni-conf-dir:CNI插件加载配置文件的目录;
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d
效果图:
(3)重载并重启cri-docker.service服务
systemctl daemon-reload && systemctl restart cri-docker.service
16、配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“
(1)编辑文件/etc/sysconfig/kubelet(若没有则新建)
vim /etc/sysconfig/kubelet
(2)为KUBELET_EXTRA_ARGS添加以下指定参数
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"
17、在master节点输入以下命令,对master节点做初始化(这个理论上配置完15、16步就不用在命令后面加--cri-socket unix:///var/run/cri-dockerd.sock这一选项,但我也尝试了,会报缺失--cri-socket unix:///var/run/cri-dockerd.sock这一选项的错误)
#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围
kubeadm init --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.25.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.224.0.0/16
实际上还是需要加上“--cri-socket unix:///var/run/cri-dockerd.sock”这一选项才能进行kubelet和cri-dockerd的整合,下面这句初始化命令给各位同学参考:
#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围
--cri-socket就是整合cri-docker
kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock
注意:卡在这里不要慌,只是主机在下载镜像,有点慢而已
master节点初始化成功的效果图(只要出现我截图里圈起来的提醒语句就是成功了):
然后往下看初始K8s时输出的日志,能看到初始化K8s后日志里给出了后续K8s的安装步骤,我们接下来按照日志里的提示来继续安装即可。
18、根据日志的提示创建文件夹
创建文件夹的目的是把客户端所使用的配置文件放进这个文件夹
mkdir -p $HOME/.kube
19、根据日志的提示把配置文件复制进刚刚新创建的文件夹里
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
20、根据日志的提示输入以下命令
chown $(id -u):$(id -g) $HOME/.kube/config
21、根据提示把worker节点加进master节点,复制你们各自在日志里的提示,然后分别粘贴在2个worker节点上,最后回车即可(注意要在后面加上--cri-socket unix:///var/run/cri-dockerd.sock这一参数,不然可能会失败)
kubeadm join 192.168.194.128:6443 --token 8fcaro.ekkbz9l62zemm1js --discovery-token-ca-cert-hash sha256:81244cd26a3e7cf6dd49a74d9f1a765321a7951a548ecdeab2b30972ce75c92e --cri-socket unix:///var/run/cri-dockerd.sock
效果图:
worker1节点效果图:
worker2节点效果图:
22、查看K8s集群node节点的状态
kubectl get nodes
效果图:
若报“The connection to the server localhost:8080 was refused - did you specify the right host or port?”的错误,可以参考我的另一篇文章来解决
https://blog.csdn.net/m0_64284147/article/details/128072008
23、使用calico给K8s集群做网络支撑
calico是一种自定义的软件,并不是K8s集群的标准的资源对象
(1)命令下载calico
wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
效果图:
(2)安装calico的operator
kubectl create -f tigera-operator.yaml
效果图:
(3)下载自定义配置文件
wget https://docs.projectcalico.org/manifests/custom-resources.yaml
效果图:
(4)打开刚刚下载完的custom-resources.yaml文件
vim custom-resources.yaml
效果图:
(5)修改custom-resources.yaml文件里cidr的值,然后保存并退出
注意!!!注意!!!注意!!!
这里cidr修改成17步初始化K8s时填的cidr,即10.224.0.0,我17步填的是10.224.0.0(如下命令所示),需要各位同学根据自己在17步填的cidr再在这里填一次,否则会出问题,后续会进行不下去
#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围
--cri-socket就是整合cri-docker
kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock
效果图:
(6)应用custom-resources.yaml配置文件
kubectl apply -f custom-resources.yaml
效果图:
(7)实时查看网络插件部署情况
watch kubectl get pods -n calico-system
效果图:
24、当calico网络插件下载完毕后重新查看K8s集群节点的状态,此时显示3个节点的STATUS都是Ready,至此K8s集群搭建成功。
kubectl get nodes
效果图:
其他:
1、报错信息
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher
2、原因:
没有整合kubelet和cri-dockerd
3、解决办法,在命令后面加上以下选项
--cri-socket unix:///var/run/cri-dockerd.sock
[root@worker2 ~]# kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
[init] Using Kubernetes version: v1.25.4
[preflight] Running pre-flight checks
[WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
[WARNING Hostname]: hostname "worker2" could not be reached
[WARNING Hostname]: hostname "worker2": lookup worker2 on 8.8.8.8:53: no such host
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
2、卸载K8s的命令(同样需要在命令后面加上--cri-socket unix:///var/run/cri-dockerd.sock选项)
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
效果图:
创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。
更多推荐
所有评论(0)