发布时间:2023-01-19 08:00
为能搞明白使用jenkins、harbor、gitlab进行CICD部署的流程,我先进行了一下不使用其软件进行部署的过程,明白了这个过程,在配置上述自动化部署的工具时也就知道了大体回路。
以部署一个使用springboot做的helloword程序为例
1、将spingboot项目先用maven打包成jar文件
在项目目录下使用命令mvn clean package就可以在target目录下看到生成的helloworld.jar文件,
使用java -jar helloword.jar命令运行一下看能不能正常使用。没问题进行下一步
2、生成docker image文件
springboot用到了jdk环境镜像,首先使用docker本地拉取jdk镜像
sudo docker pull openjdk:8-alpine
编写Dockerfile文件
FROM openjdk:8-alpine
COPY target/helloworld.jar /springboot-web.jar
ENTRYPOINT ["java", "-jar", "/springboot-web.jar"]
打包生成镜像
sudo docker build -t springboot-web:v1 .
3、将镜像推到私有的harbor仓库
sudo docker tag springboot-web:v1 core.harbor.shell.com:32042/library/springboot-web:v1
sudo docker login -u admin core.harbor.shell.com:32042
//登录成功后
sudo docker push core.harbor.shell.com:32042/library/springboot-web:v1
查看harbor仓库里面library目录下要是有springboot-web镜像说明推送成功
4、编写k8s部署脚本deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-web
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: springboot-web
release: canary
template:
metadata:
labels:
app: springboot-web
release: canary
spec:
containers:
- name: springboot-web
image: core.harbor.shell.com:32042/library/springboot-web:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8084
---
apiVersion: v1
kind: Service
metadata:
name: springboot-web
namespace: default
spec:
selector:
app: springboot-web
release: canary
ports:
- name: http
targetPort: 8084
port: 8084
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
namespace: default
spec:
ingressClassName: traefik
rules:
- host: springboot.shell.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springboot-web
port:
name: http
然后部署kubectl apply -f deploy.yaml
这里需要注意如果直接就这么部署pod会拉不下镜像,显示no such host,这是因为k8s部署pod的节点主机没有配置harbor的host,需要在/etc/hosts里添加上core.harbor.shell.com的地址解析。
除此之外,在部署时还会报X509权限错误,没有拉取镜像的权限。
我看网上好多说需要配置imagePullSecrets和docker访问的secret,我尝试了一下并不管用,目前还不知道什么问题。我的解决办法:k8s部署pod是在分配的节点上使用docker拉取镜像,于是就在其节点上增加docker访问harbor的配置(CSDN),配置完就可以正常拉取了,我这里建议将所有worker节点都做一下相关配置
查看ingress里面设置的域名,将访问的客户端机器配置相关域名的解析,就可以正常访问springboot项目编写的服务了。