Jenkins使用k8s部署应用

news/2025/2/10 23:41:52/

1、jenkins在k8s内部署(请参考其他人的文章)

2、jenkins安装kubenents相关插件

3、配置k8s云

        非常重要,目的是实现jenkins可以远程调用k8s进行部署,并可实现安装jenkins-slave进行构建。使得不再依赖jenkins单机能力进行构建,比较适合一定规模的公司。

 插件安装后,打开jenkins,点击系统管理-->系统配置-->Clouds,点击新增一个kubernetes。

具体配置见如下:

3.1 首先配置K8S地址

 

3.2 为K8S云创建Pod Templates

目的是在jenkins构建的时候,可以自动在K8S内创建一个POD服务于本次构建。

以JAVA为例,构建时需要使用maven并docker构建,然后连接至K8S Master进行远程发布。

 在POD容器列表中放了2个Docker镜像,一个是Maven负责java的build,一个是jnlp创建一个jenkins的slave。

 

3.3  挂载存储卷

3.3.1、主要是把maven的repository挂载到宿主机上,以方便多次构建后复用。 

3.3.2、宿主机上安装了docker,把docker命令挂载到K8S的POD内,使得POD具备了

docker in  docker的能力,如此就可以在该POD内进行docker构建。

3.3.3、宿主机一般都是被K8S控制的Node,因此一般都装有kubernets,因此可以把kubectl命令关在到POD中,使得POD具备执行kubectl命令能力,以控制K8S。

 

 请用如下代码给k8s内的jenkins账号授权

---
apiVersion: v1
kind: ServiceAccount
metadata:name: jenkinsnamespace: zo-jenkins
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: jenkinsnamespace: zo-jenkins
rules:- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/portforward"]verbs: ["*"]- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","watch"]- apiGroups: [""]resources: ["secrets"]verbs: ["get"]- apiGroups: ["apps"]resources: ["deployments"]verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: jenkinsnamespace: zo-jenkins
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: jenkins
subjects:- kind: ServiceAccountname: jenkinsnamespace: zo-jenkins---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: jenkinsClusterRolenamespace: zo-jenkins
rules:- apiGroups: [""]resources: ["pods"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/exec"]verbs: ["create","delete","get","list","patch","update","watch"]- apiGroups: [""]resources: ["pods/log"]verbs: ["get","list","watch"]- apiGroups: [""]resources: ["secrets"]verbs: ["get"]- apiGroups: [ "apps" ]resources: ["deployments"]verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: jenkinsClusterRuleBinding
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: jenkinsClusterRole
subjects:- kind: ServiceAccountname: jenkinsnamespace: zo-jenkins

4、JAVA应用中增加pipeline脚本

#!groovy
pipeline {agent {kubernetes {cloud "k8s-deploy"  //选择名字是kubernetes1的cloud,这里不要修改label "jenkins-slave"//yamlFile ''  //jenkins-slave部署文件位置,内容不要修改}}stages {stage('初始化环境') {steps {script {env.APP_NAME = "report-server"   //修改为自己的应用名称env.APP_CODE = "https://codeup.aliyun.com/xxxxxxx/outsourced/excleToReport/xxx-xxxx.git"env.CODE_BRANCH = "master"     //修改为实际部署的分支env.DOCKER_IMAGE_URL = "registry.cn-hangzhou.aliyuncs.com/xx-xx/xx-xxx"  // 修改DOCKER镜像地址env.DOCKER_TAG = "1.0.0"env.K8S_NAME_SPACE = "zo-home-prd" // 修改应用在K8S内的实际部署的命名空间}}}stage('拉取代码') {steps {echo "1.Git Clone Code"git branch: "$CODE_BRANCH", credentialsId: 'zo-git-yun', url: "$APP_CODE"}}stage('maven构建') {steps {container('maven') {sh 'mvn -s jenkins/settings.xml clean package -e -U -Dmaven.test.skip=true -Dautoconfig.skip'}}}stage('docker镜像构建') {steps {container('maven') { // maven容器确保与宿主机的docker实现docker in docker的能力sh 'docker build -t $APP_NAME:$DOCKER_TAG .'sh 'docker tag $APP_NAME:$DOCKER_TAG $DOCKER_IMAGE_URL:$DOCKER_TAG'sh 'docker push $DOCKER_IMAGE_URL:$DOCKER_TAG'}}}//    部署到K8sstage('K8S部署-开发环境') {steps {container('jenkins-jnlp-slave') {withKubeConfig(serverUrl: 'https://192.168.10.200:6443') {// 这里配置K8S Master的API地址echo 'begin k8s deploy!'sh 'chmod 744 k8s/home-prd/deployment.sh'sh 'k8s/home-prd/deployment.sh' // 执行部署// --record 用作记录滚动更新的信息, 后面方便版本回退//sh 'kubectl set image deployment/$APP_NAME $APP_NAME=$IMAGE_URL --namespace $NAME_SPACE --record'}}}}}options {buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5'))}
}

 


http://www.ppmy.cn/news/69520.html

相关文章

kafka3.x详解

kafka 一、简介1.1、场景选择,与其他mq相比1.2、应用场景1.2.1、流量消峰1.2.2、解耦1.2.3、异步通讯 1.3、消息队列的两种模式1.3.1、点对点模式1.3.2、发布/订阅模式 1.4、Kafka 基础架构 二、安装部署2.1、安装包方式2.2、docker安装方式2.3、docker安装kafka-ma…

操作系统——文件管理

0.关注博主有更多知识 操作系统入门知识合集 目录 9.1文件系统概念 思考题: 9.2文件的物理结构 思考题: 9.3文件存储和目录 9.1文件系统概念 文件的定义: 文件是计算机信息存取的一种重要组织形式,文件由若干信息项有序构…

SpringSecurity框架学习与使用

SpringSecurity框架学习与使用 SpringSecurity学习SpringSecurity入门SpringSecurity深入认证授权自定义授权失败页面权限注解SecuredPreAuthorizePostAuthorizePostFilterPreFilter 参考 SpringSecurity学习 SpringSecurity入门 引入相关的依赖,SpringBoot的版本…

Salesforce许可证和版本有什么区别,购买帐号时应该如何选择?

Salesforce许可证分配给特定用户,授予他们访问Salesforce产品和功能的权限。Salesforce版本和许可证是不同的概念,但极易混淆。 Salesforce版本:这是对组织购买的Salesforce产品和功能的访问权限。大致可分为Essentials、Professional、Ente…

【Android学习专题】java基本语法和概念(学习记录)

学习记录来自菜鸟教程 Java 变量 Java 中主要有如下几种类型的变量 局部变量 在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁类变量(静态变量) 类变量也声…

【2023】使用docker方式部署redis

使用Docker方式安装Redis 提前部署docker环境,这一点不多说,请参考docker安装文章,本文安装Redis版本为6.0 1.下载要使用的Redis镜像 可以使用docker pull redis命令获取镜像,默认为最新版。也可以使用docker pull redis:标签下…

深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别

TypeScript 是一种强类型的 JavaScript 超集,它为 JavaScript 提供了静态类型系统。在 TypeScript 中,我们可以使用 type、interface 和 class 为数据定义类型。本文将重点介绍 type 的作用以及它与 interface 和 class 的区别。 type type 是 TypeScr…

如何使用 PyTorch 进行半精度、混(合)精度训练

https://featurize.cn/notebooks/368cbc81-2b27-4036-98a1-d77589b1f0c4 nvidia深度学习加速库apex简单介绍 NVIDIA深度学习加速库Apex是一个用于PyTorch的开源混合精度训练工具包,旨在加速训练并减少内存使用。Apex提供了许多用于混合精度训练的工具,…