K8S应用实战-第二篇(Spring Boot项目部署)

本文详细介绍了在Kubernetes集群中部署Spring Boot应用的完整流程,包括项目打包、Dockerfile编写、镜像构建与推送、K8S编排文件编辑、错误排查等关键步骤,并针对pod创建失败的常见问题提供了解决方案。
摘要由CSDN通过智能技术生成

前言

K8S部署应用,比如微服务,都是目前最流行的解决方案,本篇就先来学习如何部署一个单体的Spring Boot项目

一、部署流程

1.1 项目打包成可执行 jar

在这里插入图片描述

rabbitmq-message-0.0.1-SNAPSHOT.jar

1.2 编写Dockerfile文件

#使用jdk8作为基础镜像
FROM java:8
#指定作者
MAINTAINER dt
#暴漏容器的8088端口
#EXPOSE 8088
#将复制指定的docker-demo-0.0.1-SNAPSHOT.jar为容器中的job.jar,相当于拷贝到容器中取了个别名
ADD rabbitmq-message-0.0.1-SNAPSHOT.jar /job.jar
#创建一个新的容器并在新的容器中运行命令
RUN bash -c 'touch /job.jar'
#设置时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#相当于在容器中用cmd命令执行jar包  指定外部配置文件
ENTRYPOINT ["java","-jar","/job.jar"]

1.3 上传至Linux中

在这里插入图片描述

1.4 构建镜像

docker build -t spring-boot-kubernetes:V1.0.1 .

在这里插入图片描述

docker images | grep spring-boot-kubernetes

在这里插入图片描述

1.5 推送镜像到远程仓库

1.5.1 登录阿里云

docker login --username=yandongfa少年 registry.cn-hangzhou.aliyuncs.com

在这里插入图片描述

1.5.2 推送镜像

docker tag spring-boot-kubernetes:V1.0.1 registry.cn-hangzhou.aliyuncs.com/dt-micro/boot-project:V1.0.1
docker push registry.cn-hangzhou.aliyuncs.com/dt-micro/boot-project:V1.0.1

在这里插入图片描述

1.5.3 查看镜像

在这里插入图片描述

1.5.4 删除本地镜像

docker rmi spring-boot-kubernetes:V1.0.1

注意:在部署之前,需要保证每台节点都能够拉取得到阿里云里面的镜像容器。

1.5.5 分别在node1和node2节点上,拉取最新的镜像

docker pull registry.cn-hangzhou.aliyuncs.com/dt-micro/boot-project:V1.0.1

1.6 编辑编排文件

vi deploy-springboot-k8s.yaml
apiVersion: apps/v1
kind: Deployment #部署
metadata:
  name: springboot-app
spec:
  replicas: 2 #2个副本
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
      - name: springboot-app
        image: registry.cn-hangzhou.aliyuncs.com/dt-micro/boot-project:V1.0.1 #push到阿里云上的镜像地址
        ports:
        - containerPort: 9999 #默认springboot端口 

---

apiVersion: v1
kind: Service
metadata:
  name: springboot-app
spec:
  type: NodePort # 服务类型,还有ClusterIP类型(默认类型),只能在集群内部访问。
  selector:
    app: springboot-app #选中上面的 Deployment
  ports:
  - port: 9999 #对外7003端口
    targetPort: 9999 #默认springboot端口 
    nodePort: 30090 # service对外开放端口,不指定、随机分配30000以上的端口,在任何节点上面都能访问到此端口

1.7 部署文件

kubectl apply -f deploy-springboot-k8s.yaml

查看 k8s 运行的 pod

kubectl get pod -n default

在这里插入图片描述
NAME 命名规则是我们deploy-springboot-k8s.yaml文件中的metadata/name + 随机字符。

进入 pod 内部

kubectl exec -it springboot-app-779d4fff96-9jwzs -n default -- sh

追踪错误信息

如果此时pod不是Running,需追踪错误信息:

kubectl describe pod springboot-app-779d4fff96-9jwzs

1.8 查看日志

kubectl logs -f springboot-app-779d4fff96-9jwzs

在这里插入图片描述

1.9 访问测试

http://192.168.78.196:30090/test/get

在这里插入图片描述

2.0 删除重新部署

kubectl delete -f deploy-springboot-k8s.yaml

二、常见错误

2.1 pod一直无法创建成功

如下图所示:

在这里插入图片描述

跟踪错误信息:

kubectl describe pod springboot-app-97df49cb6-9h5p9

Kubelet 报错如下:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "841909b1886acaf68e2fe6b9a7275e1f6b4b57c0d4ddce108d656da5286fd576" network for pod "springboot-app-97df49cb6-9h5p9": networkPlugin cni failed to set up pod "springboot-app-97df49cb6-9h5p9_default" network: failed to set bridge addr: "cni0" already has an IP address different from 10.245.2.1/24

我们初始化Pod的IP范围是:【–pod-network-cidr=10.245.0.0/16】

问题出现在给Pod分配IP上,意思是cni0的IP【10.245.2.1】不同于【10.245.1.0】,下面我们进入到node1节点中使用ifconfig命令查看IP信息:

在这里插入图片描述
flannel.1的IP为10.245.1.0,然后使用cat /run/flannel/subnet.env

解决方案:

将这个错误的网卡删除掉,之后会自动重建,分别在master、node1和node2节点上面执行如下命令

rm -rf /var/lib/cni/
rm -rf /etc/cni/
ifconfig cni0 down
ip link delete cni0

总结

下一篇:概念部分帮助你了解 Kubernetes 系统的各个部分以及 Kubernetes 用来表示集群的抽象概念, 并帮助你更深入地理解 Kubernetes 是如何工作的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT辰白

你的鼓励是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值