提前在K8S集群中部署jenkins和gitlab应用,gitlab用于存放应K8S的资源清单Yaml文件,Jenkins用于拉取gitlab上的Yaml文件并将其部署到K8S集群中。将所有Yaml文件放在Gitlab中能够实现文件的统一管理和版本记录,能够方便查看管理员们的更新 *** 作,配置动态的Jenkins Slave 来执行任务,完成任务即释放,也不会一直暂用资源。
Gitlab代码仓库为了方便管理和记录,将部署应用的Yaml文件都存放在gitlab库中,在Gitlab中新建一个群组名为kubernetes,该群组下的项目以应用名称命名,每个项目下存放各个应用的部署文件
如下项目Prometheus中存放的就是部署Prometheus的所有Yaml
Jenkins 构建流水线 一、配置 Jenkins Slave配置 Jenkins,让他能够动态的生成 Slave 的 Pod,
第 1 步. 安装Kubernetes插件, 点击 Manage Jenkins -> Manage Plugins -> Available -> Kubernetes 勾选安装即可
第 2 步. 安装完毕后,点击Manage Jenkins -> Node Manage -> Configure Clouds 配置Kubernetes集群,首先配置连接 Kubernetes APIServer 的地址,由于我们的 Jenkins 运行在 Kubernetes 集群中,所以可以使用 Service 的 DNS 形式进行连接(https://kubernetes.default.svc.cluster.local),namespace填 kube-mon,然后点击 Test Connection,如果出现 Connected to Kubernetes... 的提示信息证明 Jenkins 已经可以和 Kubernetes 系统正常通信了:
填写Jenkins URL:http://jenkins.cicd.svc.cluster.local:8080,这里的格式为:服务名.namespace.svc.cluster.local:8080,根据上面创建的 jenkins 的服务名填写,包括下面的 Jenkins 通道,默认是 50000 端口(要注意是 TCP,所以不要填写 http):
完成以上步骤保存退出
第 3 步. 构建Slave镜像,拉取代码需要用到git,部署应用到K8S需要用到kubectl,另外这里的K8S集群是EKS托管集群,kubeconfig又aws命令生成的,所以也要安装awc命令行工具。
1)编写Dockerfile:
$ ls
aws.tar.gz Dockerfile kubectl
$ cat Dockerfle
FROM centos:7
USER root
ADD aws.tar.gz /usr/local/sbin/
COPY kubectl /usr/local/sbin
RUN chmod +x /usr/local/sbin/kubectl && \
/usr/local/sbin/aws/install && \
yum -y install git && \
mkdir /root/.aws && \
yum clean all
2)构建镜像并推送到本地仓库中:
$ docker build -t slave:v1 .
$ docker push slave:v1
3)编写定义资源清单:使用上面构建好的镜像来创建slave的pod,这里的内容需要写在Pipeline的agent阶段中!!!:
apiVersion: v1
kind: Pod
spec:
nodeSelector:
kubernetes.io/hostname: ip-10-20-30-40.cn-north-1.compute.internal
volumes:
- name: kube
hostPath:
path: /root/.kube
- name: aws
hostPath:
path: /root/.aws
containers:
- name: shell
image: slave:v1
volumeMounts:
- name: kube
mountPath: /root/.kube
- name: aws
mountPath: /root/.aws
resources:
limits:
memory: 200Mi
cpu: 100m
requests:
memory: 100Mi
cpu: 80m
command:
- sleep
args:
- infinity
二、配置流水线任务
新建一个Pipeline 风格的任务,Jenkinsfile内容如下,以下Jenkinsfile的主要步骤是“下载代码”和“执行命令”:
下载代码 通过Checkout模块去拉取gitlab上的代码,这里需要用到gitlab的账号和密码,所以要提前将gitlab账号密码存到jenkins凭证中,gitlab的 url: "http://10.20.30.100/kubernetes/${params.project}.git" 这里的项目名称用变量${params.project}表示,这样就可以通过传入不同的变量来拉取不同的项目
执行命令 执行命令也用变量表示,传入不同的变量就执行不同的命令(部署或删除命令)
@Library('k8slib') _
pipeline {
agent {
kubernetes {
//定义Slave pod 的yaml
yaml '''
apiVersion: v1
kind: Pod
spec:
nodeSelector:
kubernetes.io/hostname: ip-10-20-30-40.cn-north-1.compute.internal
volumes:
- name: kube
hostPath:
path: /root/.kube
containers:
- name: shell
image: slave:v1
volumeMounts:
- name: kube
mountPath: /root/.kube
resources:
limits:
memory: 200Mi
cpu: 100m
requests:
memory: 100Mi
cpu: 80m
command:
- sleep
args:
- infinity
'''
defaultContainer 'shell'
}
}
stages {
//打印Slave pod 的hostname
stage('运行节点') {
steps {
sh 'hostname'
}
}
//下载gitlab中的yaml
stage('下载代码'){
steps{
script{
//checkout模块下载gitlab的代码,需要提前把gitlab账号密码存放在凭证中,这里的url为gitlab的项目地址
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "291e7571-3343-4177-9ee4-9d03c24cda87", url: "http://10.20.30.100/kubernetes/${params.project}.git"]]])
}
}
}
//部署或删除应用
stage('执行命令'){
steps{
script{
//env.WORKSPACE为Pipeline 内置变量,为workspace的绝对路径
sh "cd ${env.WORKSPACE} && ${params.kubectl}"
}
}
}
}
}
以上Jenkinsfile中引用变量 ${params.project} 和 ${params.kubectl},这两个变量通过参数化构建传入,配置Pipeline的参数:
参数化构建,可以选择不同的应用项目,进行不同的 *** 作(部署或删除),如下选择创建Prometheus应用,点击开始构建
创建成功!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)