一、前言
因为我只有一台服务器,我使用的是,所有我采用的是通过安装虚拟机的方式实现集群搭建,先把需要的配置环境拉取下来,然后再通过虚拟机的克隆的方式直接把配置克隆到新的服务器上,减少重复下载。
通过在ubuntu服务器上安装VMware和在MAC上安装parallels desktop都有部署成功,安装虚拟机的实体机配置内存需要够,并且需要可以连接🛜,因为需要下载一些配置依赖,因为是安装k8s集群需要安装三台ubuntu容器。当然如果是有多台服务器的话直接把安装命令都执行一遍就行
下面是我使用的配置:
信息 | 配置 |
---|---|
节点主机 | Ubuntu20.4 / 22.4 |
K8S版本 | 1.28.1 |
配置 | 三台集群(内存:2G、磁盘:30G) |
SSH连接工具 | WindTerm / Tabby |
宿主机 | Ubuntu24.4 / M2 |
虚拟机工具 | VMWaer / parallels desktop |
ubuntu镜像(注意看后缀arm是 苹果的Apple M,Intel 的用amd): https://pan.baidu.com/s/16f1lzIqFOHlsyfzVV3lv9A?pwd=5p8a 提取码: 5p8a
WindTerm(ssh连接工具下载地址):https://github.com/kingToolbox/WindTerm/releases
二、下载依赖配置环境
1、配置系统环境
1.1、配置桥接网络
因为我们实际开发中肯定是把k8s部署在服务器上的嘛,所以需要把虚拟机内服务器的网络改为同物理机在同一网段的。所以需要在 “桥接网络”选项下的列表中选择虚拟机将要桥接的物理适配器。否则同一局域网的其他物理机都没法范围到这些虚拟机的ip
1.1.1、parallels desktop配置
- 右击对应的虚拟机,点击配置,选择硬件中的网络,修改源为桥接网络中的默认适配器,如果有多个网络,则直接选择你想要用于外部连接的那个网络就行
- 通过ifconfig命令查看ip是否改为了外表局域网同一网段了
1.1.2、VMware配置
-
先点击网络适配器
-
选择第一个,然后保存退出
-
再右击每个主机服务器,点击设置(Settings)
-
选择网络,选择桥接网络,点击确认保存,然后就可以到对应的主机查看IP了
1.2、配置root用户登陆
在创建虚拟机的时候需要先添加ssh连接,但我们创建后,是不能直接用root用户直接登陆的,虽然可以通过sudo su
转为root,但每次都要转,也麻烦,可以通过修改配置,让直接通过root用户进行ssh登陆。
-
首先通过ssh工具连接上虚拟机,账号密码就是我们创建的时候设置的那个账号,然后通过
sudo su
切换为root管理员用户
-
修改/etc/ssh/sshd_config文件配置
修改下面ssh的配置文件的,34行左右的位置(右下角可以看行数),把标注的三行的注释打开,并且把第34行改为 yesvim /etc/ssh/sshd_config
·
-
重制root用户的密码
把root用户的密码改为自己需要的sudo passwd root
-
重启ssh服务
service ssh restart
-
其他
如果是没有安装ssh命令,可以通过#更新软件包 sudo apt update #安装ssh sudo apt install openssh-server #安装ifconfig命令包(刚创建的虚拟机可能会没有) sudo apt install net-tools
2、环境配置安装下载
下面的步骤,如果是使用的下面的WindTerm的截图代表是集群的每个容器都需要执行的,如果是使用的上面的tabby的截图代表是只有master节点需要执行就行。
因为他们的配置一样,我免得都下载一遍,所以我直接一个下载好,然后通过克隆的方式直接克隆到其他的节点去,这样也避免出现一些不一样的东西
2.1、安装ipset和ipvsadm
它们在 Kubernetes (k8s) 中用于网络管理和负载均衡。
-
首先执行安装
apt-get install ipset ipvsadm
执行的时候需要你输入
y
确认,确认就行
-
然后执行配置 ipvsadm 模块,用于开机自启动的,可以使用
vi /etc/modules-load.d/ipvs.conf
查看是否配置成功cat << EOF | tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF
-
因为本次也需要启动,所以需要在配置一个脚本用于本次启动的
配置脚本文件cat << EOF | tee ipvs.sh #!/bin/sh modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF
执行刚刚创建的脚本
sh ipvs.sh
-
通过下面的命令查看是否配置成功
lsmod | grep ip_vs
如下图,就表示加载成功了
2.2、关闭SWAP分区
直接通过修改/etc/fstab
文件,永久关闭SWAP分区,避免重启时打开
-
永久关闭
vim /etc/fstab
打开后,把最后一行
/swap.img
开头的注释调就行
修改swap需要重启才能使得配置文件生效,因为现在就需要用,可以直接重启,也可以先临时关闭掉 -
临时关闭
swapoff -a
-
查看是否关闭成功
free -m
变0了表示关闭了
3、配置Containerd容器
Containerd 在 Kubernetes 中扮演了容器运行时的角色,负责创建、管理和运行容器,提供了一个标准的容器运行时环境和安全特性。
3.1、下载安装Containerd
-
下载Containerd,因为是在github上所以如果没有外网可能会下载不成功,我上面的百度网盘有放下载好的(注意看后缀arm是 苹果的Apple M,Intel 的用amd),直接导入到服务器里面去就行,如果自己下载也是,别下载错了
wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz
-
安装 Containerd
解压后会自动安装到指定位置去#解压文件 tar xf cri-containerd-1.7.5-linux-amd64.tar.gz -C / #查看安装 containerd --version
3.2、创建&修改配置文件
-
创建配置文件
#创建配置文件目录 mkdir /etc/containerd #生成默认的配置文件 containerd config default > /etc/containerd/config.toml #查看是否生成成功 ls /etc/containerd
-
修改配置文件
vim /etc/containerd/config.toml
-
修改第65行sanbox_image的值改为
registry.aliyuncs.com/google_containers/pause:3.9
,改为阿里的镜像地址和版本号。(镜像地址也可以不修改,只需要修改版本号也行,需要和后面–>8.1、集群初始化介绍的kubeadm-config.yaml
文件的一致就行)
-
需要137行的
false
改为true
修改好后保存退出
3.3、启动Containerd&开机自启
-
执行开机启动,并且现在就启动
systemctl enable --now containerd
-
验证是否启动成功
systemctl status containerd
4、添加K8S集群组件
4.1、修改下载源
-
添加阿里的软件源
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
-
验证是否添加成功
ls /etc/apt/sources.list.d
-
更新软件源
apt-get update
这个时候会失败,因为没有公钥,缺少 GPG 的key导致的
-
把公钥添加到服务器
上面图片箭头的B53DC80D13EDEF05
就是你的公钥,需要添加自己的apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B53DC80D13EDEF05
导入之后就会更新成功
apt-get update
4.2、安装组件
下面三个是k8s必要的组件,
kubeadm
:创建、升级和管理 Kubernetes 集群kubelet
:管理节点上的容器生命周期kubectl
:管理和调试 Kubernetes 应用程序
- 执行安装
安装的时候需要y,y就行apt-get install kubeadm=1.28.1-00 kubelet=1.28.1-00 kubectl=1.28.1-00
上面是我安装的版本,如果想安装其他版本可以用下面的命令查看,如果不加版本号,会下载最新的
-
查看版本
apt-cache madison kubeadm apt-cache madison kubelet apt-cache madison kubectl
-
查看是否安装成功
kubeadm version kubelet --version kubectl version
-
锁定版本
安装好后需要需要锁定版本,避免自动更新造成的一些问题apt-mark hold kubeadm kubelet kubectl
5、克隆服务器
因为我们是要建立k8s集群嘛,所以需要有三台服务器用做搭建集群,
如果是本身有多台服务器的,并且前面的命令都在全部服务器执行过了的,就可以跳过这一步。
克隆服务器在VMware和parallels desktop执行都比较简单
5.1、通过parallels desktop克隆
- 先把服务器关闭
- 右击你刚刚下载的好配置依赖的容器,点击克隆
- 定义名称,点击确认
重复两次克隆两台从服务器出来
5.2、通过VMware克隆
-
克隆
先关闭虚拟机,然后右击点击
-
然后一路next确认
然后等待克隆完成,启动
6、主机配置
6.1、设置静态ip
-
复制配置文件
避免配置错了无法恢复。可能有些版本的配置文件不是叫00-installer-config.yaml
这个名字,反正修改/etc/netplan
下的那个文件就行cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
-
修改配置文件
vim /etc/netplan/00-installer-config.yaml
-
配置文件(三台虚拟机服务器都需要配置本虚拟机的ip)
需要修改下面文件的addresses: [192.168.5.55/24]
和via: 192.168.5.1
,!!!注意不要有多余空格- addresses需要把ip改为本服务器的
- via:网段改为自己的,网段通过
route -n
命令查看
-
安装的arm架构的
# This is the network config written by 'subiquity' network: version: 2 ethernets: enp0s5: dhcp4: no addresses: [192.168.5.55/24] routes: - to: default via: 192.168.5.1 nameservers: addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
-
安装的amd架构的
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: - 192.168.3.170/24 routes: - to: default via: 192.168.3.1 nameservers: addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
-
配置生效
netplan apply
配置好之后可以ping一下局域网的其他物理机的网络,看是否可以ping通
6.2、修改主机名
三台服务器分别执行
-
master01执行
hostnamectl set-hostname master01
-
worker01执行
hostnamectl set-hostname worker01
-
worker02执行
hostnamectl set-hostname worker02
然后
exit
退出当前用户,在重新登陆一下就可以了,可以看名字都一句以及已经改为了对应的名字
6.3、主机名解析ip
全部都需要执行(!!!!这个要改为自己集群的主机ip)
cat >> /etc/hosts << EOF
192.168.5.53 mater01
192.168.5.54 worker01
192.168.5.55 worker02
EOF
通过WindTerm的频道功能,可以实现同频道中,只要一个页面输入,其他的都会同步输入
再执行查看是否写入
cat /etc/hosts
6.4、时间同步
-
更改时区为上海时区
timedatectl set-timezone Asia/Shanghai
-
安装ntpdate
ntpdate是一个用于同步系统时钟与NTP服务器的工具apt-get install ntpdate
-
通过ntpdate命令同步时间
ntpdate time1.aliyun.com
-
通过定时任务去实现定时同步
crontab -e
中间会让你选择输入
2
:
把下面这行加入进去0 */1 * * * ntpdate time1.aliyun.com
6.5、配置内核转发、网桥过滤配置
- 配置依赖模块到 /etc/modules-load.d/k8s.conf,用于实现开启自动加载
-
overlay: 这是 OverlayFS 的内核模块,用于支持 Docker 和 Kubernetes 等容器化技术。
-
br_netfilter: 这是 Linux 内核中的网桥过滤器模块,用于支持 Kubernetes 的网络功能。
cat << EOF | tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
配置完成之后,本次启动这两个配置,因为配置上配置后期开机启动的,当下也需要先启动
modprobe overlay
modprobe br_netfilter
2. 查看是否启动成功lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"
-
转发配置到k8s.conf文件中
cat << EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF
-
加载内核参数:
sysctl --system
-
然后在查看是否加载成功
sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
和net.ipv4.ip_forward_update_priority = 1
都变为1了表示加载成功
三、部署集群
1、配置部署k8s集群
1.1、集群初始化
下面的只需要master节点
的主机执行,其他的两个从机不用执行
- 创建kubeadm-config配置文件
把配置文件打印到本地,用于编辑kubeadm config print init-defaults > kubeadm-config.yaml
- 修改文件
修改拉下来的配置文件vim kubeadm-config.yaml
-
修改
advertiseAddress
的ip为mater01节点的ip -
修改
name
为mater01节点的主机名 -
修改
imageRepository
仓库地址为阿里云的镜像仓库registry.aliyuncs.com/google_containers
。因为前面/etc/containerd/config.toml
文件修改了,如果前面的文件镜像仓库地址没修改,这个地方也可以不修改 -
修改
kubernetesVersion
版本号,前面下载的是什么版本就写什么版本 -
dnsDomain
表示DNS域名,可以不修改,但一个局域网内只能有一个相同的,如果有两个k8s集群用的一样的DNS名字就会冲突,一般推荐修改为公司的域名 -
在
networking
中的 serviceSubnet 后面添加podSubnet: 10.244.0.0/16
-
在最后面在添加下面的配置
--- kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd
红色的是修改,绿色的是添加
-
重启服务
修改完,分别重启containerd 和 kubeletsystemctl restart containerd systemctl restart kubelet
-
下载镜像
下载k8s所需要的镜像到主节点
--image-repository
:指定镜像仓库--kubernetes-version
:版本号,改为你的k8s版本kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.28.1
-
执行初始化
kubeadm init --config kubeadm-config.yaml
出现下面的,就表示初始化成功了
1.2、准备kubectl配置文件
-
添加配置文件
把上面输出的内容在master
节点执行一遍mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
查看节点
kubectl get nodes
1.2、添加从节点
复制刚刚自己初始化的地址,到从节点执行,也就是另外两个worker02节点
(!!!这个是我的,需要复制自己的)
-
复制token
kubeadm join 192.168.5.53:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:55917a9c22cb444e83ce19517b8b9f1856401cf3ca11df4e661978fd9eed222e
-
查看
在到主节点进行查看kubectl get nodes
在查看,就可以看到刚刚加入的worker节点了
2、安装k8s网络插件Calico
k8s常用的网络插件主要有
- Flannel:Flannel是Kubernetes官方推荐的网络插件之一。它提供了一种基于UDP的网络通信方式,支持多租户和多网段。
- Calico:Calico是另一个流行的K8S网络插件。它提供了一种基于BGP的网络通信方式,支持多租户和多网段。
- Weave:Weave是一种基于 Overlay 网络的K8S网络插件。它提供了一种简单易用的方式来管理集群中的网络通信。
- Cilium:Cilium是一种基于 Linux 内核的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
- OpenVSwitch:OpenVSwitch是一种基于开源的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
2.1、执行安装tigera-operator
-
下载
我这安装的是3.26.1,如果需要安装其他版本,直接改版本号就行,其他目录都是一样的kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
-
查看是否安装成功
tigera-operator
kubectl get ns
-
查看pod状态
如果是Runing
状态就代表成功了,如果不是就代表有问题kubectl get pods -n tigera-operator
2.2、配置custom-resources
custom-resources.yaml 是一个用于配置 Kubernetes 的自定义资源定义(CRD)文件
-
先拉取下来
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
-
修改配置
修改配置网段,这个网段是前面初始化时设置的podSubnet
的网段cidr: 10.244.0.0/16
vim custom-resources.yaml
-
拉取镜像
因为一些原因,选择不能下载,需要通过一些大佬弄的映射加速仓库去拉。
!!!全部节点都要拉取。
如果下面的地址不行,可以到里面去找最新的
https://github.com/DaoCloud/public-image-mirror/issues/2328ctr image pull docker.1panel.live/calico/cni:v3.26.1 ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.26.1 ctr image pull docker.1panel.live/calico/node:v3.26.1 ctr image pull docker.1panel.live/calico/kube-controllers:v3.26.1 ctr image pull docker.1panel.live/calico/typha:v3.26.1 ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.26.1 ctr image pull docker.1panel.live/calico/csi:v3.26.1
-
查看是否下次完成
ctr image list
要确保全部都是
application/vnd.docker.distribution.manifest.list.v2+json
没有出现 Init:ErrImagePull
-
应用配置
下载完成之后执行下面命令,应用配置kubectl create -f custom-resources.yaml
-
查看命名空间
kubectl get ns
看到
calico-system
代表ok了
-
查看pod
kubectl get pods -n calico-system
大概等个几分钟,都是
Runing
,代表成功 -
再查看节点信息,就会发现状态已经变成 Ready 状态
kubectl get nodes
到这一步,说明就是全部安装完成了
2.3、错误解达。
如果哪个节点有问题
执行下面命令直接删除掉k8s相关的东西,然后重新安装三个组件,在去重新通过链接加入就行。
#重置 Kubernetes 集群,它会删除所有与 Kubernetes 相关的配置文件、数据和组件。
sudo kubeadm reset
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/*
rm -rf /root/.kube
rm -rf /etc/kubernetes/*
ipvsadm -C
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
四、测试使用
1、安装可视化Web工具:Kuboard v3
1.1、使用kubectl安装(master01节点执行)
发生错误可以查看kuboard官网
https://press.demo.kuboard.cn/install/v3/install-in-k8s.html
-
下载配置文件
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
-
执行创建
kubectl apply -f vim kuboard-v3-swr.yaml
如果镜像拉取不下来可以修改下镜像仓库地址改为我的阿里云的进行仓库地址
vim kuboard-v3-swr.yaml
# 地址: registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard-agent registry.cn-hangzhou.aliyuncs.com/zhengfp_images/etcd-host:3.4.16-1 registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard:v3 registry.cn-hangzhou.aliyuncs.com/zhengfp_images/questdb:6.0.4
分别把地址放入下面对应的地方
继续执行部署kubectl apply -f vim kuboard-v3-swr.yaml
-
查看部署
kubectl get pods -n kuboard
都是
Running
即可 -
web测试
-
在浏览器打开链接
http://节点IP:30080
-
输入初始用户名和密码,并登录
- 用户名:
admin
- 密码:
Kuboard123
- 用户名:
1.1.2、常见错误
通过kubectl get pods -n kuboard
查看pod,看哪个pod不成功
查看对应的错误
powershell kubectl logs kuboard-v3-7979bc788f-hln74 -n kuboard
desc = "transport: Error while dialing dial tcp: missing address"
错误表明 Kuboard 无法连接到 etcd。
kuboard-v3-xxxxx
的容器出现CrashLoopBackOff
的状态,可能的原因有
需要执行
前面两个错误都是执行下面的命令
kubectl label nodes mater01 k8s.kuboard.cn/role=etcd
1.2、web配置
-
刚进去会有一个错误的集群,删除掉,点击添加集群
-
输入集群名称和描述
-
复制kubeConfig
在master01节点执行cat ~/.kube/config
命令,把全部内容复制到kubeConfig框内,点击确认
如图显示,代表成功
2、部署Nginx服务
2.1、使用Kuboard部署
-
在首页点击集群,选择命名空间
-
填写信息
左边选择,名称空间>常用操作>创建工作负载,然后再填写基本信息
-
填写容器信息
阿里云镜像地址registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
填写好之后点击上面的保存>应用>确认>
-
查看
5.访问对应的节点进行测试
2.2、使用yaml方式创建
-
创建yaml
vim nginx-deployment.yaml
-
编写配置
--- apiVersion: apps/v1 kind: Deployment metadata: name: nginxweb # 部署的名称 spec: replicas: 2 # 设置副本数量为2 selector: matchLabels: app: nginxweb1 # 用于选择匹配的Pod标签 template: metadata: labels: app: nginxweb1 # Pod的标签 spec: containers: - name: nginxwebc # 容器名称 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败 imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取 ports: - containerPort: 80 # 容器内部监听的端口 --- apiVersion: v1 kind: Service metadata: name: nginxweb-service # 服务的名称 spec: externalTrafficPolicy: Cluster # 外部流量策略设置为集群 selector: app: nginxweb1 # 用于选择匹配的Pod标签 ports: - protocol: TCP # 使用TCP协议 port: 80 # 服务暴露的端口 targetPort: 80 # Pod中容器的端口 nodePort: 30080 # 在每个Node上分配的端口,用于外部访问 type: NodePort # 服务类型,使用NodePort
-
应用配置
kubectl apply -f nginx-deployment.yaml
-
检查是否成功
-
查看
pod
kubectl get pods
-
查看
service
service 可以查看到对应pod的名称还有端口映射
kubectl get service
-
查看访问ip
curl http://10.244.5.3 curl http://10.244.30.69
- 通过对应的节点IP进行测试
⌨️码字不易,觉得可以的话可以一键三连一下!!!