云原生
Kubernetes基础
容器技术介绍
Docker快速入门
Containerd快速入门
K8S主要资源罗列
认识YAML
API资源对象
Kubernetes安全掌控
Kubernetes网络
Kubernetes高级调度
Kubernetes 存储
Kubernetes集群维护
Skywalking全链路监控
ConfigMap&Secret场景应用
Kubernetes基础概念及核心组件
水平自动扩容和缩容HPA
Jenkins
k8s中部署jenkins并利用master-slave模式实现CICD
Jenkins构建过程中常见问题排查与解决
Jenkins部署在k8s集群之外使用动态slave模式
Jenkins基于Helm的应用发布
Jenkins Pipeline语法
EFKStack
EFK日志平台部署管理
海量数据下的EFK架构优化升级
基于Loki的日志收集系统
Ingress
基于Kubernetes的Ingress-Nginx解决方案
Ingress-Nginx高级配置
使用 Ingress-Nginx 进行灰度(金丝雀)发布
Ingress-nginx优化配置
APM
Skywalking全链路监控
基于Helm部署Skywalking
应用接入Skywalking
服务网格
Istio
基于Istio的微服务可观察性
基于Istio的微服务Gateway实战
Kubernetes高可用集群部署
Kuberntes部署MetalLB负载均衡器
Ceph
使用cephadm部署ceph集群
使用Rook部署Ceph存储集群
openstack
glance上传镜像失败
mariadb运行不起来
创建域和项目错误_1
创建域和项目错误_2
安装计算节点
时钟源
网络创建失败
本文档使用 MrDoc 发布
-
+
首页
Jenkins基于Helm的应用发布
相对于基于控制器文件部署的方式有哪些优点: - 利于形成DEVOPS标准化; - 控制器方式需要维护大量的yaml文件; - 相对于helm方式,控制器方式低效且不够灵活; 当前环境环境基于控制器文件部署: ```yaml //定义git相关数据 def git_address = "http://gitlab.kubernets.cn/demoteam/java_kubernetes.git" def git_auth = "59d88ee6-8c38-4116-948d-66d812799c63" //构建版本的名称 def tag = "latest" //Harbor私服地址 def harbor_url = "harbor-local.kubernets.cn" //Harbor的项目名称 def harbor_project_name = "demo" //Harbor的凭证 def harbor_auth = "6d2ada67-9f69-4f79-85e8-c76a0b9e0564" //启动时间 def start = new Date().format('yyyy-MM-dd HH:mm:ss') //创建一个Pod的模板,label为jenkins-slave podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [ containerTemplate( name: 'jnlp', image: "harbor-local.kubernets.cn/library/jenkins-slave-maven", ttyEnabled: true ), containerTemplate( name: 'docker', image: "harbor-local.kubernets.cn/library/docker:stable", ttyEnabled: true, command: 'cat' ), ], volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'), ], ) { node("jenkins-slave-java"){ // 第一步 stage('Pull'){ checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } stage('BuildDescription') { // 自定义设置构建历史显示的名称和描述信息 // 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法 script { //设置buildName wrap([$class: 'BuildUser']) { //修改Description buildDescription "${BUILD_USER} > ${project_name} > ${branch}" } } } // 第二步 stage('Build&Tag&Push&Deploy'){ //把选择的项目信息转为数组 def selectedProjects = "${project_name}".split(',') for(int i=0;i<selectedProjects.size();i++){ //取出每个项目的名称 def currentProjectName = selectedProjects[i]; //定义镜像名称 def imageName = "${currentProjectName}:${tag}" //定义newTag def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim() //编译,构建本地镜像 //sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile" sh "mvn clean package -Dmaven.test.skip=true" container('docker') { //镜像编译 sh "docker build -t ${imageName} ." //给镜像打标签 sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" //登录Harbor,并上传镜像 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { //登录 sh "docker login -u ${username} -p ${password} ${harbor_url}" //上传镜像 sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" } //删除本地镜像 sh "docker rmi -f ${imageName}" sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" } def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" //基于控制器的方式部署到K8S sh """ sed -i 's#\$IMAGE_NAME#${deploy_image_name}#' deployment.yaml sed -i 's#\$APP_NAME#${currentProjectName}#' deployment.yaml sed -i 's#\$APP_REPLICAS#${replicas}#' deployment.yaml sed -i 's#\$NAMESPACE#${namespaces}#' deployment.yaml sed -i 's#\$SPRINGENV#${springProfilesActive}#' deployment.yaml sed -i 's#\$PODMEMORY#${podsMem}#' deployment.yaml sed -i 's#\$PODCPU#${podsCpu}#' deployment.yaml cat deployment.yaml """ //部署到K8S kubernetesDeploy(kubeconfigId: "7ab1d5e8-0f10-4ca7-918a-f505b727c23d", configs: "deployment.yaml") } } } } ``` 基于helm的部署方式: ```yaml //定义git相关数据 def git_address = "https://gitlab.zhoumx.net/kubernetes/springdemo.git" def git_auth = "d94c267d-20be-4778-bfad-2a26f568a508" //构建版本的名称 def tag = "latest" //Harbor私服地址 def harbor_url = "harbor.zhoumx.cc" //Harbor的项目名称 def harbor_project_name = "demo" //Harbor的凭证 def harbor_auth = "e3ad80ae-89c8-428d-b8d4-4b25009fecc1" //启动时间 def start = new Date().format('yyyy-MM-dd HH:mm:ss') //创建一个Pod的模板,label为jenkins-slave podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [ containerTemplate( name: 'jnlp', image: "harbor.zhoumx.cc/library/jenkins-slave-maven:v1", ttyEnabled: true ), containerTemplate( name: 'docker', image: "harbor.zhoumx.cc/library/docker:stable", ttyEnabled: true, command: 'cat' ), containerTemplate( name: 'helm3', image: "harbor.zhoumx.cc/library/k8s-helm:v3.12.3", ttyEnabled: true, command: 'cat' ), ], volumes: [ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'), ], ) { node("jenkins-slave-java"){ // 第一步 stage('Pull'){ checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } stage('BuildDescription') { // 自定义设置构建历史显示的名称和描述信息 // 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法 script { //设置buildName wrap([$class: 'BuildUser']) { //修改Description buildDescription "${BUILD_USER} > ${project_name} > ${branch}" } } } // 第二步 stage('Build&Tag&Push&Deploy'){ //把选择的项目信息转为数组 def selectedProjects = "${project_name}".split(',') for(int i=0;i<selectedProjects.size();i++){ //取出每个项目的名称 def currentProjectName = selectedProjects[i]; //定义镜像名称 def imageName = "${currentProjectName}:${tag}" //定义newTag def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim() //编译,构建本地镜像 //sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile" sh "mvn clean package -Dmaven.test.skip=true" container('docker') { //镜像编译 sh "docker build -t ${imageName} ." //给镜像打标签 sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" //登录Harbor,并上传镜像 withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { //登录 sh "docker login -u ${username} -p ${password} ${harbor_url}" //上传镜像 sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" } //删除本地镜像 sh "docker rmi -f ${imageName}" sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" } def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}" //基于Helm的方式部署到K8S container('helm3') { withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { sh """ helm repo add --username=${username} --password=${password} devopsrepo https://harbor.zhoumx.cc/chartrepo/demo """ } //需要使用secret类型凭据 withCredentials([file(credentialsId: 'ef9b5d86-d6f6-4079-941d-7a2bfec74b33', variable: 'KUBECONFIG')]) { sh """ mkdir -p /root/.kube/ && echo $KUBECONFIG >/root/.kube/config echo "Helm应用配置信息确认..." helm upgrade --install --dry-run --debug ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \ --set replicaCount=${replicas} \ --set image.repository=${deploy_image_name} \ --set service.type=ClusterIP \ --set resources.limits.memory=${podsMem} \ --set resources.limits.cpu=${podsCpu} \ --set resources.requests.memory=${podsMem} \ --set resources.requests.cpu=${podsCpu} \ --set ingress.enabled=${isIngress} echo "应用部署..." helm upgrade --install ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \ --set replicaCount=${replicas} \ --set image.repository=${deploy_image_name} \ --set service.type=ClusterIP \ --set resources.limits.memory=${podsMem} \ --set resources.limits.cpu=${podsCpu} \ --set resources.requests.memory=${podsMem} \ --set resources.requests.cpu=${podsCpu} \ --set ingress.enabled=${isIngress} """ } } } } } } ``` **k8s-helm容器**Dockerfile文件 ```dockerfile [root@master1 /tmp/charts]# cat Dockerfile FROM alpine # Metadata LABEL org.opencontainers.image.title="lachlanevenson/k8s-helm" \ org.opencontainers.image.url="https://helm.sh/docs/" ENV HELM_LATEST_VERSION="v3.12.3" ARG TARGETARCH ENV TARGETARCH=${TARGETARCH:-amd64} RUN apk add --update ca-certificates \ && apk add --update -t deps wget git openssl bash \ && wget -q https://get.helm.sh/helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \ && tar -xf helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \ && mv linux-${TARGETARCH}/helm /usr/local/bin \ && apk del --purge deps \ && rm /var/cache/apk/* \ && rm -f /helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz ENTRYPOINT ["helm"] CMD ["help"] ``` 编译及上传 ```bash $ docker build -t k8s-helm:v3.12.3 . $ docker tag k8s-helm:v3.12.3 harbor.zhoumx.cc/library/k8s-helm:v3.12.3 $ docker push harbor.zhoumx.cc/library/k8s-helm:v3.12.3 ``` 编译结果  验证 ```bash $ helm list -n demo NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION spring-java-demo demo 1 2023-12-06 11:38:51.193517733 +0000 UTC deployed demohelm-0.2.0 1.16.0 $ kubectl get po -n demo NAME READY STATUS RESTARTS AGE spring-java-demo-844ff9f856-hjlmk 1/1 Running 0 4m5s $ kubectl get svc -n demo NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE spring-java-demo ClusterIP 10.15.36.186 <none> 8080/TCP 52s $ curl 10.15.36.186:8080/appone appOne $ curl 10.15.36.186:8080/apptwo appTwo ```
阿星
2024年1月27日 16:12
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码