前面我们已经学习了docker与k8s的核心概念,我们将以一个demo案例的形式进行一个汇总,以windows环境为示例,在本地搭建以前端Vue+后端nodejs+mysql+跨pod通信的本地服务来回顾总结之前的知识。
一、前置准备
①安装微软WSL让我们能再windows环境下运行Linux
②安装windows docker 启一个本地的k8s集群,注意(需要代理)
③创建一个工作目录 mkdir k8s-full-app && cd k8s-full-app 后续相关的yaml我们都放在这个目录下
④在powershell中执行kubectl get nodes 确保dockerdesktop的状态为ready
⑤源文件在文章发布中不方便上传。
二、部署mysql数据库
在目录下我们创建下面这些yaml
①kubectl apply -f .\mysql-secret.yaml 创建Secret 用于存储mysql的密码等,保障敏感信息安全
②kubectl apply -f .\mysql-pv.yaml 与 kubectl apply -f .\mysql-pvc.yaml 这个可以对应到我们之前学习的PersistentVolume持久卷的概念,我们可以定义存储的容量,访问的模式以及存储的路径这里我们写在本地文件。
③kubectl apply -f .\mysql-deployment.yaml 这里对应前面文章2对pod的控制器Deployment的应用我们会创建一个mysql的pod副本,用来管理它的全生命周期。
④kubectl apply -f .\mysql-service.yaml 这里对应前面文章2的service概念,如果实际操作的话还可以去了解一下标签选择器的概念和JS的比较类似,这里指定了ClusterIP仅能在集群内部访问以及端口
完成上述步骤以后我们可以借助一些桌面端的数据可视化工具,当然我们需要更改mysql - service的type为nodeport,然后可以用我们熟悉的方式去读写数据。
三、部署node.js后端服务
①cd backend 然后我们需要写入app.js 、package.json 以及dockerfile
在app.js中我们可以基于Express 连上mysql,读写我们之前在mysql中创建的表的服务。
在package.json中定义我们dependencies依赖Express和mysql版本确保我们使用docker完成构建时安装服务需要的依赖。
在Dockerfile配置node应用,包含版本等。
②完成docker镜像的构建docker build -t backend:v1 . 前面的文章提到k8s部署的核心是容器,而容器需要基于包含了所有容器所需环境的镜像来运行。
③在fullapp中创建后端服务backend-deployment.yaml,定义端口,环境变了注入,声明pod数量等等,运行containers的image为我们前面创建的 backend:v1 并在fullapp中创建后端服务的backend-service.yaml,指定端口,访问类型为ClusterIP。
④kubectl apply -f .\backend-deployment.yaml 与 kubectl apply -f .\backend-service.yaml 同mysql完成创建。
可以在docker工具中也能复验pods的状态,在面我们需要在shell工具中对服务做一个简单的验证
$BACKEND_POD = kubectl get pods -l app=backend -o jsonpath='{.items[0].metadata.name}'取到pod的名字以后 kubectl exec -it $BACKEND_POD -- curl backend-service/messages,我们预先在数据库中预制了几条数据,刚好得到想要的结果。
四、部署前端vue应用
① cd frontend 使用Vue创建一个工程项目
②注意这里需要构建一下nginx反向代理,Dockerfile和后端的类似,然后构建docker镜像
FROM node:14-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
③构建docker build -t frontend:v1 .镜像和frontend-deployment.yaml以及frontend-service.yaml,然后创建pod和service
kubectl apply -f .\frontend-deployment.yaml
kubectl apply -f .\frontend-service.yaml
④在docker工具中我们可以查看到各个pod的运行状态,然后个人本地浏览器中打开http://localhost:30080/可以尝试录入信息,然后去我们的测试库观察数据写入成功。
五、总结与反思
至此一套本地部署的实践小案例完成,这仅仅是一个开始。后面还有很多理论需要思考和实践,比如我们之前提到如何监测,如何通过grafana监测到CPU,内存异常后如何实现资源动态调度呢?比如怎么实现EFK?怎么实现全链路追踪分析,前端到后端到数据库甚至中间件那个环节耗时长?还有太多的问题值得我们去深入的探索,一次读书活动仅仅是一次尝鲜,要进入真正的实战仍颇具挑战。
在云原生快速发展的今天,docker和k8s不再是一份新技术而是许多企业的事实标准,其精妙的设计模式与架构布局衍生出了多种可行可靠的解决方案支持企业低成本快速发展。读<从Docker到Kubernetes入门与实战>让我们团队体会深刻,面对客户对稳定性的追求极高,CLP客户的长期高压,当我们暂时还没有足够的能力去解决时,烦恼和急躁没用,沉下心来认真读一本书做好手里的工作,做到求真求知一切问题都会迎刃而解。