服务部署

本节通过jenkins来进行简单的服务部署到k8s演示。

准备工作

  • k8s集群安装
  • gitlab环境安装
  • jenkins环境安装
  • redis&mysql&nginx&etcd安装
  • goctl安装

[!TIP] goctl确保k8s每个node节点上都有

以上环境安装请自行google,这里不做篇幅介绍。

服务部署

1、gitlab代码仓库相关准备

1.1、添加SSH Key

进入gitlab,点击用户中心,找到Settings,在左侧找到SSH Keystab ssh key

  • 1、在jenkins所在机器上查看公钥
  1. $ cat ~/.ssh/id_rsa.pub
  • 2、如果没有,则需要生成,如果存在,请跳转到第3步
  1. $ ssh-keygen -t rsa -b 2048 -C "email@example.com"

“email@example.com” 可以替换为自己的邮箱

完成生成后,重复第一步操作

  • 3、将公钥添加到gitlab中

1.2、上传代码到gitlab仓库

新建工程go-zero-demo并上传代码,这里不做细节描述。

2、jenkins

2.1、添加凭据

  • 查看jenkins所在机器的私钥,与前面gitlab公钥对应
  1. $ cat id_rsa
  • 进入jenkins,依次点击Manage Jenkins-> Manage Credentials credentials

  • 进入全局凭据页面,添加凭据,Username是一个标识,后面添加pipeline你知道这个标识是代表gitlab的凭据就行,Private Key`即上面获取的私钥 jenkins-add-credentials

2.2、 添加全局变量

进入Manage Jenkins->Configure System,滑动到全局属性条目,添加docker私有仓库相关信息,如图为docker用户名docker用户密码docker私有仓库地址

[!TIP] 这里我使用的私有仓库,如果没有云厂商提供的私有仓库使用,可以自行搭建一个私有仓库,这里就不赘述了,大家自行google。

2.3、配置git

进入Manage Jenkins->Global Tool Configureation,找到Git条目,填写jenkins所在机器git可执行文件所在path,如果没有的话,需要在jenkins插件管理中下载Git插件。 jenkins-git

jenkins-configure

2.4、 添加一个Pipeline

pipeline用于构建项目,从gitlab拉取代码->生成Dockerfile->部署到k8s均在这个步骤去做,这里是演示环境,为了保证部署流程顺利, 需要将jenkins安装在和k8s集群的其中过一个节点所在机器上,我这里安装在master上的。

  • 获取凭据id 进入凭据页面,找到Username为gitlab的凭据id jenkins-credentials-id

  • 进入jenkins首页,点击新建Item,名称为user jenkins-add-item

  • 查看项目git地址 gitlab-git-url

  • 添加服务类型Choice Parameter,在General中勾选This project is parameterized,点击添加参数选择Choice Parameter,按照图中添加选择的值常量(api、rpc)及接收值的变量(type),后续在Pipeline script中会用到。 jenkins-choice-parameter

  • 配置user,在user配置页面,向下滑动找到Pipeline script,填写脚本内容

  1. pipeline {
  2. agent any
  3. parameters {
  4. gitParameter name: 'branch',
  5. type: 'PT_BRANCH',
  6. branchFilter: 'origin/(.*)',
  7. defaultValue: 'master',
  8. selectedValue: 'DEFAULT',
  9. sortMode: 'ASCENDING_SMART',
  10. description: '选择需要构建的分支'
  11. }
  12. stages {
  13. stage('服务信息') {
  14. steps {
  15. sh 'echo 分支:$branch'
  16. sh 'echo 构建服务类型:${JOB_NAME}-$type'
  17. }
  18. }
  19. stage('check out') {
  20. steps {
  21. checkout([$class: 'GitSCM',
  22. branches: [[name: '$branch']],
  23. doGenerateSubmoduleConfigurations: false,
  24. extensions: [],
  25. submoduleCfg: [],
  26. userRemoteConfigs: [[credentialsId: '${credentialsId}', url: '${gitUrl}']]])
  27. }
  28. }
  29. stage('获取commit_id') {
  30. steps {
  31. echo '获取commit_id'
  32. git credentialsId: '${credentialsId}', url: '${gitUrl}'
  33. script {
  34. env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
  35. }
  36. }
  37. }
  38. stage('goctl版本检测') {
  39. steps{
  40. sh '/usr/local/bin/goctl -v'
  41. }
  42. }
  43. stage('Dockerfile Build') {
  44. steps{
  45. sh '/usr/local/bin/goctl docker -go service/${JOB_NAME}/${type}/${JOB_NAME}.go'
  46. script{
  47. env.image = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}:${commit_id}').trim()
  48. }
  49. sh 'echo 镜像名称:${image}'
  50. sh 'docker build -t ${image} .'
  51. }
  52. }
  53. stage('上传到镜像仓库') {
  54. steps{
  55. sh '/root/dockerlogin.sh'
  56. sh 'docker tag ${image} ${dockerServer}/${image}'
  57. sh 'docker push ${dockerServer}/${image}'
  58. }
  59. }
  60. stage('部署到k8s') {
  61. steps{
  62. script{
  63. env.deployYaml = sh(returnStdout: true, script: 'echo ${JOB_NAME}-${type}-deploy.yaml').trim()
  64. env.port=sh(returnStdout: true, script: '/root/port.sh ${JOB_NAME}-${type}').trim()
  65. }
  66. sh 'echo ${port}'
  67. sh 'rm -f ${deployYaml}'
  68. 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}'
  69. sh '/usr/bin/kubectl apply -f ${deployYaml}'
  70. }
  71. }
  72. stage('Clean') {
  73. steps{
  74. sh 'docker rmi -f ${image}'
  75. sh 'docker rmi -f ${dockerServer}/${image}'
  76. cleanWs notFailBuild: true
  77. }
  78. }
  79. }
  80. }

[!TIP] ${credentialsId}要替换为你的具体凭据值,即【添加凭据】模块中的一串字符串,${gitUrl}需要替换为你代码的git仓库地址,其他的${xxx}形式的变量无需修改,保持原样即可。 user-pipepine-script

port.sh参考内容如下

  1. case $1 in
  2. "user-api") echo 1000
  3. ;;
  4. "user-rpc") echo 1001
  5. ;;
  6. "course-api") echo 1002
  7. ;;
  8. "course-rpc") echo 1003
  9. ;;
  10. "selection-api") echo 1004
  11. esac

其中dockerlogin.sh内容

  1. #!/bin/bash
  2. docker login --username=$docker-user --password=$docker-pass $docker-server
  • $docker-user: docker登录用户名
  • $docker-pass: docker登录用户密码
  • $docker-server: docker私有地址

查看pipeline

build with parameters build with parameters

查看k8s服务

k8s01

猜你想看