8 - webhooks


警告:目前本工具属于实验性,仅适用于测试或开发环境。

一、简述

本工具基于https://github.com/adnanh/webhook.git定制, Dockerfile地址: https://github.com/xiaoluhong/docker-webhook.git

镜像下载地址: registry.cn-shenzhen.aliyuncs.com/rancher/webhook:latest

二、准备配置文件

建议把webhooks作为系统服务运行在system项目下

  • 登录Rancher UI切换到system项目下,然后依次进入 资源\配置映射,点击页面右上角的添加配置映射
  • 修改模板中对应的参数:

    • <webhooks_id>: 此webhooks-id具有唯一性,不能重复。建议设置为服务名,比如cnrancher_website
    • <token>: 设置一个token值用于匹配校验;
    • <workload>: 指定一个应用,书写格式为类型/Workload,例如: deployment/webhooks、daemonset/webhooks
    • <namespaces>: 指定服务所在的命名空间;
    • <container>: 指定容器名称,对于一个有多容器的Pod,升级时需要指定容器名称;
    • <MAIL_TO>: 收件人邮箱地址;
    • <NET_TYPE>: 如果阿里云的镜像仓库,可在url中添加net_type指定网络类型: 1.公共网络: 不指定默认为公共网络,2.专有网络: net_type=vpc,3.经典网络: net_type=internal
  1. [
  2. {
  3. "id": "<webhooks-id>",
  4. "execute-command": "/webhooks.sh",
  5. "command-working-directory": "/home",
  6. "response-message": "I got the payload!",
  7. "include-command-output-in-response": true,
  8. "include-command-output-in-response-on-error": true,
  9. "trigger-rule-mismatch-http-response-code": 500,
  10. "response-headers":
  11. [
  12. {
  13. "name": "Access-Control-Allow-Origin",
  14. "value": "*"
  15. }
  16. ],
  17. "pass-arguments-to-command":
  18. [
  19. {
  20. "source": "entire-payload"
  21. }
  22. ],
  23. "pass-environment-to-command":
  24. [
  25. {
  26. "envname": "APP_NS",
  27. "source": "url",
  28. "name": "ns"
  29. },
  30. {
  31. "envname": "APP_WORKLOAD",
  32. "source": "url",
  33. "name": "workload"
  34. },
  35. {
  36. "envname": "APP_CONTAINER",
  37. "source": "url",
  38. "name": "container"
  39. },
  40. {
  41. "envname": "REPO_TYPE",
  42. "source": "url",
  43. "name": "repo_type"
  44. },
  45. {
  46. "envname": "NET_TYPE",
  47. "source": "url",
  48. "name": "net_type"
  49. },
  50. {
  51. "envname": "MAIL_TO",
  52. "source": "string",
  53. "name": "<MAIL_TO>"
  54. }
  55. ],
  56. "trigger-rule":
  57. {
  58. "and":
  59. [
  60. {
  61. "match":
  62. {
  63. "type": "value",
  64. "value": "<token>",
  65. "parameter":
  66. {
  67. "source": "url",
  68. "name": "token"
  69. }
  70. }
  71. },
  72. {
  73. "match":
  74. {
  75. "type": "value",
  76. "value": "<namespaces>",
  77. "parameter":
  78. {
  79. "source": "url",
  80. "name": "ns"
  81. }
  82. }
  83. },
  84. {
  85. "match":
  86. {
  87. "type": "value",
  88. "value": "<workload>",
  89. "parameter":
  90. {
  91. "source": "url",
  92. "name": "workload"
  93. }
  94. }
  95. },
  96. {
  97. "match":
  98. {
  99. "type": "value",
  100. "value": "<container>",
  101. "parameter":
  102. {
  103. "source": "url",
  104. "name": "container"
  105. }
  106. }
  107. }
  108. ]
  109. }
  110. }
  111. ]
  • 填写添加配置映射参数,其中:

    • 名称: 可以随意填写;
    • : 以.json结尾的文件名,比如cnrancher.json;
    • : 设置为上一步中修改的配置文件;
    • 如果有多个服务,可以添加多个键值对,如图:image-20190314173250612

三、webhooks安装

依次点击 system项目\工作负载\工作负载,点击右侧部署服务。

  • 配置服务名称和镜像

registry.cn-shenzhen.aliyuncs.com/rancher/webhook

image-20190314173915552

  • 配置环境变量

WEBHOOK_CMD=-template: 系统命令; MAIL_SMTP_PORT=: 邮箱SMTP服务器端口; MAIL_SMTP_SERVER=: 邮箱SMTP服务器地址; MAIL_FROM= : 发件人邮箱; MAIL_PASSWORD=: 发件人邮箱密码(需要base64加密: echo <密码> | base64 ); MAIL_CACERT=: 自签名CA证书,邮箱服务器采用自签名ssl证书时使用(需要base64加密: cat | base64 ); MAIL_TLS_CHECK=: 是否开启TLS认证(false/true,默认true);

  • 常用邮箱配置(qq,163等)

image-20190315232842668

  • 自签名证书邮箱服务器

image-20190315233201822

  • 不启用TLS认证邮箱

image-20190315233320815

  • 配置健康检查

端口: 9000

image-20190314174424562

  • 配置数据卷

    • 选择配置映射卷image-20190314174524973

    • 配置映射名: 选择前面创建的配置映射;

    • 容器路径: /etc/webhook/source;

    • 其他参数保持默认;

image-20190314174834334

  • 最后点击启动,启动后查看日志,可以看到当前监听的服务

image-20190314175308608

  • 设置serviceaccounts

这一步相对比较重要,webhooks服务需要serviceaccounts才可以正常的与K8S通信。因为目前Rancher UI不支持设置serviceaccounts,所以需要编辑yaml文件来配置serviceaccounts。为了方便,这里复用了rancher组件使用的serviceaccounts账号cattle,具有集群管理员角色,您也可以根据需要定制serviceaccounts角色。

  • 如图,选择 查看/编辑YAML

image-20190314212013510

  • securityContext: {} 下边添加serviceAccount: cattleserviceAccountName: cattle

image-20190314212124745

  • 最后点击保存

四、webhooks触发地址

  1. http(s)://<webhooks_url>/hooks/\
  2. <webhooks_id>?\
  3. token=<token>&\
  4. ns=<namespaces>&\
  5. workload=<workload>&\
  6. container=<container>&\
  7. repo_type=<repo_type>
  • 如果是阿里云的镜像仓库,可在url中添加net_type指定网络类型:
  • 公共网络: 不指定默认为公共网络
  • 专有网络: net_type=vpc
  • 经典网络: net_type=internal其中<webhooks_id>、<namespaces>、<workload>、<container>对应模板中的参数,<repo_type>支持:aliyundockerhubcustom

五、配置仓库触发

aliyun

  • 浏览器访问https://cr.console.aliyun.com进入容器镜像服务管理界面;

  • 选择一个需要添加自动触发功能的仓库,点击右侧的管理;

  • 在切换的新窗口左上角选择触发器;

image-20190314181124857

  • webhooks触发消息示例:
  1. {
  2. "push_data": {
  3. "digest": "sha256:f66daa126e9fcac4e2d0b7131e78ffd5d8e0012a1e6cb150a953e5be8da5d 980",
  4. "pushed_at": "2019-03-13 23:38:07",
  5. "tag": "latest"
  6. },
  7. "repository": {
  8. "date_created": "2019-03-05 13:47:43",
  9. "name": "webhook",
  10. "namespace": "rancher_cn",
  11. "region": "cn-shanghai",
  12. "repo_authentication_type": "NO_CERTIFIED",
  13. "repo_full_name": "rancher_cn/webhook",
  14. "repo_origin_type": "NO_CERTIFIED",
  15. "repo_type": "PUBLIC"
  16. }
  17. }

Docker

image-20190314182034766

  • 填写相关参数,点击右侧的加号;

image-20190314182530479

  • webhooks触发消息示例:
  1. {
  2. "push_data": {
  3. "pushed_at": 1552553567,
  4. "images": [],
  5. "tag": "latest",
  6. "pusher": "hongxiaolu"
  7. },
  8. "callback_url": "",
  9. "repository": {
  10. "status": "Active",
  11. "description": "iperf3",
  12. "is_trusted": true,
  13. "full_description": "# iperf3\niperf3\n",
  14. "repo_url": "",
  15. "owner": "hongxiaolu",
  16. "is_official": false,
  17. "is_private": false,
  18. "name": "iperf3",
  19. "namespace": "hongxiaolu",
  20. "star_count": 0,
  21. "comment_count": 0,
  22. "date_created": 1540013520,
  23. "dockerfile": "# ",
  24. "repo_name": "hongxiaolu/iperf3"
  25. }
  26. }

自定义webhooks

如果是使用Jenkins自定义构建镜像,可以设置repo_type=custom

在Jenkins构建task中,在镜像push操作后增加一个执行shell命令的步骤。这个操作主要是在镜像成功推送到镜像仓库后发出POST消息去触发webhooks,这步中需要把上一步推送的镜像仓库地址,镜像命名空间,镜像名,以及镜像tag作为变量传递到这一步,这样在发送POST消息才可以把相关的镜像信息传递给webhooks,从而触发服务升级。

示例POST消息:

  1. curl -X POST \
  2. 'http(s)://<webhooks_url>/hooks/<webhooks_id>?\
  3. token=<token>&\
  4. ns=<namespaces>&\
  5. workload=<workload>&\
  6. container=<container>&\
  7. repo_type=custom' \
  8. -H 'Content-Type: application/json' \
  9. -H 'cache-control: no-cache' \
  10. -d '{
  11. "push_data": {
  12. "tag": "${images_tag}"
  13. },
  14. "repository": {
  15. "repo_url": ${images_repo_url},
  16. "name": "${images_name}",
  17. "namespace": "${images_namespace}"
  18. }
  19. }'

触发webhooks

  • 配置完以上参数,提交代码到git仓库后将会自动触发阿里云仓库或者dockerhub的自动构建,创建自动构建方法请自行查阅相关文档。image-20190314212701691

image-20190314213123621

  • 当镜像构建完成并推送到仓库后,会触发webhooks消息到预先配置的地址,从触发器也可以查看历史记录。image-20190314213215303

  • webhooks服务收到消息后,会马上触发服务的升级。查看webhooks服务的日志,可以看到已经成功升级。image-20190314213051682

image-20190314205425237