1.Sealos(5.0.1)搭建K8S(1.30.5)集群
1.1 注(前提):
1.建议使用干净的操作系统来创建集群,不要自己装 Docker!,sealos会自动安装Docker。
2.服务器需开放以下端口:22
(SSH)、6443
(K8s API)、10250
等,建议直接关闭服务器的防火墙。
3.已安装并配置好 ssh
,节点之间能互通。
4.每个集群节点应该有不同的主机名。主机名不要带下划线。
5.所有节点的时间需要同步(ntp或chrony)。
1.2 准备至少两台服务器(文档使用虚拟机运行,硬件限制,只准备两台服务器)
#Centos7、Linux
第一台:192.168.8.100 master
第二台:192.168.8.101 node
1.3 修改主机名,主机名不一致(每台服务器都执行,只改自己服务器的名字)
第一台:hostnamectl set-hostname master01
第二台:hostnamectl set-hostname node02
1.4 添加IP地址解析(每台服务器都执行)
如果不会查找ip,先搜索查找ip的方法,Centos下,需要修改配置文件,指定ip,且能ping通外网。
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.100 master01
192.168.8.101 node01
EOF
1.5 设置国内镜像、关闭防火墙、时间同步(每台服务器都执行)
# yum设置为国内源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum clean all
sudo yum makecache
#永久关闭防火墙(重启后仍生效)
sudo systemctl disable firewalld
\# 设置时间同步
sudo yum -y install ntpdate
sudo ntpdate ntp1.aliyun.com
1.6 Sealos 安装,自动部署K8S(主节点服务器执行)
1.6.1 解压Sealos安装包
# 自动下载安装
curl -sfL <https://raw.githubusercontent.com/labring/sealos/main/scripts/install.sh> | sh -s v5.0.1
# 若无法正常访问 github 可选择手动下载安装
# 通过网盘分享的文件:sealos_5.0.1_linux_amd64.tar.gz
# 链接: https://pan.baidu.com/s/1pziOrpcpRg51kKys13oGIw?pwd=q6th 提取码: q6th
# 下载后上传到服务器,执行以下命令手动安装
tar zxvf sealos_5.0.1_linux_amd64.tar.gz sealos \
&& chmod +x sealos && mv sealos /usr/bin
1.6.2 部署,这一个步骤需要复制Docker给node节点服务器,比较慢,耐心等待,以下三种方式按需选择,由于硬件限制,我用的是单Master集群部署
# All-in-One(本地单节点)适用于学习、验证功能、本地开发使用。
# 由于Sealos默认是使用的 containerd 作为运行时,命令跟原有的Docker不太一样
# 以下示例改为 Docker 作为运行时,若想保持默认,去掉镜像后面的-docker即可
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.30.5 \
--single
# 单 Master 集群部署(轻量集群)
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.30.5 \
--masters 192.168.8.100 \
--nodes 192.168.8.101,192.168.xx.xx -p your-ssh-passwd
# 多 Master 高可用集群(推荐生产使用)
sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.30.5 \
--masters xxx,xxx,xxx \
--nodes xxx,xxx -p your-ssh-passwd
1.6.3 安装常用应用组件,基本安装成功后,各节点才会变为Ready状态
# 一键安装 Helm
sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
\# 一键安装 [calico 网络]
sealos run registry.cn-shanghai.aliyuncs.com/labring/calico:v3.25.0
\# 一键安装 nginx ingress controller 为后续部署Java、Vue项目做准备
sealos run registry.cn-shanghai.aliyuncs.com/labring/ingress-nginx:v1.11.3
1.6.4 Ingress-Nginx和K8S版本兼容对照表
在https://github.com/kubernetes/ingress-nginx可以找到
1.6.5 K8S集群可用性验证
kubectl get nodes
#结果均要reday,如果不是,则自行排查一下问题所在
kubectl get pod -A
#结果均要running,如果不是,则自行排查一下问题所在
1.6.6 Sealos常用命令
# 增加 node 节点
sealos add --nodes 192.168.32.6
# 增加 master 节点
sealos add --masters 192.168.32.10
# 删除 node 节点
sealos delete --nodes 192.168.32.5
# 删除 master 节点
sealos delete --masters 192.168.32.10
# 一键清理 k8s 集群
sealos reset
# 查看命令助手
sealos help
1.6.7 总结:
Kubernetes 虽然功能强大,但部署门槛较高。
Sealos 将这一复杂过程变为“一条命令”,极大提升了部署效率和学习体验,适合初学者、本地开发者以及希望快速搭建测试环境的用户。
相比传统的 kubeadm 手动部署方式,sealos 带来了:
- ✅ 极简命令:安装、运行、卸载全自动
- ✅ 更少依赖:本地无需额外安装 Docker
- ✅ 可移植性强:支持多种集群形态,支持云端和本地部署
2.安装Harbor镜像仓库(主节点服务器执行)
2.1 先安装Docker-Compose来管理Docker容器
2.1.1 安装部署Docker-Compose
#版本兼容暂无,建议使用稳定版本,可在线下载,也可以从github下载好后上传到服务器,示例:
wget https://github.com/docker/compose/releases/tag/v2.34.0/docker-compose-$(uname -
s)-$(uname -m)" -o /usr/local/bin/docker-compose
#加可执行权限 如果从本地上传到服务器,则省去第一步
#离线文件:通过网盘分享的文件:docker-compose-linux-x86_64 链接: https://pan.baidu.com/s/1ZgAkYAm36795KN3A9EWYMQ?#pwd=4ifa 提取码: 4ifa
#记得将文件放到/usr/local/bin目录下
chmod +x /usr/local/bin/docker-compose
2.1.2 校验docker-compose是否安装成功
docker-compose -v
#结果如图
2.2下载Harbor安装包并解压,在线下载较慢,直接 从本地上传到服务器
2.2.1 解压Haobor安装包
#离线文档通过网盘分享的文件:harbor-offline-installer-v2.11.0.tgz
#链接: https://pan.baidu.com/s/1RgGAnIg304ZkUUXISrrzXw?pwd=tt8u 提取码: tt8u
tar -xzvf harbor-offline-installer-v2.11.0.tgz -C /usr/local/
2.2.2 修改配置文件
cd /usr/local/harbor
#复制harbor.yml.tmpl 文件并重命名为harbor.yml修改此配置文件,需要设置hostname、端口
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
#修改hostname的值,如果没有域名就使用本机IP地址
hostname: 192.168.8.100
#配置启动端口号
# http related config http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 7881
# 如果没有申请证书,需要隐藏https
#https:
# https port for harbor, default is 443# port: 443
# The path of cert and key files for nginx# certificate: /your/certificate/path# private_key: #/your/private/key/path
改成如下样子,如图
2.2.3 启动Harbor
sh /usr/local/harbor/install.sh
#查看harbor组件状态,需要全部Up,这样才是启动成功,如图
docker-compose ps
2.2.4 登录Harbor
登录192.168.8.100:7881,账号amdin,密码Harbor12345,创建一个test、project项目,如图:
2.2.5 Docker登录Harbor,master、node节点均可执行。
docker login -u admin -p Harbor12345 http://192.168.8.100
# 如果登录报错,则修改/etc/docker/daemon.json文件,加上如下配置:
# "insecure-registries": ["192.168.8.100:5000"],然后重启docker和harbor。
#重启docker
sudo systemctl restart docker
# 先停掉 Harbor 所有容器
sudo docker-compose down
## 再启动
sudo docker-compose up -d
#查看harbor组件状态,需要全部up,这样才是启动成功
docker-compose ps
2.2.6 Docker登录Harbor成功之后,就可以推送一个镜像测试一下
#本地pull一个小镜像
docker pull cirros
#给镜像打标签(版本号)
docker tag cirros 192.168.8.100:7881/test/cirros:v2
#上传到仓库
#docker push 192.168.8.100:7881/test/cirros:v2
#另外一台服务器拉取镜像
docker pull 192.168.8.100:7881/test/cirros:v2
3.K8S部署vue、springboot前后端分离项目
3.1 前提:
将步骤1、步骤2完成
3.2 准备Vue2项目和配置文件
1.我的vue2项目是自己已经准备好的,和网上的vue-element-admin一个架构,都是基于vue-cli,自行准备一个可以运行的项目即可。
2.在项目中,我配置了打包后的路径,名称为cemis,如果和我的不同,自行看情况调整即可。
3.在vue项目src目录,执行npm run build 命令,打包后会生成dist目录,我的目录里面还会有一层cimis,如果没有配置,则没有这一层目录,没有区别。
4.在linux的root目录下,新建project文件夹,将cemis目录,通过传输软件,全部传输到project文件夹下
5.在project目录下新增两个文件:cemis-default.conf、Dockerfile-web-cemis,每行命令具体什么含义可以自行搜索一下。
cemis-default.conf 内容:
server {
listen 7081;
server_name localhost;
# 前端静态资源
location /cemis/ {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
alias /usr/share/nginx/html/cemis/;
index index.html index.htm;
try_files $uri $uri/ /cemis/index.html;
}
# 错误页
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Dockerfile-web-cemis 内容:
FROM --platform=linux/amd64 nginx:stable-alpine
COPY cemis-default.conf /etc/nginx/conf.d/default.conf
ADD cemis /usr/share/nginx/html/cemis/
EXPOSE 7081
CMD ["nginx", "-g", "daemon off;"]
6.需要注意的点是,cemis-default.conf配置文件中,/cemis/这个路径,需要和前端文件vue.config.js下的publicPath保持一致,否则访问不到静态文件、图片等,也需要和后续K8S的yaml配置文件中,Ingress配置的前端代理路径保持一致。
3.3 准备SpringBoot项目和配置文件
1.我的SpringBoot项目是提前准备好的,日常项目即可,自行配置好application.yaml中的mysql配置和redis配置,application.yaml配置文件中,我暴露的端口为7034。
2.在IDEA中,打包成jar包,上传到/root/project目录下
3.在project目录下新增一个文件:Dockerfile-java-cemis,每行命令具体什么含义可以自行搜索一下。
Dockerfile-java-cemis 内容:
FROM openjdk:8-jdk
COPY sql /tmp/sql
# 拷贝 jar 包到镜像中
COPY cemis-boot-0.0.1-exec.jar /tmp/app.jar
# 暴露端口
EXPOSE 7034
# 入口命令
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]
4.最终有这些文件,sql、cemis-config.conf文件不需要管,这是我自己需要的文件,按照上面的步骤,有其他文件即可。如图:
3.4 Dokcer打包镜像,上传Harbor仓库,准备K8S的yaml文件,启动java、vue项目
3.4.1 Dokcer打包镜像,上传Harbor仓库
1.打包命令,在/root/project目录下执行,v1属于版本号,每次重新打包需要修改,不能重复:
#后端
docker build -t 192.168.8.100:7881/project/java-cemis:v1 -f Dockerfile-java-cemis .
#前端
docker build -t 192.168.8.100:7881/project/web-cemis:v1 -f Dockerfile-web-cemis .
2.推送仓库命令,打包好的版本号是什么,推送的时候就写什么:
#后端
docker push 192.168.8.100:7881/project/java-cemis:v1
#前端
docker push 192.168.8.100:7881/project/web-cemis:v1
3.查看已经打包好的镜像:docker images
3.4.2 准备K8S的yaml文件,启动java、vue项目
1.创建一个cemis.yaml文件,自行根据自身情况调整一下,具体含义可以自行百度搜索一下,我这个文件,会创建两个后端,两个前端服务,通过Ingress进行复杂均衡、轮询,一个服务挂了,另外一个服务会顶替上去,保证服务健壮性,Ingress这些功能自行测试。内容如下:
# -------------------- 前端 Deployment --------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-cemis
namespace: default
labels:
app: web-cemis
spec:
replicas: 2
selector:
matchLabels:
app: web-cemis
template:
metadata:
labels:
app: web-cemis
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: web-cemis
image: 192.168.8.100:7881/project/web-cemis:v1 # 如有新版可继续改
imagePullPolicy: Always
ports:
- containerPort: 7081
name: web-cemis
resources:
requests:
memory: 300Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 400m
---
# -------------------- 前端 Service --------------------
apiVersion: v1
kind: Service
metadata:
name: web-cemis
namespace: default
labels:
app: web-cemis
spec:
ports:
- port: 7081
protocol: TCP
targetPort: 7081
selector:
app: web-cemis
---
# -------------------- 后端 Deployment --------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-cemis
labels:
app: java-cemis
spec:
replicas: 2
selector:
matchLabels:
app: java-cemis
template:
metadata:
labels:
app: java-cemis
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: java-cemis
image: 192.168.8.100:7881/project/java-cemis:v1 # 【变动1】使用 openjdk:8-jdk 完整版
imagePullPolicy: Always
ports:
- containerPort: 7034
resources:
requests:
memory: 300Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 400m
---
# -------------------- 后端 Service --------------------
apiVersion: v1
kind: Service
metadata:
name: java-cemis
namespace: default
labels:
app: java-cemis
spec:
ports:
- port: 7034
protocol: TCP
targetPort: 7034
selector:
app: java-cemis
---
# -------------------- Ingress:一条规则同时暴露前端 & 后端 --------------------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: reach-cemis-ingress
annotations:
nginx.ingress.kubernetes.io/validate: "false"
spec:
rules:
- host:
http:
paths:
- path: /cemis
pathType: Prefix
backend:
service:
name: web-cemis
port:
number: 7081
- path: /cemisApi
pathType: Prefix
backend:
service:
name: java-cemis
port:
number: 7034
2.需要注意的点是:
1.cemis-default.conf配置文件中,/cemis/这个路径,要和K8S的yaml配置文件中,Ingress配置的前端代理路径保持一致。
2.vue项目中,.env文件中的VUE_APP_API_BASE_URL值,需要和K8S的yaml配置文件中,Ingress配置的后端代理路径保持一致。
3.执行cemis.yaml文件,启动java、vue项目:
#在/root/project目录下,首次创建K8S执行yaml文件
kubectl create -f cemis.yaml
#成功之后,输入命令,查看执行情况
kubectl get pods -o wide
#如图,状态都为running即可,可以看到,都是部署在node01节点上,所以需要访问的是node01节点的ip
4.查看Ingress的nodeprot端口,通过这个端口访问前端项目即可
kubectl get svc -n ingress-nginx
#如图,端口为31182
5.访问http://192.168.8.101:31182/cemis/,一定不要漏了最后一个/,否则无法访问
3.4.3 java/vue项目需要更新,或者重新执行cemis.yaml文件
1.java/vue项目需要更新,先把代码重新打包,更新到服务器,然后重复执行打包docker镜像、推送仓库(记得修改版本号)。
2.然后执行命令,更新镜像即可,如果cemis.yaml文件没有改变配置,不需要重新执行cemis.yaml,命令如下:
#后端
kubectl set image deployment/java-cemis web-cemis=192.168.8.100:7881/project/java-cemis:v1
#前端
kubectl set image deployment/web-cemis web-cemis=192.168.8.100:7881/project/web-cemis:v1
3.如果修改了cemis.yaml的配置,且之前已经执行过cemis.yaml文件了,则执行如下命令:
kubectl apply -f cemis.yaml
4.注意点,以上两个命令,执行一种即可,kubectl apply -f cemis.yaml命令中,包含了拉取镜像的命令。
3.4 总结
部署过程中,会遇到各种各样的问题,不可能一帆风顺,问题不怕,根据自身情况,ai基本上都能帮忙排查,定位到问题所在,如果是本地测试,记得将防火墙永久关闭,否则重启服务器,防火墙会再次开启。
关关难过关关过,前路漫漫亦灿灿