需求:Spring Boot项目,开发提供jar包,部署到k8s后,用户可以通过域名访问服务;

一、思路分析

  • 开发提供jar包:基础镜像直接使用open-jdk;
  • 部署到k8s:多副本管理,滚动更新:需要使用Deployment控制器;Pod多副本负载均衡:需要使用ClusterIP服务资源;
  • 用户通过域名访问:使用Ingress创建域名路由,流量转发到Service;

二、构建docker镜像

我们将打包好的jar文件和dockerfile放在同一级目录下,执行docker build指令,即可完成镜像构建

#将打包好的jar文件和dockerfile放在同一级目录下
[root@master01 ~]# mkdir /root/5/springdemo
[root@master01 ~]# cd /root/5/springdemo
[root@master01 springdemo]# ls
deployment.yaml  Dockerfile  ingress.yaml  pom.xml  service.yaml  src  target
[root@master01 springdemo]# cat Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/openjdk:8-jdk
ADD ./target/springdemo2023.jar /opt/app.jar
EXPOSE 8080
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
WORKDIR /opt
CMD ["java","-jar","app.jar"]

#构建
[root@master01 springdemo]# docker build -t springboot:v1 .

#后台启动容器
[root@master01 springdemo]# docker run -it --rm -p 8080:8080 springboot:v1

#新起一个窗口进行验证测试
[root@master01 springdemo]# curl localhost:8080/appone

appOne

三、推送至harbor私有镜像仓库

构建好镜像测试无误后,接下来就可以推送到harbor私有镜像仓库中

#打标签
[root@master01 springdemo]# docker tag springboot:v1 harbor.zhang-qing.com/demo/springboot:v1

#命令行创建项目harbor机器上操作
[root@harbor01 harbor]# curl -k -u 'admin:Harbor12345' -XPOST -H "Content-Type:application/json" -d '{"project_name":"demo", "public": true}' "https://harbor.zhang-qing.com/api/v2.0/projects"

#推送到harbor私有镜像仓库
[root@master01 springdemo]# docker push harbor.zhang-qing.com/demo/springboot:v1

四、创建deployment资源

pod资源创建完成测试无误,接下来就是使用deployment控制器管理pod,让它以多副本方式运行

[root@master01 springdemo]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
    spec:
      containers:
      - name: springboot
        #改为自己仓库地址
        image: harbor.zhang-qing.com/demo/springboot:v1
        resources:
          limits:
            memory: "1Gi"
            cpu: "1"
          requests:
            memory: "128Mi"
            cpu: "100m"
        ports:
          - containerPort: 8080
            name: web
        livenessProbe:
          httpGet:
            port: web
            path: /apptwo
          timeoutSeconds: 2       # 表示容器必须在2s内做出相应反馈给probe否则视为探测失败
          periodSeconds: 30       # 探测周期每30s探测一次
        readinessProbe:
          tcpSocket:
            port: web
          initialDelaySeconds: 10 # 容器启动后10s开始探测

#应用
[root@master01 springdemo]# kaf deployment.yaml

#查看
[root@master01 springdemo]# kgp | grep springboot
springboot-674b8887f5-g8sl6   1/1     Running   0          42s
springboot-674b8887f5-mrd6m   1/1     Running   0          42s

五、创建service资源

控制器资源创建无误后,接下来我们部署service资源,然后就可以通过clusterIP+端口 方式访问服务

[root@master01 springdemo]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  name: springboot
spec:
  type: ClusterIP
  selector:
    app: springboot
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

#应用
[root@master01 springdemo]# kaf service.yaml

#查看
[root@master01 springdemo]# kgs | grep springboot
springboot   ClusterIP      10.0.178.224   <none>         8080/TCP       10s

六、创建ingress资源(临时测试)

说明:需要提前安装Ingress及公有云模拟器MetaLB

至此,资源创建基本完成,接下来我们配置一个ingress域名资源,客户端配置hosts地址后,就可以通过域名方式访问服务

#配置一个ingress域名资源
[root@master01 springdemo]# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
  name: springboot-ing
spec:
  ingressClassName: nginx
  rules:
  - host: api-test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: springboot
            port:
              number: 8080
        path: /
        pathType: ImplementationSpecific

#应用
[root@master01 springdemo]# kaf ingress.yaml

##配置hosts
#方法一
[root@master01 springdemo]# cat /etc/hosts
...
...
10.0.0.11 api-test.zhang-qing.com
...
...

#方法二(推荐)
在阿里云做A记录
10.0.0.11 api-test.zhang-qing.com

七、验证

#进入pod验证
[root@master01 springdemo]# kgp | grep springboot
springboot-84c5dc796-5hf9c   1/1     Running   0             85s
springboot-84c5dc796-jvvxg   1/1     Running   0             105s

[root@master01 springdemo]# kubectl exec -it springboot-84c5dc796-5hf9c -- curl localhost:8080/appone
appOne

#在宿主机上验证
[root@master01 springdemo]# curl api-test.zhang-qing.com/appone
appOne

打开浏览器输入http://api-test.zhang-qing.com/appone进行进一步验证,正常会恢复appOne

image-20250330132817764

八、环境复原

[root@master01 springdemo]# k delete -f  ingress.yaml -f deployment.yaml -f service.yaml