注意:在项目部署之前,先要保证K8S
每一台服务器(服务器1,2,3)的/etc/docker/daemon.json
都配置上了 Harbor 的内网IP和端口号,否则会导致K8S集群无法成功拉取Harbor私有镜像:
{
"registry-mirrors": [
"https://8er86g8v.mirror.aliyuncs.com",
"https://docker.1panel.live/"
],
"insecure-registries": ["服务器4内网IP:9999"]
}
然后服务器1,2,3
通过下述命令重新加载配置:
systemctl daemon-reload && systemctl restart docker
7.1、配置 NameSpace
命名空间namespace
主要是用于 K8S 集群中资源隔离的,所以在这里我为项目创建一个命名空间prod-env
,命令如下:
kubectl create ns prod-env
7.2、配置 Deployment、Service
具体配置内容如下,注释写的很清楚,不多解释啦!
前端部署配置 frontend.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
# Deployment 名称
name: frontend-deployment
# 命名空间
namespace: prod-env
labels:
app: frontend-label
spec:
# 生成 Pod 数量
replicas: 3
# Pod 标签选择器,用于匹配管理
selector:
matchLabels:
app: frontend-label
template:
# Pod 标签,必须与 selector 匹配
metadata:
labels:
app: frontend-label
spec:
containers:
# 容器名
- name: frontend
# Harbor 前端镜像地址
image: 服务器4内网IP:9999/test/frontend-project:1.0
imagePullPolicy: Always
# 容器端口
ports:
- containerPort: 80
# 指定容器的资源请求和限制
resources:
requests:
memory: 300Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 400m
---
kind: Service
apiVersion: v1
metadata:
name: frontend-service
namespace: prod-env
labels:
app: frontend-label
spec:
selector:
app: frontend-label
# Service 类型:ClusterIP、NodePort、LoadBalancer
# 这里使用 ClusterIP,代表只在集群内部通讯(实际企业中也是用 ClusterIP)
# NodePort可以将Service对外暴露访问(一般没人用)
type: ClusterIP
ports:
- protocol: TCP
# 容器端口
port: 80
# Service 端口
targetPort: 80
后端部署配置 backend.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment
namespace: prod-env
labels:
app: backend-label
spec:
replicas: 3
selector:
matchLabels:
app: backend-label
template:
metadata:
labels:
app: backend-label
spec:
containers:
- name: backend
image: 服务器4内网IP:9999/test/backend-project:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
memory: 300Mi
cpu: 200m
limits:
memory: 500Mi
cpu: 400m
---
kind: Service
apiVersion: v1
metadata:
name: backend-service
namespace: prod-env
labels:
app: backend-label
spec:
selector:
app: backend-label
type: ClusterIP
ports:
- protocol: TCP
port: 8080
targetPort: 8080
最后,通过下述命令对前端、后端项目
进行启动:
kubectl apply -f frontend.yaml && kubectl apply -f backend.yaml
7.3、配置 Ingress-Nginx
直接通过 K8S Service 的 NordPort
模式可以完成服务对外提供访问的要求,但是真正企业级场景来说,更多的是使用 Ingress-Nginx
构建应用入口,所以这里还需要部署一下 Ingress-Nginx
,请参考下述连接部署:https://xuzhibin.blog.****.net/article/details/143227591
按照上述部署完毕后其实有个问题,我们需要保证ingress-nginx-controller
部署在 Master
节点上,否则无法进行正确的访问,所以还需要修改Ingress部署配置文件
的一处位置,让其部署在主节点上:
修改完毕后,重新卸载安装 Ingress-Nginx
:
# 删除 Ingress-Nginx
kubectl delete -f ingress-deploy.yaml
# 安装 Ingress-Nginx
kubectl apply -f ingress-deploy.yaml
此时可以看到,ingress-nginx-controller
部署在 k8s-master
上了:
部署完毕后,接下来要做的是配置一下 ingress-project.yaml
完成访问配置,由于我的服务器都在香港地区,所以这次我就用真实的域名解析到我的主服务器IP上(没有可用于名,就得通过修改 hosts 文件使用假域名测试了),配置内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
# Ingress-Nginx 名称
name: my-ingress
namespace: prod-env
spec:
# Ingress Class
ingressClassName: nginx
# 路由规则
rules:
# 域名
- host: k8s.joydevelop.com
http:
paths:
# 访问域名根路径,就会路由到 front-service 服务上
- path: /
pathType: Prefix
backend:
service:
# 前端服务名称
name: frontend-service
# 服务端口
port:
number: 80
# 后端服务 Service 就不用暴露了,不需要直接把后端接口给别人调用啊!
# - path: /api
# pathType: Prefix
# backend:
# service:
# name: backend-service
# port:
# number: 8080
然后通过下述命令进行 Ingress-Nginx
创建启动:
kubectl apply -f ingress-project.yaml
7.4、访问测试
最后,在浏览器上通过访问域名,可以看到 K8S 部署 SpringBoot + Vue.js 项目成功!