go-zero 服務(wù)部署

2022-04-21 11:20 更新

服務(wù)部署

本節(jié)通過jenkins來進(jìn)行簡(jiǎn)單的服務(wù)部署到k8s演示。

準(zhǔn)備工作

  • k8s集群安裝
  • gitlab環(huán)境安裝
  • jenkins環(huán)境安裝
  • redis&mysql&nginx&etcd安裝
  • goctl安裝

服務(wù)部署

1、gitlab代碼倉(cāng)庫(kù)相關(guān)準(zhǔn)備

1.1、添加SSH Key

進(jìn)入gitlab,點(diǎn)擊用戶中心,找到Settings,在左側(cè)找到SSH Keystab


  • 1、在jenkins所在機(jī)器上查看公鑰
$ cat ~/.ssh/id_rsa.pub
  • 2、如果沒有,則需要生成,如果存在,請(qǐng)?zhí)D(zhuǎn)到第3步
$ ssh-keygen -t rsa -b 2048 -C "email@example.com"
"email@example.com" 可以替換為自己的郵箱
完成生成后,重復(fù)第一步操作
  • 3、將公鑰添加到gitlab中

1.2、上傳代碼到gitlab倉(cāng)庫(kù)

新建工程go-zero-demo并上傳代碼,這里不做細(xì)節(jié)描述。

2、jenkins

2.1、添加憑據(jù)

  • 查看jenkins所在機(jī)器的私鑰,與前面gitlab公鑰對(duì)應(yīng)
$ cat id_rsa
  • 進(jìn)入jenkins,依次點(diǎn)擊Manage Jenkins-> Manage Credentials


  • 進(jìn)入全局憑據(jù)頁(yè)面,添加憑據(jù),Username是一個(gè)標(biāo)識(shí),后面添加pipeline你知道這個(gè)標(biāo)識(shí)是代表gitlab的憑據(jù)就行,Private Key`即上面獲取的私鑰


2.2、 添加全局變量

進(jìn)入Manage Jenkins->Configure System,滑動(dòng)到全局屬性條目,添加docker私有倉(cāng)庫(kù)相關(guān)信息,如圖為docker用戶名、docker用戶密碼、docker私有倉(cāng)庫(kù)地址


  • docker_user 修改為你的docker用戶名
  • docker_pass 修改為你的docker用戶密碼
  • docker_server 修改為你的docker服務(wù)器地址
  • 這里我使用的私有倉(cāng)庫(kù),如果沒有云廠商提供的私有倉(cāng)庫(kù)使用,可以自行搭建一個(gè)私有倉(cāng)庫(kù),這里就不贅述了。

2.3、配置git

進(jìn)入Manage Jenkins->Global Tool Configureation,找到Git條目,填寫jenkins所在機(jī)器git可執(zhí)行文件所在path,如果沒有的話,需要在jenkins插件管理中下載Git插件。



2.4、 添加一個(gè)Pipeline

pipeline用于構(gòu)建項(xiàng)目,從gitlab拉取代碼->生成Dockerfile->部署到k8s均在這個(gè)步驟去做,這里是演示環(huán)境,為了保證部署流程順利, 需要將jenkins安裝在和k8s集群的其中過一個(gè)節(jié)點(diǎn)所在機(jī)器上,我這里安裝在master上的。

  • 獲取憑據(jù)id 進(jìn)入憑據(jù)頁(yè)面,找到Username為gitlab的憑據(jù)id


  • 進(jìn)入jenkins首頁(yè),點(diǎn)擊新建Item,名稱為user


  • 查看項(xiàng)目git地址


  • 添加服務(wù)類型Choice Parameter,在General中勾選This project is parameterized,點(diǎn)擊添加參數(shù)選擇Choice Parameter,按照?qǐng)D中添加選擇的值常量(api、rpc)及接收值的變量(type),后續(xù)在Pipeline script中會(huì)用到。


  • 配置user,在user配置頁(yè)面,向下滑動(dòng)找到Pipeline script,填寫腳本內(nèi)容
pipeline {
  agent any
  parameters {
      gitParameter name: 'branch', 
      type: 'PT_BRANCH',
      branchFilter: 'origin/(.*)',
      defaultValue: 'master',
      selectedValue: 'DEFAULT',
      sortMode: 'ASCENDING_SMART',
      description: '選擇需要構(gòu)建的分支'
  }

  stages {
      stage('服務(wù)信息')    {
          steps {
              sh 'echo 分支:$branch'
              sh 'echo 構(gòu)建服務(wù)類型:${JOB_NAME}-$type'
          }
      }


      stage('check out') {
          steps {
              checkout([$class: 'GitSCM', 
              branches: [[name: '$branch']],
              doGenerateSubmoduleConfigurations: false, 
              extensions: [], 
              submoduleCfg: [],
              userRemoteConfigs: [[credentialsId: '${credentialsId}', url: '${gitUrl}']]])
          }   
      }

      stage('獲取commit_id') {
          steps {
              echo '獲取commit_id'
              git credentialsId: '${credentialsId}', url: '${gitUrl}'
              script {
                  env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
              }
          }
      }


      stage('goctl版本檢測(cè)') {
          steps{
              sh '/usr/local/bin/goctl -v'
          }
      }

      stage('Dockerfile Build') {
          steps{
                 sh '/usr/local/bin/goctl docker -go service/${JOB_NAME}/${type}/${JOB_NAME}.go'
                 script{
                     env.image = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}:${commit_id}').trim()
                 }
                 sh 'echo 鏡像名稱:${image}'
                 sh 'docker build -t ${image} .'
          }
      }

      stage('上傳到鏡像倉(cāng)庫(kù)') {
          steps{
              sh '/root/dockerlogin.sh'
              sh 'docker tag  ${image} ${dockerServer}/${image}'
              sh 'docker push ${dockerServer}/${image}'
          }
      }

      stage('部署到k8s') {
          steps{
              script{
                  env.deployYaml = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}-deploy.yaml').trim()
                  env.port=sh(returnStdout: true, script: '/root/port.sh ${JOB_NAME}-${type}').trim()
              }

              sh 'echo ${port}'

              sh 'rm -f ${deployYaml}'
              sh '/usr/local/bin/goctl kube deploy -secret dockersecret -replicas 2 -nodePort 3${port} -requestCpu 200 -requestMem 50 -limitCpu 300 -limitMem 100 -name ${JOB_NAME}-${type} -namespace hey-go-zero -image ${dockerServer}/${image} -o ${deployYaml} -port ${port}'
              sh '/usr/bin/kubectl apply -f ${deployYaml}'
          }
      }

      stage('Clean') {
          steps{
              sh 'docker rmi -f ${image}'
              sh 'docker rmi -f ${dockerServer}/${image}'
              cleanWs notFailBuild: true
          }
      }
  }
}

${credentialsId}要替換為你的具體憑據(jù)值,即【添加憑據(jù)】模塊中的一串字符串,${gitUrl}需要替換為你代碼的git倉(cāng)庫(kù)地址,其他的${xxx}形式的變量無需修改,保持原樣即可。


port.sh參考內(nèi)容如下

case $1 in
"user-api") echo 1000
;;
"user-rpc") echo 1001
;;
"course-api") echo 1002
;;
"course-rpc") echo 1003
;;
"selection-api") echo 1004
esac

其中dockerlogin.sh內(nèi)容

#!/bin/bash
docker login --username=$docker-user --password=$docker-pass $docker-server
  • $docker-user: docker登錄用戶名
  • $docker-pass: docker登錄用戶密碼
  • $docker-server: docker私有地址

查看pipeline



查看k8s服務(wù)



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)