k8s与CICD--将drone部署到kubernetes中,实现agent动态收缩
前言
本文主要讲如何把drone部署到k8s集群当中,本身drone这种基于容 器的pipeline方式,和k8s是相当契合的。这样的好处有:
- k8s集群守护drone-server 和drone-agent。
- 可以利用rpc特性,根据agent负载压力来动态调整agent的数量。当然即使不动态调整,我们手动调整一下复制集的数目也是相当简单的。
- 部署到k8s集群以后,可以利用k8s已有的日志系统和监控系统。
其实在接下来的文章系列中,我们会不断侧重于k8s相关。依旧是直接先上yaml文件,先来一个直观的感受。
相关yaml文件
ConfigMap在此处可以理解为drone应用的配置文件。这里有关于server和agent一系列设置。不过在k8s中大家需要注意的是:更新configmap以后,对于挂载该configmap的应用,配置内容并不能立即生效,大约需要10s。
apiVersion: v1
kind: ConfigMap
metadata:
name: drone-config
namespace: devops
data:
#######################
# Drone Server Config #
####################### # server host name
server.host: drone.xxx.com
# start the server in debug mode
server.debug: "false" # open user registration
server.open: "true" # database driver, defaul as sqlite3
server.database.driver: sqlite3
# database driver configuration string
server.database.datasource: drone.sqlite
# remote parameters (Gogs)
server.remote.gogs: "true"
server.remote.gogs.url: "http://gogs.xxx.com"
server.remote.gogs.private.mode: "true" ######################
# Drone Agent Config #
######################
agent.debug: "false"
agent.debug.pretty: "false"
agent.max.procs: "1"
agent.healthcheck: "true"
Secret文件,主要是存放一些秘钥之类的。不过这里也是有坑的,这个secret用于server和angent通信,设置不对就会构建项目一直处于pending状态。切记k8s中,secret需要base64。
echo -n "yourpassword" | base64
eW91cnBhc3N3b3Jk
apiVersion: v1 kind: Secret metadata: name: drone-secrets namespace: devops data: server.secret: eW91cnBhc3N3b3Jk
接下来就是drone-server的Deployment和Service和Ingress。此处为了简单,用了sqlite数据库,真正生产环境建议用mysql或是pgsql。即使用sqlite,也应该挂载到ceph中,保证数据的安全。这里直接hostpath。k8s中,应该做到存储和计算的分离。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: drone-server namespace: devops spec: replicas: 1 template: metadata: labels: app: drone-server spec: nodeSelector: net-type: external containers: - image: drone/drone:latest imagePullPolicy: Always name: drone-server ports: - containerPort: 8000 protocol: TCP - containerPort: 9000 protocol: TCP volumeMounts: # Persist our configs in an SQLite DB in here - name: drone-server-sqlite-db mountPath: /var/lib/drone resources: requests: cpu: 40m memory: 32Mi env: - name: DRONE_HOST valueFrom: configMapKeyRef: name: drone-config key: server.host - name: DRONE_OPEN valueFrom: configMapKeyRef: name: drone-config key: server.open - name: DRONE_DATABASE_DRIVER valueFrom: configMapKeyRef: name: drone-config key: server.database.driver - name: DRONE_DATABASE_DATASOURCE valueFrom: configMapKeyRef: name: drone-config key: server.database.datasource - name: DRONE_SECRET valueFrom: secretKeyRef: name: drone-secrets key: server.secret - name: DRONE_GOGS valueFrom: configMapKeyRef: name: drone-config key: server.remote.gogs - name: DRONE_GOGS_URL valueFrom: configMapKeyRef: name: drone-config key: server.remote.gogs.url - name: DRONE_GOGS_PRIVATE_MODE valueFrom: configMapKeyRef: name: drone-config key: server.remote.gogs.private.mode - name: DRONE_DEBUG valueFrom: configMapKeyRef: name: drone-config key: server.debug volumes: - name: drone-server-sqlite-db hostPath: path: /var/lib/drone
apiVersion: v1 kind: Service metadata: name: drone-service namespace: devops spec: ports: - name: http protocol: TCP port: 80 targetPort: 8000 - name: grpc protocol: TCP port: 9000 targetPort: 9000 selector: app: drone-server
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: drone-ingress namespace: devops spec: rules: - host: drone.xxx.com http: paths: - backend: serviceName: drone-service servicePort: 80 path: /
下面就是agent的部署文件了,replicas: 1 该项可以设置agent的数量,扩容起来特别方便。server和agent通过grpc的方式进行通信,主要端口是9000。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: drone-agent namespace: devops spec: replicas: 1 template: metadata: labels: app: drone-agent spec: nodeSelector: net-type: external containers: - image: drone/agent:latest imagePullPolicy: Always name: drone-agent volumeMounts: # Enables Docker in Docker - name: docker-socket mountPath: /var/run/docker.sock resources: requests: cpu: 100m memory: 64Mi livenessProbe: httpGet: path: /healthz port: 3000 initialDelaySeconds: 3 periodSeconds: 3 env: - name: DRONE_SERVER value: drone-service:9000 # issue: https://github.com/drone/drone/issues/2048 - name: DOCKER_API_VERSION value: "1.24" - name: DRONE_SECRET valueFrom: secretKeyRef: name: drone-secrets key: server.secret volumes: - name: docker-socket hostPath: path: /var/run/docker.sock
所有都部署到devops命名空间下,这个namespace已经建好了。当然如果没有的话,需要提前创建。
效果图
总结
项目github地址,这里有该系列的所有文件。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
k8s之CRD--为自定义资源生成代码
CRD简介和使用姿势 CustomResourceDefinition(CRD)是 v1.7 + 新增的无需改变代码 就可以扩展 Kubernetes API 的机制,用来管理自定义对象。它实际上是 ThirdPartyResources(TPR) 的升级版本,而 TPR 已经在 v1.8 中删除。 一些使用场景: 提供/管理外部数据存储/数据库(例如 CloudSQL/RDS 实例) 对k8s基础资源进行更高层次的抽象(比如定义一个etcd集群) 其实crd在很多k8s周边开源项目中有使用,比如ingress-controller和众多的operator。 CRD 控制器 在使用 CRD 扩展 Kubernetes API 时,通常还需要实现一个新建资源的控制器,监听改资源的变化情况,并作进一步的处理。官方提供的示例项目sample-controller。 这个例子主要讲述了以下几个方面: 如何使用自定义资源定义注册Foo类型的新自定义资源(自定义资源类型) 如何创建/获取/列出新资源类型Foo实例 如何在资源处理创建/更新/删除事件上设置控制器 编写crd controller之前...
-
下一篇
如何hack一下Rancher Kubernetes
在Rancher中,由于Kubernetes是基于Cattle引擎来部署,所以 在Kubernetes部署完成之后,我们可以通过Link Graph来很清晰地看到整体的部署情况。 既然基于Cattle引擎部署,也就是说需要两个compose文件,k8s引擎的compose文件放在https://github.com/rancher/ra... 下面,这里面有两个相关目录kubernetes与k8s,k8s是Rancher1.2开始使用的,而kubernetes则是Rancher1.2之后开始使用的。 为了我们可以自己hack一下rancher k8s的部署,我们可以在github上fork一下rancher-catalog,同时还需要修改一下Rancher中默认的catalog的repo地址,这个可以在 http://<rancher-server>... 页面下,寻找名为 catalog.url 的配置项,然后进入编辑修改。比如我这里将library库的地址换成了自己的 https://github.com/niusmallna... 。 此时,我们就可以修改了,找一个比...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Crontab安装和使用
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Linux系统CentOS6、CentOS7手动修改IP地址

微信收款码
支付宝收款码