基于 kubernetes、jenkins、etcd 的高效构建工具

2017-04-24 10:01:04 +08:00
 EthanLiao

Kubernetes 是 Google 开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用。下面我将在 macos 上搭建 minikube 与 kubectl 的 k8s 环境。

Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

Etcd 是一个高可用的键值存储系统,主要用于共享配置和服务发现。下面利用 etcd 作为旁路系统,主要用来实现状态变更的定制化操作与配置同步。

环境搭建

  • mac os 10.12.3
  • docker <sup id="fnref:docker">1</sup>
  • jenkins <sup id="fnref:jenkins">2</sup>
  • registry <sup id="fnref:registry">3</sup>
  • minikube && kubectl <sup id="fnref:minikube">4</sup>
  • etcd <sup id="fnref:etcd">5</sup>

在 k8s 中创建应用

此时应用所使用的镜像为app-k8stest:2

稍等片刻直到应用启动完毕!

输入上述 host 可以打开应用。

新建并配置 jinkins 工作空间

构建的代码仓库为git@github.com:mythsumm/k8s-test.git/test 构建时需执行build.sh这个 shell 脚本,主要有三个步骤。 1. 用新提交的代码构建新镜像。 2. 将镜像打上标签并推到 registry 服务中。 3. 将容器中的镜像动态更新为刚 build 好的 registry 服务中的镜像。

#!/usr/bin/env sh

JOB_NAME=${JOB_NAME:-"k8stest"}
BUILD_NUMBER=${BUILD_NUMBER:-1}

REGISTRY_URL=${REGISTRY_URL:-"127.0.0.1:5000/liaotao/"}

#docker build
echo execute : docker build -t app-${JOB_NAME}:${BUILD_NUMBER} .
docker build -t app-${JOB_NAME}:${BUILD_NUMBER} .

#docker tag
echo execute : docker tag app-${JOB_NAME}:${BUILD_NUMBER} ${REGISTRY_URL}app-${JOB_NAME}:${BUILD_NUMBER}
docker tag app-${JOB_NAME}:${BUILD_NUMBER} ${REGISTRY_URL}app-${JOB_NAME}:${BUILD_NUMBER}

#docker push
echo execute : docker push ${REGISTRY_URL}app-${JOB_NAME}:${BUILD_NUMBER}
docker push ${REGISTRY_URL}app-${JOB_NAME}:${BUILD_NUMBER}

#Update existing container image(s) of resources
/usr/local/bin/kubectl set image deployment/k8stest k8stest=${REGISTRY_URL}app-${JOB_NAME}:${BUILD_NUMBER} --namespace=default --kubeconfig=/Users/ethanliao/.kube/config

构建过程中生成的镜像

如若此时修改server.php中的代码提交且在 jenkins 中再构建完毕,应用将使用最近一次构建的镜像。

-<?php
-var_dump($_SERVER);

+<?php
+phpinfo();

#### 构建:

k8s 中的镜像已经改变:

此时,应用也改变了。

若应用使用的变量经常发生改变,如数据库地址等,则完全没有必要再重复一遍上面的流程。可以搭建一套变量配置系统,当相关应用所使用的变量发生改变时则改变其在 etcd 中的值,如若此时该应用一直侦听 etcd 中的值,就可以同步至最新的变量。

  1. 搭建 etcd 服务器
  2. 变量配置系统中用 etcd 设置值 composer update “ linkorb/etcd-php ”: “ 1.2.1 ” && $client->set(‘’, ‘’);
  3. 容器在启动后运行bypass.sh循环监听值的变化

结束语

如上所述,则可以搭建一套高效的构建工具。既可以使用 k8s 的灵活伸缩性,也能方便的配置变量等…。

refs:

  1. Mac OS 安装 Docker

  2. Mac OS 安装 Jenkins

  3. run registry in docker

  4. Mac OS 安装 kubernetes

  5. run etcd in docker

以上内容为本人原创( http://postdev.net ) 原文地址: http://postdev.net/2017/04/23/%E5%9F%BA%E4%BA%8Ekubernetes-jenkins-etcd%E7%9A%84%E9%AB%98%E6%95%88%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7.html

3618 次点击
所在节点    问与答
6 条回复
yoke123
2017-06-23 15:33:02 +08:00
问下 如果只是单纯 需要 etcd 管理配置文件 可以吗?
场景:
项目需要 利用 etcd 管理项目配置文件 并且要有一个 etcd 管理界面
请问你有什么心得吗
EthanLiao
2017-06-30 15:09:47 +08:00
@yoke123 分享下我单位的实践。配置我们都是存放在 mysql 中的,etcd 只是在发布的时候被客户端调用,然后服务端通过 watch 的方式获取发布数据并修改服务器配置文件。
yoke123
2017-06-30 15:11:44 +08:00
那 管理界面呢.....这蛋疼的需求
EthanLiao
2017-06-30 15:28:28 +08:00
@yoke123 管理界面就是普通的 curd 界面额,我们是自己写的。总共两个页面,一个应用页面,应用页面下面带了一个配置页面。应用页面为应用列表,应用支持多类型( php,java...)多环境( dev,test,production )和多文件,可编辑。配置页面主要是某应用在某环境下的配置文件列表,可编辑、对比。发布是以某个应用下的某个环境为单位发布( etcd )。
yoke123
2017-06-30 15:36:59 +08:00
谢谢解答
37Y37
2018-08-27 16:21:32 +08:00
@yoke123 可以只用 etcd 来管理配置文件,看这文章:aHR0cHMlM0EvL21wLndlaXhpbi5xcS5jb20vcy91R1V2VjRqbDRZSXZOenR1ZXBkQzhB (base64 解下吧,发不了链接)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/356896

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX