Redian新闻
>
SpringCloud 微服务迁移到 Kubernetes 容器化完整流程

SpringCloud 微服务迁移到 Kubernetes 容器化完整流程

公众号新闻

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn

来源:blog.csdn.net/qq_40722827
/article/details/127958192


k8s容器部署流程

具体步骤:

  • 第一步:熟悉Spring Cloud微服务项目
  • 第二步:源代码编译构建
  • 第三步:构建项目镜像并推送到镜像仓库
  • 第四步:K8s服务编排
  • 第五步:部署服务所需的基础环境
  • 第六步:部署微服务程序
  • 第七步:部署微服务前端
  • 第八步:微服务对外发布

熟悉Spring Cloud微服务项目

微服务架构图

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

源代码编译构建

拉取仓库代码

git clone http://192.168.0.126/saas-wms/linkinsense-wms-public.git  

编译代码

mvn clean package -Dmaven.test.skip=true -Pdev  

这儿构建时间久是因为第一次构建,需要下载maven依赖,之后构建就会很快了。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

构建项目镜像并推送到镜像仓库

  • 基础镜像:centos,ubuntu
  • 中间件镜像:jdk,nginx
  • 项目镜像:基础镜像+中间件镜像+项目代码

制作镜像

https://blog.csdn.net/qq_40722827/article/details/126337904

编写gateway服务的DockerFile,制作镜像

vi Dockerfile  
FROM openjdk:8-jre  
  
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
RUN echo 'Asia/Shanghai' > /etc/timezone  
  
WORKDIR /wms-center/wms-gateway  
  
ADD ./target/wms-gateway-1.0.0.jar ./  
  
EXPOSE 8901  
  
CMD java -jar wms-gateway-1.0.0.jar  

编写完成的DockerFile放置的文件位置

通过DockerFile构建镜像

docker build -t wms-gateway:v1 -f wms-gateway/Dockerfile ./wms-gateway/  

查看构建好的镜像

docker images  

将镜像推送到harbor仓库

之前本地部署的镜像仓库Harbor: http://192.168.0.127:8084/,如果没有可拿docker-hub注册一个账号。

登录仓库

docker login 192.168.0.127:8084  

推送镜像到镜像仓库需要满足镜像仓库的镜像名称,因此需要给构建好的镜像打个tag。

给构建的镜像打tag

docker tag wms-gateway:v1  192.168.0.127:8084/onlee/gateway:v1  

推送镜像仓库

docker push 192.168.0.127:8084/onlee/gateway:v1  

其他模块构建和推送参考gateway模块

K8s服务编排

制作gateway的k8s yaml文件(gateway.yaml)

---  
apiVersion: apps/v1  
kind: Deployment   
metadata:  
  name: gateway  
  namespace: wms-dev  
spec:  
  replicas: 1  
  selector:  
    matchLabels:  
      project: wms-dev  
      app: gateway  
  template:  
    metadata:  
      labels:  
        project: wms-dev  
        app: gateway  
    spec:  
      imagePullSecrets:  
      - name: registry-harbor  
      containers:  
      - name: gateway  
        image: 192.168.0.127:8084/onlee/gateway:v1  
        imagePullPolicy: Always  
        ports:  
          - protocol: TCP  
            containerPort: 8901  
        env:  
          - name: JAVA_OPTS  
            value: "-Xmx1g"  
        resources:  
          requests:  
            cpu: 0.5  
            memory: 256Mi  
          limits:  
            cpu: 1  
            memory: 1Gi  
        readinessProbe:  
          tcpSocket:  
            port: 8901  
          initialDelaySeconds: 60  
          periodSeconds: 10  
        livenessProbe:  
          tcpSocket:  
            port: 8901  
          initialDelaySeconds: 60  
          periodSeconds: 10  

其他模块编写k8s yaml文件参考gateway模块

部署基础环境

这一步暂时省略,后续补充…

  • 在K8s中部署Nacos集群(注册和配置中心)
  • 在k8s中部署Seata分布式事务
  • 在linux部署mysql,redis,rabbitmq,minio,xxl-job

部署微服务程序

准备namespace

kubectl create namespace wms-dev  

部署服务

kubectl apply -f gateway.yaml  

其他模块部署服务参考gateway模块

部署微服务前端

编写DockerFile文件

FROM nginx  
  
COPY dist /usr/share/nginx/html/  
  
EXPOSE 80  

构建镜像

docker build -t wms-web:v1 -f  Dockerfile .  

镜像打tag

docker tag  wms-web:v1 192.168.0.127:8084/onlee/wms-web:v1  

推送到镜像仓库

docker push  192.168.0.127:8084/onlee/wms-web:v1   

服务编排(web.yaml)

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  labels:  
    app: wms-web  
  name: wms-web  
  namespace: wms-dev  
spec:  
  progressDeadlineSeconds: 600  
  replicas: 1  
  selector:  
    matchLabels:  
      app: wms-web  
  strategy:  
    rollingUpdate:  
      maxSurge: 50%  
      maxUnavailable: 50%  
    type: RollingUpdate  
  template:  
    metadata:  
      labels:  
        app: wms-web  
    spec:  
      imagePullSecrets:  
        - name: registry-harbor  
      containers:  
        - image: 192.168.0.127:8084/onlee/wms-web:v1  
          imagePullPolicy: Always  
          name: app  
          ports:  
            - containerPort: 80  
              protocol: TCP  
          resources:  
            limits:  
              cpu: 300m  
              memory: 600Mi  
          terminationMessagePath: /dev/termination-log  
          terminationMessagePolicy: File  
      dnsPolicy: ClusterFirst  
      restartPolicy: Always  
      terminationGracePeriodSeconds: 30  

部署服务

kubectl apply -f web.yaml  

微服务对外发布

通过整个微服务架构可知,只有gateway和前端需要暴露服务。

NorePort方式暴露

gateway对外暴露

gateway-nortport.yaml

---  
apiVersion: v1  
kind: Service  
metadata:  
  name: gateway  
  namespace: wms-dev  
spec:  
  ports:  
  - port: 8901  
    name: gateway  
    protocol: TCP  
    targetPort: 8901  
    nodePort: 32074  
  selector:  
    project: wms  
    app: gateway  
  type: NodePort  

前端对外暴露

web-noreport.yaml

---  
apiVersion: v1  
kind: Service  
metadata:  
  labels:  
    app: wms-web  
  name: wms-web  
  namespace: wms-dev  
spec:  
  ports:  
    - name: http  
      port: 80  
      protocol: TCP  
      targetPort: 80  
      nodePort: 32248  
  selector:  
    app: wms-web  
  sessionAffinity: None  
  type: NodePort  

Ingress方式暴露

https://blog.csdn.net/qq_40722827/article/details/127929141

gateway对外暴露

---  
apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
  name: gateway   
  namespace: wms-dev  
  annotations:  
    kubernetes.io/ingress.class: "nginx"  
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"  
spec:  
  rules:  
    - hostgateway.wms.com   
      http:  
        paths:  
        - path: /  
          pathTypePrefix  
          backend:  
            service:   
              namegateway  
              port:   
                number: 8901  
---  
apiVersionv1  
kindService  
metadata:  
  namegateway  
  namespacewms-dev  
spec:  
  ports:  
  - port: 8901   
    namegateway  
  selector:  
    projectwms-dev  
    appgateway  

前端对外暴露

---  
apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
  name: wms-web  
  namespace: wms-dev  
  annotations:  
    kubernetes.io/ingress.class: "nginx"  
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"  
spec:  
  rules:  
    - hostdev.wms.com   
      http:  
        paths:  
        - path: /  
          pathTypePrefix  
          backend:  
            service:   
              namewms-web  
              port:   
                number: 80  
---  
apiVersionv1  
kindService  
metadata:  
  labels:  
    appwms-web  
  namewms-web  
  namespacewms-dev  
spec:  
  ports:  
    - namehttp  
      protocolTCP  
      port: 80  
      targetPort: 80  
  typeClusterIP  
  selector:  
    appwms-web  
  sessionAffinityNone  

至此,所有微服务已经迁移到Kubernetes容器上了。

把我们上面手动做的这些,通过Jenkins等组件搭建成一个自动化部署的过程,就涉及到DevOps相关的知识了。接下来就会编写这一块的内容。

以上内容还有一些不够完善的地方,后续也会不断完善的。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
中元思故Kubernetes 上 API 网关的未来剑指 Kubernetes!微软发布开源平台 Radius:高效构建、运行云原生应用程序SpringCloud 远程调用为啥要采用HTTP,而不是RPC?使用 kube-downscaler 降低Kubernetes集群成本Kubernetes 资源请求和限制的最佳实践kuberntes ingress 和 openshift router 异同?Kubernetes 中的 Java 应用的内存调优带我家来的小留去吃生鱼片(图)容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档你有多高调我就能多低调!Kubernetes 网络排错终极指南Jenkins pipeline如何连接Kubernetes?Kubernetes 中 Nginx 配置热加载Asia’s Biggest Men’s Tennis Tournament Returns to ShanghaiOld Markets, New Appeal: Young Chinese Rediscover Wet MarketsSpringCloud 微服务架构:实现分布式系统的无缝协作Uber 将 4000 多个微服务迁移到新的多云平台 Up微服务框架之争:Quarkus 是 SpringBoot 的替代品吗?Oppenheimer 观后感Young Chinese Embrace Budget-Friendly Elderly UniversitiesKubernetes 基础入门,还有谁不会?Kubernetes 实战:使用 k8s+jenkins 实现 CICD详解 Spring Cloud 版本问题国内最牛逼的 Spring Cloud,不接受反驳!| 极客时间如何利用 Kubernetes 实现应用零宕机图解几种常见 Kubernetes Pod 驱逐场景既然有了Kubernetes,为什么还需要 Istio?如何用Kubernetes实战快速搭建typecho个人博客?Space Race: Why Young Chinese Are Cutting Ties with RelativesPinterest 使用 Kubernetes 和 Helix 构建下一代异步计算平台 Pacer优化资源利用:Kubernetes 装箱的效益和挑战Spring Cloud :打造可扩展的微服务网关撸了一个简易的配置中心,顺带还给整合到了SpringCloud红色日记 51-15
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。