当前位置: 首页 > wzjs >正文

福州网站制西安百度代运营

福州网站制,西安百度代运营,广西新宇建设项目有限公司网站,网站开发语言怎么选背景 controller chart 安装的 controller 容器将四个自定义资源控制器注册进入集群。 runner scale set chart 安装的 资源将使得仓库 runner 连接 Github Action 服务器。 安装 同样用 helm 安装 runner scale set chart。controller chart 可以用默认的 values.yaml&…

背景

controller chart 安装的 controller 容器将四个自定义资源控制器注册进入集群。
runner scale set chart 安装的 资源将使得仓库 runner 连接 Github Action 服务器。

安装

同样用 helm 安装 runner scale set chart。controller chart 可以用默认的 values.yaml,但是 runner chart 必须自定义 values.yaml以指定仓库以及仓库权限。
values.yaml的常见配置如下:

## Github 仓库地址
githubConfigUrl: https://github.com/myorg/myrepo## Github token 用于 runner 通过Github API 连接 Github Action 服务器。可以是PAT,也可以是 Github App。
githubConfigSecret:github_token: "ghp_sampleSampleSampleSampleSampleSample"## 集群中最大 runner 数。受限于集群资源。
maxRunners: 5## runner scale set 所属 group,一般不用填,后面源码会用到
# runnerGroup: "default"## 集群中最小 runner 数。
minRunners: 0## prometheus 监听指标
listenerMetrics:counters: gha_started_jobs_total: ## 已启动的 job 总数labels:["repository", "organization", "enterprise", "job_name", "event_name", "job_workflow_ref"]gha_completed_jobs_total: ## 已完成的 job 总数labels:["repository","organization","enterprise","job_name","event_name","job_result","job_workflow_ref",]## runner pod 的 spec
template:spec:containers:- name: runnerimage: ghcr.io/actions/actions-runner:latest ## runner pod 所用镜像。tag 不设置为 latest,设置为某个版本以保证系统安全稳定。command: ["/home/runner/run.sh"] ## 入口脚本

部署脚本:

helm install "arc-runner-set" \--namespace "arc-runners" \--create-namespace \-f your-custom-values.yamloci://ghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set--version=0.12.0

"arc-runner-set"是 chart 的部署名称,也是 Github 仓库展示的 runner scale set 名称。
"arc-runners"是 chart 的部署 namespace。为了隔离安全,一般不与 controller chart 同一个 namespace。
-f your-custom-values.yaml: 指定 values.yaml

它用 values.yaml 文件渲染如下AutoscalingRunnerSet资源,并且将其部署到 kubernetes 集群。

apiVersion: actions.github.com/v1alpha1
kind: AutoscalingRunnerSet
metadata:name: arc-runner-setnamespace: arc-runners
spec:githubConfigUrl: https://github.com/myorg/myrepogithubConfigSecret: "ghp_sampleSampleSampleSampleSampleSample" 
maxRunners: 5
minRunners: 0
template:spec:containers:- name: runnerimage: ghcr.io/actions/actions-runner:latestcommand: ["/home/runner/run.sh"]

源码

四个控制器中,第一个处理AutoscalingRunnerSet资源的是AutoscalingRunnerSet控制器。它的 Reconcile 函数源码。控制器按照如下步骤创建资源:

  1. 校验AutoscalingRunnerSet资源的版本是否与 controller image 的版本一致。也就是校验 controller chart 与 runner scale set chart 的版本是否一致。
// build.Version 是 controller image 的版本
// LabelKeyKubernetesVersion 是 runner scale set 的版本
if !v1alpha1.IsVersionAllowed(autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], build.Version) {
  1. 添加 finalizer 字段,阻止集群删除本资源。
autoscalingRunnerSetFinalizerName = "autoscalingrunnerset.actions.github.com/finalizer"if !controllerutil.ContainsFinalizer(autoscalingRunnerSet, autoscalingRunnerSetFinalizerName) {log.Info("Adding finalizer")if err := patch(ctx, r.Client, autoscalingRunnerSet, func(obj *v1alpha1.AutoscalingRunnerSet) {controllerutil.AddFinalizer(obj, autoscalingRunnerSetFinalizerName)
  1. 控制器调用 Github API 根据资源的 runnerGroup 字段获取 runner group Id。并且将 runner group Id 和 资源名称组合作为唯一标识向 Github Action 服务器注册自身。服务器返回 runner scale set id 表示注册成功。控制器将 id 局部更新给资源。
        runnerScaleSet, err = actionsClient.CreateRunnerScaleSet( // 向服务器注册ctx,&actions.RunnerScaleSet{Name:          autoscalingRunnerSet.Spec.RunnerScaleSetName, // 资源名称RunnerGroupId: runnerGroupId, // runner group IdLabels: []actions.Label{{Name: autoscalingRunnerSet.Spec.RunnerScaleSetName,Type: "System",},},RunnerSetting: actions.RunnerSetting{Ephemeral:     true,DisableUpdate: true,},})
    if err = patch(ctx, r.Client, autoscalingRunnerSet, func(obj *v1alpha1.AutoscalingRunnerSet) {obj.Annotations[AnnotationKeyGitHubRunnerScaleSetName] = runnerScaleSet.Name // 服务器返回的资源名称obj.Annotations[runnerScaleSetIdAnnotationKey] = strconv.Itoa(runnerScaleSet.Id) // 服务器返回的 scale set idobj.Annotations[AnnotationKeyGitHubRunnerGroupName] = runnerScaleSet.RunnerGroupName // 服务器返回的 runner group
  1. AutoscalingRunnerSet资源为模板创建EphemeralRunnerSet资源(之后分析)和AutoscalingListener资源。
    AutoscalingListener资源如下。它保存RunnerScaleSetId
autoscalingListener := &v1alpha1.AutoscalingListener{ObjectMeta: metav1.ObjectMeta{Name:        scaleSetListenerName(autoscalingRunnerSet), // Name 由`AutoscalingRunnerSet`资源的name 和 namespace 组成Namespace:   namespace,Labels:      labels,Annotations: annotations,},Spec: v1alpha1.AutoscalingListenerSpec{GitHubConfigUrl:               autoscalingRunnerSet.Spec.GitHubConfigUrl,GitHubConfigSecret:            autoscalingRunnerSet.Spec.GitHubConfigSecret,VaultConfig:                   autoscalingRunnerSet.VaultConfig(),RunnerScaleSetId:              runnerScaleSetId, // runner scale set idAutoscalingRunnerSetNamespace: autoscalingRunnerSet.Namespace,AutoscalingRunnerSetName:      autoscalingRunnerSet.Name,EphemeralRunnerSetName:        ephemeralRunnerSet.Name,MinRunners:                    effectiveMinRunners,MaxRunners:                    effectiveMaxRunners,Image:                         image,ImagePullSecrets:              imagePullSecrets,Proxy:                         autoscalingRunnerSet.Spec.Proxy,GitHubServerTLS:               autoscalingRunnerSet.Spec.GitHubServerTLS,Metrics:                       autoscalingRunnerSet.Spec.ListenerMetrics,Template:                      autoscalingRunnerSet.Spec.ListenerTemplate,},}

AutoscalingRunnerSet控制器的工作至此结束。接下来是AutoscalingListener控制器处理AutoscalingListener资源。

  1. 添加 finalizer 字段,阻止集群删除本资源。
if !controllerutil.ContainsFinalizer(autoscalingListener, autoscalingListenerFinalizerName) {log.Info("Adding finalizer")if err := patch(ctx, r.Client, autoscalingListener, func(obj *v1alpha1.AutoscalingListener) {controllerutil.AddFinalizer(obj, autoscalingListenerFinalizerName)
  1. AutoscalingRunnerSet资源获取 Github token,即Values.yaml文件的 githubConfigSecret 字段。
appConfig, err := r.GetAppConfig(ctx, &autoscalingRunnerSet)
  1. 创建 serivceaccount, role 和 role_binding 资源。使得之后创建的 listener pod 有权限访问资源。
  2. AutoscalingListener资源的配置写入 config 结构体,包括RunnerScaleSetId。并且将qi secret 资源保存到集群。
    config := ghalistenerconfig.Config{ConfigureUrl:                autoscalingListener.Spec.GitHubConfigUrl,EphemeralRunnerSetNamespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace,EphemeralRunnerSetName:      autoscalingListener.Spec.EphemeralRunnerSetName,MaxRunners:                  autoscalingListener.Spec.MaxRunners,MinRunners:                  autoscalingListener.Spec.MinRunners,RunnerScaleSetId:            autoscalingListener.Spec.RunnerScaleSetId, // runner scale set idRunnerScaleSetName:          autoscalingListener.Spec.AutoscalingRunnerSetName,ServerRootCA:                cert,LogLevel:                    scaleSetListenerLogLevel,LogFormat:                   scaleSetListenerLogFormat,MetricsAddr:                 metricsAddr,MetricsEndpoint:             metricsEndpoint,Metrics:                     autoscalingListener.Spec.Metrics,}return &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name:      scaleSetListenerConfigName(autoscalingListener),Namespace: autoscalingListener.Namespace,},Data: map[string][]byte{"config.json": buf.Bytes(), // buf 来自 config 结构体},}, nil
  1. 创建 listener pod。跟 controller pod 一样,业务镜像也是ghcr.io/actions/gha-runner-scale-set-controller。但是 command 是 /ghalistener,从 Dockerfile 可以看出,它的 main() 函数。
    listenerEnv := []corev1.EnvVar{{Name:  "LISTENER_CONFIG_PATH",Value: "/etc/gha-listener/config.json", // config.json 就是第四步的 config 结构体},}podSpec := corev1.PodSpec{ServiceAccountName: serviceAccount.Name,Containers: []corev1.Container{{Name:  autoscalingListenerContainerName,Image: autoscalingListener.Spec.Image, // 镜像字段来自 autoscalingListener 资源,来自 autoscalingrunnerset 资源Env:   listenerEnv,Command: []string{scaleSetListenerEntrypoint, // /ghalistener},
  1. 监听 listener pod 的业务容器状态,如果 container 异常则报错。
    AutoscalingListener控制器的工作至此结束。接下来看看 listener pod 做了什么。
func main() {configPath, ok := os.LookupEnv("LISTENER_CONFIG_PATH") // 读取环境变量config, err := config.Read(ctx, configPath) // 读取 config 文件app, err := app.New(*config) // 新建 app 对象if err := app.Run(ctx); err != nil { // 连接 Github Action 服务器log.Printf("Application returned an error: %v", err)os.Exit(1)}
}

app.Run()方法:

func (app *App) Run(ctx context.Context) error {g, ctx := errgroup.WithContext(ctx)metricsCtx, cancelMetrics := context.WithCancelCause(ctx)g.Go(func() error {app.logger.Info("Starting listener")listnerErr := app.listener.Listen(ctx, app.worker) // 监听上游仓库cancelMetrics(fmt.Errorf("Listener exited: %w", listnerErr))return listnerErr})if app.metrics != nil {g.Go(func() error {app.logger.Info("Starting metrics server")return app.metrics.ListenAndServe(metricsCtx) // 启动http服务,输出 prometheus 格式的指标})}return g.Wait()
}

app.listener.Listen(ctx, app.worker)的主逻辑:不断循环,从 Github Action 服务器接收消息。

    for {select {case <-ctx.Done():return ctx.Err()default:}msg, err := l.getMessage(ctx) // 从 Github Action 服务器获取 messageif err != nil {return fmt.Errorf("failed to get message: %w", err)}// Remove cancellation from the context to avoid cancelling the message handling.if err := l.handleMessage(context.WithoutCancel(ctx), handler, msg); err != nil { // 处理消息return fmt.Errorf("failed to handle message: %w", err)}}

如果用户配置的仓库 token 没有问题,那么 listener pod 就处于 running 状态,同时在仓库里可以看见 runner scale set,代表该 runner 已经可以使用了。

http://www.dtcms.com/wzjs/403492.html

相关文章:

  • 做网站的标签及属性微信小程序开发零基础入门
  • 北海市高德小学简介网站关键词优化的步骤和过程
  • 网站建设责任书seo少女
  • 泰安高端网站建设报价哪里有学市场营销培训班
  • 旅游网站建设与规划网站排名推广软件
  • 基层建设收录网站查数据的网站有哪些
  • 开发施工建设网站审核百度网站排名怎么提高
  • 自己做的网站和ie不兼容微信群二维码推广平台
  • 唐山网站制作价格附近有没有学电脑培训的
  • 青岛网站建设工作室软文范文大全1000字
  • 西安网站推广招聘关键词排名优化公司哪家强
  • 廊坊商昊网站建设最近最新的新闻
  • 网站 尺寸seo顾问
  • 呼和浩特企业网站建设app拉新推广平台
  • 桥头仿做网站太原最新情况
  • 做网站人员工资樱桃bt官网
  • 做淘宝那样的网站长沙网站推广工具
  • chatgpt 网站学开网店哪个培训机构好正规
  • 天津建设交培训中心网站北京推广优化公司
  • 网站的布局怎么做链接点击量软件
  • 学习建站的网站网站建设免费网站
  • 网站运作流程北京网站seo哪家公司好
  • 网站是什么公司做的seo矩阵培训
  • 广州网站建设哪家好谷歌竞价排名推广公司
  • 自己做链接的网站吗网站策划是干什么的
  • 营销型网站主机营销网站建站公司
  • 素材网下载重庆网站优化排名推广
  • 镇江网站开发免费网站自助建站系统
  • 提交网站地图seo推广软件排行榜
  • 贝斯特专业网站网络营销推广公司简介