• 阿里云K8S部署Go+Vue项目


    前言

            Kubernetes是一个可以移植、可扩展的开源平台,使用声明式的配置并依据配置信息自动地执行容器化应用程序的管理。在所有的容器编排工具中(类似的还有 docker swarm / mesos等),Kubernetes的生态系统更大、增长更快,有更多的支持、服务和工具可供用户选择。

    优势:

    • 敏捷地创建和部署应用程序:相较于创建虚拟机镜像,创建容器镜像更加容易和快速
    • 持续构建集成:可以更快更频繁地构建容器镜像、部署容器化的应用程序、并且轻松地回滚应用程序
    • 分离开发和运维的关注点:在开发构建阶段就完成容器镜像的构建,构建好的镜像可以部署到多种基础设施上。这种做法将开发阶段需要关注的内容包含在如何构建容器镜像的过程中,将部署阶段需要关注的内容聚焦在如何提供基础设施以及如何使用容器镜像的过程中。降低了开发和运维的耦合度
    • 可监控性:不仅可以查看操作系统级别的资源监控信息,还可以查看应用程序健康状态以及其他信号的监控信息
    • 开发、测试、生产不同阶段的环境一致性:开发阶段在笔记本上运行的容器与测试、生产环境中运行的容器一致
    • 跨云服务商、跨操作系统发行版的可移植性:容器可运行在 Ubuntu、RHEL、CoreOS、CentOS等不同的操作系统发行版上,可以运行在私有化部署以及不同的云供应商的环境中
    • 以应用程序为中心的管理:虚拟机时代的考虑的问题是在虚拟硬件上运行一个操作系统,而容器化时代,问题的焦点则是在操作系统的逻辑资源上运行一个应用程序
    • 松耦合、分布式、弹性、无约束的微服务:应用程序被切分成更小的、独立的微服务,并可以动态部署和管理,而不是一个部署在专属机器上的庞大的单片应用程序
    • 资源隔离:确保应用程序性能不受干扰
    • 资源利用:资源高效、高密度利用

    一、构建Go服务镜像

    1.Go项目主要文件

    2.简单Go项目

    简单Go项目,主要提供一个登录接口,给后端Vue项目调用,运行时监听8881端口。

    1. package main
    2. import (
    3. "github.com/gin-gonic/gin"
    4. "net/http"
    5. )
    6. type User struct {
    7. ID int64 `json:"id"`
    8. Username string `json:"username"`
    9. Password string `json:"password"`
    10. Email string `json:"email"`
    11. }
    12. func main() {
    13. router := gin.Default()
    14. router.Any("/", func(c *gin.Context) {
    15. c.String(http.StatusOK, "Joy")
    16. })
    17. // 登录
    18. router.POST("/admin/login", userLogin)
    19. router.Run(":8881")
    20. }
    21. func userLogin(c *gin.Context) {
    22. var user User
    23. if err := c.ShouldBind(&user); err != nil {
    24. c.JSON(http.StatusOK, gin.H{
    25. "code": 1,
    26. "msg": "params error",
    27. "data": err.Error(),
    28. })
    29. return
    30. }
    31. if user.Username != "admin" || user.Password != "123456" {
    32. c.JSON(http.StatusOK, gin.H{
    33. "code": 1,
    34. "msg": "account or password error",
    35. "data": nil,
    36. })
    37. return
    38. }
    39. c.JSON(http.StatusOK, gin.H{
    40. "code": 0,
    41. "msg": "success",
    42. "data": map[string]interface{}{
    43. "id": 1,
    44. "username": user.Username,
    45. "email": "123456@qq.com",
    46. "token": "123456",
    47. },
    48. })
    49. }

    3.编写Dockerfile

    1. # 声明镜像来源为golang:alpine
    2. FROM golang:alpine AS builder
    3. # 定义变量属性值
    4. ENV CGO_ENABLED 0
    5. ENV GOOS linux
    6. ENV GOPROXY https://goproxy.cn,direct
    7. # 声明工作目录
    8. WORKDIR /go/src/joy
    9. # 拷贝整个项目到工作目录
    10. COPY . .
    11. # 编译项目文件
    12. RUN go build -ldflags="-s -w" -o /go/src/joy/main ./main.go
    13. ##### 第二阶段构建 #####
    14. # 声明镜像来源为alpine:latest
    15. FROM alpine:latest
    16. # 镜像编写者及邮箱
    17. LABEL MAINTAINER="xxx@qq.com"
    18. # 声明工作目录
    19. WORKDIR /go/src/joy
    20. # 拷贝/go/src/joy文件夹下文件到当前工作目录
    21. COPY --from=builder /go/src/joy/main ./main
    22. # 声明容器的服务端口(仅仅是声明)
    23. EXPOSE 8881
    24. # 运行打包好的二进制
    25. CMD ["./main"]

    4.构建镜像

     此处是在项目目录下进行,且我之前一登录Dockerhub;如果你没有登录Dockerhub;先执行 "docker login -u 用户名 -p 密码"登录Dockerhub;如果你使用私有库存,需要改对应镜像名称

    1. # 构建(-f 指定dockerfile -t dockerhub用户名/仓库名:Tag)
    2. docker build -f Dockerfile -t babytime2019/joy:v1.0.0 .
    3. # 推送
    4. docker push babytime2019/joy:v1.0.0

    二、构建Vue项目镜像

    1.Vue项目主要文件

    此Vue接口统一前缀统计admin开始()

    2.配置Nginx文件

    1. server {
    2. listen 8080;
    3. server_name localhost;
    4. #charset koi8-r;
    5. #access_log logs/host.access.log main;
    6. location / {
    7. root /usr/share/nginx/html;
    8. add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    9. try_files $uri $uri/ /index.html;
    10. }
    11. }

    3.编写Dockerfile

    1. # 声明镜像来源为node:14.17.4
    2. FROM node:14.17.4 AS builder
    3. # 声明工作目录
    4. WORKDIR /www/
    5. # 拷贝整个web项目到当前工作目录
    6. COPY . .
    7. # 使用npm进行安装依赖&编译打包文件
    8. RUN npm install --registry=http://registry.npm.taobao.org && npm run build
    9. #################### 第二阶段构建 ####################
    10. # 声明镜像来源为nginx:alpine, alpine 镜像小
    11. FROM nginx:alpine
    12. # 镜像维护者姓名或邮箱地址
    13. LABEL MAINTAINER="xxx@qq.com"
    14. # 从deploy/docker/nginx/conf.d目录拷贝my.conf到容器内的/etc/nginx/conf.d/my.conf
    15. COPY deploy/docker/nginx/conf.d/my.conf /etc/nginx/conf.d/my.conf
    16. # 从第一阶段进行拷贝编译好的文件到/usr/share/nginx/html
    17. COPY --from=builder /www/dist /usr/share/nginx/html
    18. # 查看/etc/nginx/nginx.conf文件(可以不加)
    19. RUN cat /etc/nginx/conf.d/my.conf
    20. # 查看 /etc/nginx/conf.d/my.conf(可以不加)
    21. RUN cat /etc/nginx/conf.d/my.conf
    22. # 查看 文件是否拷贝成功(可以不加)
    23. RUN ls -al /usr/share/nginx/html

    4.构建镜像

     此处是在项目目录下进行,且我之前一登录Dockerhub;如果你没有登录Dockerhub;先执行 "docker login -u 用户名 -p 密码"登录Dockerhub;如果你使用私有库存,需要改对应镜像名称

    1. # 构建(-f 指定dockerfile -t dockerhub用户名/仓库名:Tag)
    2. docker build -f Dockerfile -t babytime2019/joy-manage:v1.0.0 .
    3. # 推送
    4. docker push babytime2019/joy-manage:v1.0.0

    三、阿里云部署Go+Vue

    1.进入阿里云K8s集群

    此处我已创建K8s集群,这里不详细说明创建过程,大家可以看阿里云官方文档

     2.创建集群命名空间

    创建命名空间,主要时为了达到项目隔离的目的

    3.创建Go服务应用

     

     

     

     创建成功之后,我们会看到两个Pod,如果都处于"Running"状态,说明服务正常其中。

     4.创建Go项目的Service

    5.创建Go项目的Ingress

    设置路径"/admin",匹配"/admin"开头的路劲,都走此服务。"www.babytime.vip"和Ingress中公网IP已解析,大家可以直接用生成的公网访问应用。

    6.创建Vue服务应用

     

     

    7.配置Vue项目的Service

     8.修改Vue项目的Ingress

    9.访问应用

     

     

  • 相关阅读:
    动态规划完全背包
    docker系列-报错以及解决指南
    SQL sever2008数据库备份、还原以及库检查
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    DevExpress WinForms是一款全球顶级的用户界面控件套包
    java计算机毕业设计交通非现场执法系统MyBatis+系统+LW文档+源码+调试部署
    有趣网站推荐-Rainymood
    csp非零段划分
    【论文笔记】Enabling technologies and tools for digital twin
    封神工具:腾讯云服务器价格计算器_好工具分享
  • 原文地址:https://blog.csdn.net/qq_34272964/article/details/125469366