Pipeline 部署K8S应用

Pipeline 部署K8S应用,第1张

概述

提前在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应用,点击开始构建

 创建成功!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/726622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存