关于cicd:Kubernetes中spinnaker使用二

8次阅读

共计 5550 个字符,预计需要花费 14 分钟才能阅读完成。

背景:

紧跟 Kubernetes 中 spinnaker 的应用一。实现了简略的各种 Triggers 触发器,还有 deploy Mainfest 部署一个 kubernetes 的简略流水线。这里依据理论的环境想更深刻一下流水线步骤: 参数化的构建,webhook 的触发,邮件的发送,jenkins 流水线的集成等等
首先明确一下 pipeline 是由多个 stage 组成的:

对于默认的 stage 能够参照官网:https://spinnaker.io/docs/reference/pipeline/stages/。环境次要是 kubernetes 环境这里重视于:

从一条 pipeline 开始

创立 application

创立利用 pipeline-test,Permissions权限给运维组读写执行权限(其余组权限看集体需要,这里仅用作演示)

创立流水线 pipeline

创立 pipeline 流水线 —Parameters-test1

Parameters- 对于参数化构建

筹备前提:

参数化的构建是在 Configuration 步骤的

依照罕用的常规将 Kubernetes 中 spinnaker 的应用一 中的流水线拿来做试验!

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: nginxdemo
  name: nginxdemo
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginxdemo
  template:
    metadata:
      labels:
        k8s-app: nginxdemo
      name: nginxdemo
      namespace: dev
    spec:
      containers:
        - image: 'harbor.xxxx.com/spinnaker/spinnaker-nginx-demo:1.2.4'
          imagePullPolicy: Always
          name: nginxdemo
          ports:
            - containerPort: 80
              name: web
              protocol: TCP
      imagePullSecrets:
        - name: harbor-layame

定义参数 Parameters:

定义 image 参数, 设置默认镜像 tag 为 nginx:1.18.0

deploy Mainfest

这里的 stage name 是能够自定义名称的, 间接设置 stage name 为公布利用:
Manifest Configuration

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: nginxdemo
  name: nginxdemo
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginxdemo
  template:
    metadata:
      labels:
        k8s-app: nginxdemo
      name: nginxdemo
      namespace: dev
    spec:
      containers:
        - image: '${parameters.image}'
          imagePullPolicy: Always
          name: nginxdemo
          ports:
            - containerPort: 80
              name: web
              protocol: TCP

减少 webhook stage 保留流水线


Payload 如下:当然了 也能够本人更为细节的去欠缺!

{
  "msgtype": "text",
  "text": {"content": "流水线 ${execution['name']}运行中, 运行用户 ${execution['trigger']['user']}"
  }

集群中操作

确保 dev namespace 存在(这里将存在的 deployments 删除,不便比照!)

run 流水线并验证部署后果

pipelines 界面 Start Manual Execution 抉择 Parameters-test1 流水线 image 应用默认的 nginx:1.18.0, Run

OK 后果如下:流水线状态 SUCCEEDED,微信 webhook 收到告诉,dev namespace 下 deployments 部署胜利。

减少 parameters replicas 参数

为什么抉择 relicas 正本数做例子呢?为了强调参数化部署非字符串的的数值时要将值tolnt

  replicas: '${#toInt(parameters.replicas)}'

Manifest Configuration 如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: nginxdemo
  name: nginxdemo
  namespace: dev
spec:
  replicas: '${#toInt(parameters.replicas)}'
  selector:
    matchLabels:
      k8s-app: nginxdemo
  template:
    metadata:
      labels:
        k8s-app: nginxdemo
      name: nginxdemo
      namespace: dev
    spec:
      containers:
        - image: '${parameters.image}'
          imagePullPolicy: Always
          name: nginxdemo
          ports:
            - containerPort: 80
              name: web
              protocol: TCP

running 流水线。这里为了跟上次辨别 replicas 我手动输出了 2

验证后果如下:

流水线回滚

长期回滚(疏忽没有找到)

泽阳大佬的课程下面有长期回滚的形式:

然而 1.26.6 版本貌似排版变了我找了一圈没有找到长期回滚还是间接整 主动回滚 了!

配置回滚

先说一下流水线中的 stage

Configuration 默认的是不计算在内的。公布利用 是第一个增加的那他的 id 为 0, 部署告诉 是第二个 stage 他的 id 是 1, Manual Judgment 是第三个建设的 他的 id 是 2, Undo Rollout 是最初增加的他的 id 是 3。
这个中央貌似有点很绕。stage 是从 0 开始的,依照创立 stage 的程序来的。

创立 Manual Judgment stage

人工判断 stage。减少 rollback done 选项。done 约定俗成是实现,rollback 是回滚。作为下一步 Undo Rollout 触发的条件!

Manual Judgment 回滚 stage 抉择

强调一下 Manual Judgment 的 id 是 2。所以这里的 stages2,一下表达式的含意是流水线 stages2 中 judgmentInput 是 rollback。

${execution['stages'][2].context.judgmentInput == "rollback" }


运行流水线验证:


曾经验证过了 ….. 具体集群中 pod 的 image 就不截图了。这里最须要留神的的表达式的应用!

欠缺一下线上的流水线:

拿 jenkins 中 spinnaker-nginx-demo pipeline 来搞。先说一下本人要实现的:
嗯 gitlab 触发 jenkins 打包镜像(这里从新定义镜像 tag 用工夫)。而后将参数流传给 spinnaker 触发!

git 仓库以及 jenkins 配置:

参照 jenkins Trigger 触发器,当然了这里批改了一点参数化构建减少 Dynimic Parameter(如何没有本人百度找插件) 参数。定义名字data(能够本人定义名称,集体习惯就用 data 了)!
Default Value Script 如下:

return new Date().format('yyyyMMddHHmm')

jenkins 的流水线

就将镜像的 tag 批改为了 data 其实

//Docker 镜像仓库信息
registryServer = "harbor.xxxxx.com"
projectName = "${JOB_NAME}".split('-')[0]
repoName = "${JOB_NAME}"
imageName = "${registryServer}/${projectName}/${repoName}"

//pipeline
pipeline{agent { node { label "build01"}}


  // 设置构建触发器
    triggers {
          GenericTrigger( causeString: 'Generic Cause', 
                        genericVariables: [[defaultValue: '', key:'branchName', regexpFilter:'', value: '$.ref']],         
                        printContributedVariables: true, 
                        printPostContent: true, 
                        regexpFilterExpression: '', 
                        regexpFilterText: '', 
                        silentResponse: true, 
                        token: 'spinnaker-nginx-demo')
    }


    stages{stage("CheckOut"){
            steps{
                script{
                              srcUrl = "https://gitlab.xxxx.com/zhangpeng/spinnaker-nginx-demo.git"
                              branchName = branchName - "refs/heads/"
                              currentBuild.description = "Trigger by ${branchName}"
                    println("${branchName}")
                    checkout([$class: 'GitSCM', 
                              branches: [[name: "${branchName}"]], 
                              doGenerateSubmoduleConfigurations: false, 
                              extensions: [], 
                              submoduleCfg: [], 
                              userRemoteConfigs: [[credentialsId: 'gitlab-admin-user',
                                                   url: "${srcUrl}"]]])
                }
            }
        }

        stage("Push Image"){
            steps{
                script{withCredentials([usernamePassword(credentialsId: 'harbor-admin-user', passwordVariable: 'password', usernameVariable: 'username')]) {sh """sed -i --"s/VER/${branchName}/g" app/index.html
                           docker login -u ${username} -p ${password} ${registryServer}
                           docker build -t ${imageName}:${data}  .
                           docker push ${imageName}:${data}
                           docker rmi ${imageName}:${data}

                        """
                    }
                }
            }
        }

        stage("Trigger File"){
            steps {
                script{
                    sh """
                        echo IMAGE=${imageName}:${data} >trigger.properties
                        echo ACTION=DEPLOY >> trigger.properties
                        cat trigger.properties
                    """archiveArtifacts allowEmptyArchive: true, artifacts:'trigger.properties', followSymlinks: false
                }
            }
        }

    }
}

view 一下trigger.properties

spinnaker 中的 pipeline 设置

创立 pipeline

pipline-tes t 利用(applications),中创立 spinnaker-nginx-demo pipeline,这里我间接 copy 了 Parameters-test1 的流水线

Configuration 中 Automated Triggers 配置

jenkins 触发器并增加Property File(jenkins 中的制品)trigger.properties(留神别多复制了空格)


留神:Parameters配置下删除了 image 参数 然而保留了 replicas 参数。主动触发默认参数仍是 2,故前面的正本数量是 2。

Deploy (Manifest) Configuration(公布利用 stage 批改)

image: "${trigger['properties']['IMAGE']}"

Undo Rollout (Manifest)回滚利用的配置

git 文件批改文件触发 and jenkins 联动


jenkins 构建版本79

登陆 spinnakerweb 验证

先抉择一下 done

就是上面这样的跳过了回滚的 stage

验证镜像

rollback 回滚验证

再触发一次 抉择 rollback


这里 spinnaker 显示 jenkins 构建 80 略慢 …….

流水线 webhook 的信息


当然这里也能够把动作,构建参数个性化自定义一下?这里只是抛砖引玉简略的跑通。后续有好玩的能够更输出分享

后记

  1. 流水线 stage 在管道工具中的的 id,这个中央肯定要留神一下
  2. 非字符串参数的 toInt
  3. 参数中偷懒复制名词的时候的空格
  4. 还一样比拟坑的 …. 我重装了一遍 spinnaker 练手。设置内部 redis 的时候配置文件携程了 redis.yaml 所以始终没有失效 …. 找了良久的问题最初才发现,yaml vs yml切记。
  5. 只学习简略实用的性能,简单的就不去钻研了。深入研究请参考泽阳老师大佬的 spinnaker 课程。特地鸣谢泽阳大佬。jenkins spinnaker 课程都是跟大佬的步调来的!泽阳大佬的 devops 云学堂。

正文完
 0