1 内建插件

系统内置了如下内建插件:

  • kubectl : 用于发布kubernetes服务,支持原生kubectl的所有命令。

  • terraform :用于资源编排。

  • kubestar.v2(推荐) : 用于通过kubestar发布kubernetes服务。

  • kubestar(不推荐): 同上。

  • awsecs : 用于发布AWS中ECS服务。

  • sendemail :用于发送邮件。

  • sendmesg : 用于发送消息,根据连接器配置而定,可能是短信也可能是im消息。

  • flowcaller : 用于调用流水线进行应用群发布。

  • cdnrefresh : 对各CDN厂商的CDN进行刷新。

1.1 说明

为了扩展作业步骤所能完成的处理逻辑,OPEN-C3定义了一个内建插件的功能。

内建插件是一个可执行的二进制程序或者脚本,执行过程会在OPEN-C3所部署的服务器中执行。

可以根据需要开发,如需要添加新的内建插件,请提交插件到如下地址:

https://github.com/open-c3/open-c3/tree/v2.2.0/JOB/buildin/  # 其中v2.2.0 是您使用的OPEN-C3版本。

1.2 开发

通过环境变量往插件中传递参数,参数如下:

  • $ENV{CONFIGPATH}: 配置文件,也就是脚本内容文本文件路径

  • $ENV{JOBUUID} : 运行该任务的作业的UUID,如不是作业该变量为空

  • $ENV{NODE} : 机器列表,用逗号分隔

  • $ENV{TICKETFILE} : 票据文件路径

  • $ENV{TIMEOUT} : 超时时间

  • $ENV{TREEID} : 服务树ID

  • $ENV{TASKUUID} : 任务UUID

返回: 插件需要在标准输出中输出“机器ip:ok”,每个操作对象一行,表示该操作对象操作成功。

1.3 插件

1.3.1 kubectl

kubectl 插件支持原生的kubectl命令,需要两个部分配置。

先在票据管理中配置好kubeconfig,在作业步骤中选择上票据后在脚本参数中写上kubectl命令的参数。

其中kubectl可能需要文件,如apply -f app.yaml,文件来源可以有如下两种

情况1: 文件来源于代码仓库

如果是在流水线中使用的kubectl插件,kubectl运行的当前目录下有构建当前版本的文件,可以直接使用。

如代码中有abc.yaml文件,可以直接通过“apply -f abc.yaml”来使用文件。

情况二: 文件来源于当前步骤的配置

可以把需要的文件内容写到“脚本内容”中,然后可以通过关键字CONFIGFILE来指定,如:apply -f CONFIGFILE。

票据管理

在个人票据中管理自己的票据。票据类型选择“作业内建插件”。

票据内容为kubeconfig的内容。

步骤配置例子

  1. 镜像更新

脚本参数:set image deployment/nginx c3test-nginx=nginx:$version -n c3test

  1. 发布检查

脚本参数:check c3test deployment/nginx c3test-nginx=nginx:$version

注:check是OPEN-C3扩展的参数。

  1. 应用发布
#!kubectl
---
apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx:DEPLOYVERSION
      ports:
        - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports:
        - containerPort: 5000

脚本中用到了关键字${VERSION}, 系统调用过程如果存在构建版本$version,会用$version变量的内容替换${VERSION}。

脚本参数:apply -f CONFIGFILE -n c3test

  1. 引用代码仓库中的文件

脚本参数:apply -f pod-app.yaml -n c3test

维护注意

需要手动维护OPEN-C3服务所在机器的kubectl命令【单机版更新的是容器中的kubectl】。

wget https://github.com/open-c3/open-c3-install-cache/job-buildin/kubectl -O /bin/kubectl
chmod +x /bin/kubectl

1.3.2 terraform

OPEN-C3提供了内建插件用于调用terraform,通过这个插件可以做资源编排。

配置文件

config文件配置

使用内建插件,点击选择terraform类型。

脚本内容示例如下:

#!terraform
provider "aws" {
    access_key = "XXXXXX"
    secret_key = "XXXXXX"
    region = "us-east-1"
}

resource "aws_instance" "web" {
    ami = "ami-2757f631"
    instance_type = "t2.micro"
    count             = 3
    subnet_id = "${var.subnetid}"
}

resource "aws_lb" "weblb" {
  name               = "weblb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = "${var.sgs}"
  subnets            = "${var.subnetids}"
  enable_deletion_protection = false
}

resource "aws_lb_listener" "front_end" {
  load_balancer_arn = aws_lb.weblb.arn
  port              = "80"
  protocol          = "HTTP"
  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.webserver.arn
  }
}

resource "aws_lb_target_group" "webserver" {
  name     = "webserver-targetgroup"
  port     = 80
  protocol = "HTTP"
  vpc_id   = "${var.vpcid}"
}

resource "aws_lb_target_group_attachment" "web1" {
  target_group_arn = aws_lb_target_group.webserver.arn
  target_id        = aws_instance.web[0].id
  port             = 80
}

resource "aws_lb_target_group_attachment" "web2" {
  target_group_arn = aws_lb_target_group.webserver.arn
  target_id        = aws_instance.web[1].id
  port             = 80
}

resource "aws_lb_target_group_attachment" "test" {
  target_group_arn = aws_lb_target_group.webserver.arn
  target_id        = aws_instance.web[0].id
  port             = 80
}

variable "vpcid" {
    default = "vpc-07d7ed83ee7375813"
}

variable "subnetid" {
    default = "subnet-0b7fd82a07b9b7f66"
}

variable "subnetids" {
    default = ["subnet-0b7fd82a07b9b7f66", "subnet-08966f2af1fd1e3d8"]
}

variable "sgs" {
    default = ["sg-08f7116e2c9325edb"]
}

票据: 空。上面配置的方式中key已经在配置文件中,所以这里不需要票据。

脚本参数: config

注: 每个terraform作业在系统中都会有一个独立的目录存放config文件。每个config可以编辑一个文件。

可以添加多个config步骤,如脚本参数中写 config lb.tf 。

则在目录中会有一个lb.tf文件。当脚本参数为config时候,其实是config main.tf。
  1. 操作动作

有四个操作动作:init、plan、apply、destory

四个动作可以在一个步骤中执行,执行过程中按照脚本参数的顺序进行调用。

所以可以配置如下:

1.1. init & plan

使用内建插件,点击选择terraform类型。

脚本内容固定为如下:

#!terraform

票据: 空 脚本参数: init plan

这里是把init和plan两个动作在这里按照顺序执行,执行后可以在日志中看出如果真实执行apply的资源变化情况。

正常应该在plan之后添加一步审批操作,审批后执行下一步的apply。

1.2. apply

使用内建插件,点击选择terraform类型。

脚本内容固定为如下:

#!terraform

票据: 空 脚本参数: apply

1.3. destroy

和apply几乎一样,把脚本参数换成destory即可。destroy用户销毁资源 。

票据

下面以AWS为例说明怎么管理票据,AWS通过下面两个环境变量来控制访问的key。

export AWS_ACCESS_KEY_ID="XXXX"
export AWS_SECRET_ACCESS_KEY="XXXX"

每一行的内容格式必须为: /^export\s+[A-Za-z0-9_]+="[A-Za-z0-9\/]+"\s*$/ 否则系统会提示错误。

如果确定使用票据的方式,在前面配置作业的过程中,除了config步骤,其他操作terraform 的步骤选择上票据。

维护注意

需要手动维护OPEN-C3服务所在机器的terraform命令【单机版更新的是容器中的terraform】。

wget https://github.com/open-c3/open-c3-install-cache/job-buildin/terraform -O /bin/terraform
chmod +x /bin/terraform

1.3.3  awsecs

awsecs作业内建插件用于发布AWS的ECS服务。

票据

在流水线使用过程中CI部分需要用awsecr_push_image.pl把构建的包build成镜像上传到AWS的ECR服务中。

配置作业流程

  1. apply (应用)

发布应用,是一次发布的操作。

使用内建插件,点击awsecs类型。

脚本内容:

#!awsecs
task-definition: test-front-service
region: cn-northwest-1
cluster: testfoo
service: test-front-service

脚本参数: apply $version

  1. check(检查发布状态)

配置和apply基本一样,在脚本参数改成 check 即可。

系统会在超时时间内每10秒检查一下服务的状态,直到对应的服务当前检查的版本是Running状态后退出。

维护注意

使用该插件需要安装aws命令,安装方式awsecr_push_image.pl 处查看。

1.3.4 sendemail

sendemail插件用于发送邮件。发送的邮件标题默认会添加“OPEN-C3:”前缀。

注: 该部分不会进行用户地址簿转换,需要直接写邮箱地址。

使用方式

脚本内容第一行为邮件标题,其他脚本内容为邮件内容

脚本参数为邮件接收人列表,多个人用逗号或者空格分隔。

例:

脚本内容:

#!sendemail
邮件测试
邮件内容第一行
邮件内容第二行 abc

脚本参数:

foo@abc.com,bar@gmail.com

1.3.5 sendmesg

sendmesg插件用于发送消息(短信或者飞书等,根据连接器中配置的消息出口而定)。

发送的消息默认会添加“OPEN-C3:”前缀。

注: 该部分不会进行用户地址簿转换,如果要发送短信需要直接写手机号。

使用方式

脚本内容为消息内容

脚本参数为消息接收人列表,多个人用逗号或者空格分隔。

例:

脚本内容:

#!sendmesg
消息内容123
消息内容第二行 。。。

脚本参数:

foo@abc.com,bar@gmail.com,133113xxxxx

1.3.6 flowcaller

OPEN-C3提供的一个方式,支持在作业步骤中可以调用流水线进行应用群发布。

使用

  1. 学习流水线用法

学习流水线的用法。

  1. 在作业中调用流水线

2.1. 插件说明

选择内建插件:flowcaller

插件内容:

#!flowcaller     # 插件名称
flowid: 70       # 流水线编号
envname: online  # 调用的环境,test为测试环境,online为线上环境
env:             # 环境变量,没有可以为空
  foo: ${foo}    # 具体的环境变量,其中${foo}格式的可以从脚本参数自动传递进去

脚本参数: $version $foo_version $foo_rollback_version foo=$foo $ip=$ip
参数格式说明:
    $version【固定内容】
    $foo_version【传递给流水线的发布版本】
    $foo_rollback_version【传递给流水线的回滚版本】
    foo=$foo【可以是多个,用于替换插件内容,用于替换流水线变量】
    $ip=$ip 【固定内容】

2.2. 作业变量说明

  • 在执行时变量的顺序会根据描述的文本进行排序。

  • 固定变量【点击查看OPEN-C3中的作业变量用法】:

version: deploy

rollbackVersion: rollback

ip: group:val=openc3skipnode

  • 非固定变量属于自定义部分,根据实际情况进行配置,如应用群中的发布版本号都一样,就可以配置一样的变量名。

  • 添加到轻应用

学习轻应用的用法,把配置的作业添加到轻应用。

  1. 执行

进到轻应用列表页: 

点击进入配置的应用群发布: 

1.3.7 tsunamiudp

tsunamiudp 通过UDP协议传输文件,加速文件分发。

以下说明适用于单机版.

使用

1. 使用内建插件tsunamiudp。
2. 插件参数填写要加速的代理的ip地址,多个地址用英文逗号分隔。

维护

  1. 添加配置

在配置文件/data/open-c3/Connector/config.inix 中添加如下配置

tsunamiudp:
  serverip: 10.x.x.x #tsunamiudp服务端的地址,也就是openc3单机版本的地址。
  1. 安装tsunami-udp

在单机版本和需要加速的代理服务器中安装tsunami-udp。安装方式如下

# cd /data
# git clone  https://github.com/cheetahmobile/tsunami-udp
# cd tsunami-udp
# ./recompile.sh
#注: 如有报错请请安装工具依赖 yum install autoconf automake libtool
#安装路径固定在/data目录中。
  1. 启动tsunami-udp服务端

在OPENC3单机版本的宿主机上服务守护进程:

/opt/mydan/dan/bootstrap/exec/tsunamiudp

#!/bin/bash
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$MYDanPATH/bin

os=$(uname)
_exit () { echo $1; sleep 60; exit 1; }
if [ "x$os" = "x" ];then
     _exit "uname fail"
fi

echo "os: $os";
if [ "x$os" == "xLinux" ] ;then
    ulimit -n 655350 || _exit "ulimit -n fail";
    ulimit -u 102400 || _exit "ulimit -u fail";
    ulimit -s 10240  || _exit "ulimit -s fail";
fi

cd /data/open-c3-data/glusterfs/tsunamiudp || _exit "chdir fail";
pwd

exec /data/tsunami-udp/server/tsunamid 2>&1
  1. 在代理中添加插件
把OPENC3单机版本的下面文件
/data/open-c3/JOB/buildin/tsunamiudp.code/tsunami2proxy

拷贝到代理机的如下路径(该文件要有可执行权限)
/opt/mydan/dan/agent/code/tsunami2proxy
  1. 添加网络访问权限

开放服务端(OPENC3的机器)的51038 TCP端口,允许需要加速的代理机访问。

开放代理机的51038-51058 UDP端口,允许OPENC3机器访问(服务端)。

1.3.8 localbash

localbash 在C3上执行shell命令。

使用

命令会在c3的docker容器中执行该命令。