需求: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

八、环境复原¶
[root@master01 springdemo]# k delete -f ingress.yaml -f deployment.yaml -f service.yaml