天天看点

14.企业运维实战之Jenkins分布式架构利用k8s集群自动化部署单war包应用实践

目录一览:

0x01 Jenkins之K8s集群自动化部署单war包应用

  • 前期准备
  • (0) HelloWorld - Tomcat 应用服务器
  • (1) Nginx - Web服务器
  • (2) Jenkins Pipeline 脚本
  • (3) Shell 部署脚本
  • (4) 效果预览

效果说明:

14.企业运维实战之Jenkins分布式架构利用k8s集群自动化部署单war包应用实践

0x01 Jenkins之K8s集群自动化部署单war包应用

实验目的

描述: 采用Jenkins从Gitlab中拉取测试项目以及代码质量检测,然后进行编译构建并利用K8s集群进行WAR包应用部署实践,最后将生成的制品进行归档到Gitlab的Release之中;

动态配置文件或者脚本:

  • setting.xml (Maven编译构建配置文件)
  • HelloWorld.yaml (应用部署资源清单)
  • options.sh (部署脚本)

前期准备

描述: 假定你已经按照我前面几篇文章中安装好基础环境。

(0) HelloWorld - Tomcat 应用服务器

  • Step 1.基础镜像拉取于上传到私有仓库中
weiyigeek@weiyigeek-107:~/k8s/sonarqube$ docker tag tomcat:8.5.61-jdk8-corretto harbor.weiyigeek.top/devops/tomcat:8.5.61-jdk8-corretto
weiyigeek@weiyigeek-107:~/k8s/sonarqube$ docker push harbor.weiyigeek.top/devops/tomcat:8.5.61-jdk8-corretto
The push refers to repository [harbor.weiyigeek.top/devops/tomcat]
f13244e4918b: Pushed
536f15f78828: Pushed
1c98b6d16fad: Pushed
fdef502bf282: Pushed
cee8d35c645b: Pushed
8.5.61-jdk8-corretto: digest: sha256:110d7391739e868daf8c1bdd03fcb7ffe9eaf2b134768b9162e2cd47d58f7255 size: 1368      
  • Step 2.资源清单文件
cat > HelloWorld.yaml <<'END'
apiVersion: v1
kind: Service
metadata:
name: deploy-maven-svc
spec:
type: NodePort         # Service 类型
selector:
app: java-maven       # 【注意】与deployment资源控制器创建的Pod标签进行绑定;
release: stabel       # Service 服务发现不能缺少Pod标签,有了Pod标签才能与之SVC对应
ports:                  # 映射端口
- name: http
port: 8080              # cluster 访问端口
targetPort: 8080        # Pod 容器内的服务端口
nodePort: 30089
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-java-maven
spec:
serviceName: "deploy-maven-svc"
replicas: 3                # 副本数
selector:                  # 选择器
matchLabels:
app: java-maven   # 匹配的Pod标签非常重要
release: stabel
template:
metadata:
labels:
app: java-maven      # 模板标签
release: stabel
spec:
volumes:                # 关键点
- name: webapps         # 卷名称
hostPath:             # 采用hostPath卷
type: DirectoryOrCreate   # 卷类型DirectoryOrCreate: 如果子节点上没有该目录便会进行创建
path: /nfsdisk-31/test/  # 各主机节点上已存在的目录此处是NFS共享
- name: timezone     # 容器时区设置
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
containers:
- name: java-maven
image: harbor.weiyigeek.top/devops/tomcat:8.5.61-jdk8-corretto  # 拉取的镜像
imagePullPolicy: IfNotPresent
command: ["bash","-c","cp /tmp/${APPNAME} /usr/local/tomcat/webapps/ROOT.war && catalina.sh run"]
env:
- name: APPNAME
value: HelloWorld-v1.40.war
ports:
- name: http         # 此端口在服务中的名称
containerPort: 8080  # 容器暴露的端口
volumeMounts:        # 挂载指定卷目录
- name: webapps      # Tomcat 应用目录
mountPath: /tmp/
- name: logs         # Tomcat 日志目录
mountPath: /usr/local/tomcat/logs
- name: timezone     # 镜像时区设置
mountPath: /usr/share/zoneinfo/Asia/Shanghai
volumeClaimTemplates:      # 卷的体积要求模板此处采用StorageClass存储类主要针对于应用日志的存储;
- metadata:                # 根据模板自动创建PV与PVC并且进行一一对应绑定;
name: logs
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: managed-nfs-storage # StorageClass存储类
resources:
requests:
storage: 1Gi
END      

(1) Nginx - Web服务器

  • Step 1.Nginx 配置文件
root@468dd7df372e:/# grep -v "#" /etc/nginx/conf.d/default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  rel.weiyigeek.top;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
}
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
}
}      
  • Step 2.将Jenkins构建的Release进行上传在Nginx 中进行归档所以需要资源清单进行部署;

继续阅读