国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼)

這篇具有很好參考價(jià)值的文章主要介紹了自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

內(nèi)容導(dǎo)讀:

背景

上文通過(guò)下面的配置就實(shí)現(xiàn)了驗(yàn)收測(cè)試壓力測(cè)試,對(duì)此有以下疑問(wèn):

  1. metadata定義腳本和類型,說(shuō)明接口能執(zhí)行shell,那它是怎么實(shí)現(xiàn)的?
  2. type未設(shè)置是怎樣的執(zhí)行邏輯?type有哪些值,各有什么作用?

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

本文將通過(guò)源碼來(lái)解答以上問(wèn)題

源碼粗讀

本文采用粗讀源碼方式,因?yàn)閣ebhook是一個(gè)功能點(diǎn),不算Flagger核心流程。

源碼下載

源碼:https://github.com/fluxcd/flagger

git clone https://github.com/fluxcd/flagger.git

定位webhooks接口定義代碼

接口定義信息:Kind為Canary,webhooks位于spec.analysis.webhooks

Canary代碼位置:pkg/apis/flagger/v1beta1/canary.go:44

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

接著點(diǎn)擊CanarySpec、CanaryAnalysis就找到了webhooks屬性定義。

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

webhooks對(duì)應(yīng)的結(jié)構(gòu)體為CanaryWebhook

// CanaryWebhook holds the reference to external checks used for canary analysis
type CanaryWebhook struct {
	// Type of this webhook
	Type HookType `json:"type"`

	// Name of this webhook
	Name string `json:"name"`

	// URL address of this webhook
	URL string `json:"url"`

	// false會(huì)觸發(fā)告警,目前支持confirm-rollout、confirm-traffic-increase、confirm-promotion階段
	MuteAlert bool `json:"muteAlert"`

	// Request timeout for this webhook
	Timeout string `json:"timeout,omitempty"`

	// Metadata (key-value pairs) for this webhook
	// +optional
	Metadata *map[string]string `json:"metadata,omitempty"`

	// Number of retries for this webhook
	// +optional
	Retries int `json:"retries,omitempty"`
}

定位CanaryWebhook相關(guān)代碼

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

只需關(guān)注兩個(gè)函數(shù):

  1. CallEventWebhook:位于pkg/controller/webhook.go:106
  2. CallWebhook:位于pkg/controller/webhook.go:87

說(shuō)明:events.go為系統(tǒng)的創(chuàng)建Webhook(用戶創(chuàng)建的由spec.analysis.webhooks定義),最終是調(diào)用CallEventWebhook
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

解讀CallEventWebhook和CallWebhook

比較兩個(gè)函數(shù)差異點(diǎn)和共同點(diǎn)如下圖:
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

最終調(diào)用callWebhook:發(fā)起httpPOST請(qǐng)求的常規(guī)代碼。
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

小結(jié):?jiǎn)栴}1結(jié)論

Flagger Webhook會(huì)向目標(biāo)地址發(fā)送方法的http POST請(qǐng)求,發(fā)送數(shù)據(jù)結(jié)構(gòu)如下:

// CanaryWebhookPayload holds the deployment info and metadata sent to webhooks
type CanaryWebhookPayload struct {
	// Name of the canary
	Name string `json:"name"`
	// Namespace of the canary
	Namespace string `json:"namespace"`
	// Phase of the canary analysis
	Phase CanaryPhase `json:"phase"`
	// Hash from the TrackedConfigs and LastAppliedSpec of the Canary.
	// Can be used to identify a Canary for a specific configuration of the
	// deployed resources.
	Checksum string `json:"checksum"`
	// Metadata (key-value pairs) for this webhook
	Metadata map[string]string `json:"metadata,omitempty"`
}

以上就解答了問(wèn)題1:Flagger僅發(fā)送http請(qǐng)求,具體邏輯由目標(biāo)接口實(shí)現(xiàn)。

分析loadtester接口實(shí)現(xiàn)代碼

我們用到了http://flagger-loadtester.test/
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

loadtester服務(wù)啟動(dòng)入口
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops
找到接口http://flagger-loadtester.test/處理邏輯
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

最后按metadata.type執(zhí)行任務(wù)。
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

解讀Webhook type

用到Webhook type的相關(guān)代碼如下

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

一共有8個(gè)可選值,7個(gè)階段

各值含義如下:

  1. confirm-rollout:在擴(kuò)展金絲雀部署之前執(zhí)行,可用于手動(dòng)批準(zhǔn)。Canary 將暫停,直到 webhook 返回成功的 HTTP 狀態(tài)代碼。
  2. pre-rollout:在將流量路由到金絲雀之前執(zhí)行。如果預(yù)部署鉤子失敗,則金絲雀前進(jìn)將暫停,并且如果失敗數(shù)量達(dá)到閾值,金絲雀將回滾。
  3. rollout:在指標(biāo)檢查之前的每次迭代分析過(guò)程中執(zhí)行。如果 rollout 調(diào)用失敗,則金絲雀進(jìn)度將暫停并最終回滾。
  4. confirm-traffic-increase:在金絲雀的權(quán)重增加之前執(zhí)行。金絲雀前進(jìn)將暫停,直到該鉤子返回 HTTP 200。
  5. confirm-promotion:在升級(jí)步驟之前執(zhí)行。金絲雀升級(jí)將暫停,直到掛鉤返回 HTTP 200。升級(jí)暫停時(shí),F(xiàn)lagger 將繼續(xù)運(yùn)行指標(biāo)檢查和推出掛鉤。
  6. post-rollout:在金絲雀升級(jí)或回滾后執(zhí)行。如果發(fā)布后 webhook 失敗,則會(huì)記錄錯(cuò)誤。
  7. rollback:當(dāng)金絲雀部署處于“正在進(jìn)行”或“等待”狀態(tài)時(shí),會(huì)執(zhí)行回滾鉤子。這提供了在分析期間或等待確認(rèn)時(shí)回滾的能力。如果回滾鉤子返回成功的 HTTP 狀態(tài)代碼,F(xiàn)lagger 將停止分析并將金絲雀發(fā)布標(biāo)記為失敗。
  8. event:每次 Flagger 發(fā)出 Kubernetes 事件時(shí)都會(huì)執(zhí)行事件掛鉤。配置后,F(xiàn)lagger 在金絲雀部署期間執(zhí)行的每個(gè)操作都將通過(guò) HTTP POST 請(qǐng)求以 JSON 形式發(fā)送。

說(shuō)明:前面7個(gè)值是Canary對(duì)應(yīng)的七個(gè)階段,event表示Canary創(chuàng)建了k8s事件就會(huì)觸發(fā)。

Webhook type定義如下:
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

confirm-rollout 源碼解讀

  1. 類型為ConfirmRolloutHook
  2. 反向引用找到使用ConfirmRolloutHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runConfirmRolloutHooks(canary *flaggerv1.Canary, canaryController canary.Controller) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.ConfirmRolloutHook {
			err := CallWebhook(*canary, canary.Status.Phase, webhook)
            if err != nil {
				return false
			}
		}
	}
	return true
}
  1. 反向引用找到使用runConfirmRolloutHooks代碼(僅保留關(guān)鍵代碼)
func (c *Controller) checkCanaryStatus(canary *flaggerv1.Canary, canaryController canary.Controller, scalerReconciler canary.ScalerReconciler, shouldAdvance bool) bool {
	c.recorder.SetStatus(canary, canary.Status.Phase)
	if canary.Status.Phase == flaggerv1.CanaryPhaseProgressing ||
		canary.Status.Phase == flaggerv1.CanaryPhaseWaitingPromotion ||
		canary.Status.Phase == flaggerv1.CanaryPhasePromoting ||
		canary.Status.Phase == flaggerv1.CanaryPhaseFinalising {
		return true
	}

	var err error
	canary, err = c.flaggerClient.FlaggerV1beta1().Canaries(canary.Namespace).Get(context.TODO(), canary.Name, metav1.GetOptions{})
	if err != nil {
        // 按ns和name獲取,err表示Canary不存在
		return false
	}

	if shouldAdvance {
		// 調(diào)用runConfirmRolloutHooks
		if isApproved := c.runConfirmRolloutHooks(canary, canaryController); !isApproved {
            // 接口返回false,即未通過(guò)審批
			return false
		}
        canaryPhaseProgressing := canary.DeepCopy()
        // 審批通過(guò)后,canary狀態(tài)為CanaryPhaseProgressing(將由上面的邏輯直接返回true)
		canaryPhaseProgressing.Status.Phase = flaggerv1.CanaryPhaseProgressing
        if err := canaryController.SyncStatus(canary, flaggerv1.CanaryStatus{Phase: flaggerv1.CanaryPhaseProgressing}); err != nil {
			return false
		}
		return false
	}
	return false
}
  1. 值為true的條件:shouldAdvance為true的條件:canary狀態(tài)為(Progressing、Waiting、WaitingPromotion、Promoting、Finalising)、worklod有變化、worklod依賴資源(ConfigMap+Secret)有變化。查看shouldAdvance代碼:
func (c *Controller) shouldAdvance(canary *flaggerv1.Canary, canaryController canary.Controller) (bool, error) {
	if canary.Status.Phase == flaggerv1.CanaryPhaseProgressing ||
		canary.Status.Phase == flaggerv1.CanaryPhaseWaiting ||
		canary.Status.Phase == flaggerv1.CanaryPhaseWaitingPromotion ||
		canary.Status.Phase == flaggerv1.CanaryPhasePromoting ||
		canary.Status.Phase == flaggerv1.CanaryPhaseFinalising {
		return true, nil
	}

	// Make sure to sync lastAppliedSpec even if the canary is in a failed state.
	if canary.Status.Phase == flaggerv1.CanaryPhaseFailed {
			return false, err
		}
	}

	newTarget, err := canaryController.HasTargetChanged(canary)
	if err != nil {
		return false, err
	}
	if newTarget {
		return newTarget, nil
	}

	newCfg, err := canaryController.HaveDependenciesChanged(canary)
	if err != nil {
		return false, err
	}

	return newCfg, nil

}

pre-rollout 源碼解讀

  1. 類型為PreRolloutHook
  2. 反向引用找到使用PreRolloutHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runPreRolloutHooks(canary *flaggerv1.Canary) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.PreRolloutHook {
			err := CallWebhook(*canary, flaggerv1.CanaryPhaseProgressing, webhook)
			if err != nil {
				return false
			} else {
				c.recordEventInfof(canary, "Pre-rollout check %s passed", webhook.Name)
			}
		}
	}
	return true
}
  1. 反向引用找到使用runPreRolloutHooks代碼(僅保留關(guān)鍵代碼)
    // 灰度流量為0 且 canary的迭代數(shù)為0(0表示對(duì)業(yè)務(wù)有效,像AB測(cè)試和藍(lán)綠測(cè)試迭代數(shù)非0) 且 非影子/鏡像流量
	if canaryWeight == 0 && cd.Status.Iterations == 0 &&
		!(cd.GetAnalysis().Mirror && mirrored) {
		c.recordEventInfof(cd, "Starting canary analysis for %s.%s", cd.Spec.TargetRef.Name, cd.Namespace)

		// run pre-rollout web hooks
		if ok := c.runPreRolloutHooks(cd); !ok {
			if err := canaryController.SetStatusFailedChecks(cd, cd.Status.FailedChecks+1); err != nil {
				c.recordEventWarningf(cd, "%v", err)
			}
			return
		}
	} else {
        // rollout執(zhí)行代碼
		if ok := c.runAnalysis(cd); !ok {
			if err := canaryController.SetStatusFailedChecks(cd, cd.Status.FailedChecks+1); err != nil {
				c.recordEventWarningf(cd, "%v", err)
			}
			return
		}
	}

rollout(默認(rèn)值) 源碼解讀

  1. 類型為RolloutHook
  2. 反向引用找到使用RolloutHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runAnalysis(canary *flaggerv1.Canary) bool {
	// run external checks
	for _, webhook := range canary.GetAnalysis().Webhooks {
 // type為空也走此邏輯
		if webhook.Type == "" || webhook.Type == flaggerv1.RolloutHook {
			err := CallWebhook(*canary, flaggerv1.CanaryPhaseProgressing, webhook)
			if err != nil {
				return false
			}
		}
	}
	return true
}
  1. 執(zhí)行runAnalysis代碼位于pre-rollout執(zhí)行代碼處,執(zhí)行條件為pre-rollout的相反條件
// 灰度流量為0 且 canary的迭代數(shù)為0(0表示對(duì)業(yè)務(wù)有效,像AB測(cè)試和藍(lán)綠測(cè)試迭代數(shù)非0) 且 非影子/鏡像流量
	if canaryWeight == 0 && cd.Status.Iterations == 0 &&
		!(cd.GetAnalysis().Mirror && mirrored) {
		c.recordEventInfof(cd, "Starting canary analysis for %s.%s", cd.Spec.TargetRef.Name, cd.Namespace)

		// run pre-rollout web hooks
		if ok := c.runPreRolloutHooks(cd); !ok {
			if err := canaryController.SetStatusFailedChecks(cd, cd.Status.FailedChecks+1); err != nil {
				c.recordEventWarningf(cd, "%v", err)
			}
			return
		}
	} else {
		if ok := c.runAnalysis(cd); !ok {
			if err := canaryController.SetStatusFailedChecks(cd, cd.Status.FailedChecks+1); err != nil {
				c.recordEventWarningf(cd, "%v", err)
			}
			return
		}
	}

confirm-traffic-increase 源碼解讀

  1. 類型為ConfirmTrafficIncreaseHook
  2. 反向引用找到使用ConfirmTrafficIncreaseHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runConfirmTrafficIncreaseHooks(canary *flaggerv1.Canary) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.ConfirmTrafficIncreaseHook {
			err := CallWebhook(*canary, flaggerv1.CanaryPhaseProgressing, webhook)
			if err != nil {
				return false
			}
		}
	}
	return true
}
  1. 反向引用找到使用runConfirmTrafficIncreaseHooks代碼(僅保留關(guān)鍵代碼)
    // 計(jì)算下次要增加流量
	if c.nextStepWeight(cd, canaryWeight) > 0 {
		if !mirrored &&
			(cd.Status.Phase != flaggerv1.CanaryPhasePromoting &&
				cd.Status.Phase != flaggerv1.CanaryPhaseWaitingPromotion &&
				cd.Status.Phase != flaggerv1.CanaryPhaseFinalising) {
			if promote := c.runConfirmTrafficIncreaseHooks(cd); !promote {
				return
			}
		}
		c.runCanary(cd, canaryController, meshRouter, mirrored, canaryWeight, primaryWeight, maxWeight)
	}

confirm-promotion 源碼解讀

  1. 類型為ConfirmPromotionHook
  2. 反向引用找到使用ConfirmPromotionHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runConfirmPromotionHooks(canary *flaggerv1.Canary, canaryController canary.Controller) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.ConfirmPromotionHook {
			err := CallWebhook(*canary, flaggerv1.CanaryPhaseProgressing, webhook)
			if err != nil {
				return false
			} else {
				c.recordEventInfof(canary, "Confirm-promotion check %s passed", webhook.Name)
			}
		}
	}
	return true
}
  1. 反向引用找到使用runConfirmPromotionHooks代碼(僅保留關(guān)鍵代碼)
if c.nextStepWeight(cd, canaryWeight) > 0 {
		// run hook only if traffic is not mirrored
		if !mirrored &&
			(cd.Status.Phase != flaggerv1.CanaryPhasePromoting &&
				cd.Status.Phase != flaggerv1.CanaryPhaseWaitingPromotion &&
				cd.Status.Phase != flaggerv1.CanaryPhaseFinalising) {
			if promote := c.runConfirmTrafficIncreaseHooks(cd); !promote {
				return
			}
		}
		c.runCanary(cd, canaryController, meshRouter, mirrored, canaryWeight, primaryWeight, maxWeight)
        
	}

func (c *Controller) runCanary(canary *flaggerv1.Canary, canaryController canary.Controller,
	meshRouter router.Interface, mirrored bool, canaryWeight int, primaryWeight int, maxWeight int) {
	// 灰度流量定義的最大灰度流量(analysis.maxWeight):下一步將把流量全部切換到primary
	if canaryWeight >= maxWeight {
		// check promotion gate
		if promote := c.runConfirmPromotionHooks(canary, canaryController); !promote {
			return
		}
	}
}

post-rollout 源碼解讀

  1. 類型為PostRolloutHook
  2. 反向引用找到使用PostRolloutHook代碼(僅保留關(guān)鍵代碼)

func (c *Controller) runPostRolloutHooks(canary *flaggerv1.Canary, phase flaggerv1.CanaryPhase) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.PostRolloutHook {
			err := CallWebhook(*canary, phase, webhook)
			if err != nil {
				c.recordEventWarningf(canary, "Post-rollout hook %s failed %v", webhook.Name, err)
				return false
			} else {
				c.recordEventInfof(canary, "Post-rollout check %s passed", webhook.Name)
			}
		}
	}
	return true
}
  1. 反向引用找到使用runPostRolloutHooks代碼(僅保留關(guān)鍵代碼)
// scale canary to zero if promotion has finished
	if cd.Status.Phase == flaggerv1.CanaryPhaseFinalising {
		if scalerReconciler != nil {
			if err := scalerReconciler.PauseTargetScaler(cd); err != nil {
				c.recordEventWarningf(cd, "%v", err)
				return
			}
		}
		if err := canaryController.ScaleToZero(cd); err != nil {
			c.recordEventWarningf(cd, "%v", err)
			return
		}

		// set status to succeeded
		if err := canaryController.SetStatusPhase(cd, flaggerv1.CanaryPhaseSucceeded); err != nil {
			c.recordEventWarningf(cd, "%v", err)
			return
		}    
		c.recorder.SetStatus(cd, flaggerv1.CanaryPhaseSucceeded)
        // Canary狀態(tài)為成功觸發(fā)
		c.runPostRolloutHooks(cd, flaggerv1.CanaryPhaseSucceeded)
		c.recordEventInfof(cd, "Promotion completed! Scaling down %s.%s", cd.Spec.TargetRef.Name, cd.Namespace)
		c.alert(cd, "Canary analysis completed successfully, promotion finished.",
			false, flaggerv1.SeverityInfo)
		return
	}

rollback 源碼解讀

  1. 類型為RollbackHook
  2. 反向引用找到使用RollbackHook代碼(僅保留關(guān)鍵代碼)
func (c *Controller) runRollbackHooks(canary *flaggerv1.Canary, phase flaggerv1.CanaryPhase) bool {
	for _, webhook := range canary.GetAnalysis().Webhooks {
		if webhook.Type == flaggerv1.RollbackHook {
			err := CallWebhook(*canary, phase, webhook)
			if err != nil {
				c.recordEventInfof(canary, "Rollback hook %s not signaling a rollback", webhook.Name)
			} else {
				c.recordEventWarningf(canary, "Rollback check %s passed", webhook.Name)
				return true
			}
		}
	}
	return false
}
  1. 反向引用找到使用runRollbackHooks代碼(僅保留關(guān)鍵代碼)
	if cd.Status.Phase == flaggerv1.CanaryPhaseProgressing ||
		cd.Status.Phase == flaggerv1.CanaryPhaseWaiting ||
		cd.Status.Phase == flaggerv1.CanaryPhaseWaitingPromotion {
		if ok := c.runRollbackHooks(cd, cd.Status.Phase); ok {
			c.recordEventWarningf(cd, "Rolling back %s.%s manual webhook invoked", cd.Name, cd.Namespace)
			c.alert(cd, "Rolling back manual webhook invoked", false, flaggerv1.SeverityWarn)
            // 真正回滾邏輯
			c.rollback(cd, canaryController, meshRouter, scalerReconciler)
			return
		}
	}

event 源碼解讀

  1. 類型為EventHook
  2. 反向引用找到使用EventHook代碼(僅保留關(guān)鍵代碼)

func (c *Controller) sendEventToWebhook(r *flaggerv1.Canary, eventType, template string, args []interface{}) {
	webhookOverride := false
	for _, canaryWebhook := range r.GetAnalysis().Webhooks {
		if canaryWebhook.Type == flaggerv1.EventHook {
			webhookOverride = true
			err := CallEventWebhook(r, canaryWebhook, fmt.Sprintf(template, args...), eventType)
			if err != nil {
				c.logger.With("canary", fmt.Sprintf("%s.%s", r.Name, r.Namespace)).Errorf("error sending event to webhook: %s", err)
			}
		}
	}

	// c.eventWebhook來(lái)源于環(huán)境變量"EVENT_WEBHOOK_URL"
	if c.eventWebhook != "" && !webhookOverride {
		hook := flaggerv1.CanaryWebhook{
			Name: "events",
			URL:  c.eventWebhook,
		}
		err := CallEventWebhook(r, hook, fmt.Sprintf(template, args...), eventType)
		if err != nil {
			c.logger.With("canary", fmt.Sprintf("%s.%s", r.Name, r.Namespace)).Errorf("error sending event to webhook: %s", err)
		}
	}
}
  1. 反向引用找到使用sendEventToWebhook代碼(僅保留關(guān)鍵代碼):Canary產(chǎn)生的所有k8s Event都會(huì)執(zhí)行sendEventToWebhook
func (c *Controller) recordEventInfof(r *flaggerv1.Canary, template string, args ...interface{}) {
	c.logger.With("canary", fmt.Sprintf("%s.%s", r.Name, r.Namespace)).Infof(template, args...)
    // 記錄event到k8s 
	c.eventRecorder.Event(r, corev1.EventTypeNormal, "Synced", fmt.Sprintf(template, args...))
	c.sendEventToWebhook(r, corev1.EventTypeNormal, template, args)
}

func (c *Controller) recordEventErrorf(r *flaggerv1.Canary, template string, args ...interface{}) {
	c.logger.With("canary", fmt.Sprintf("%s.%s", r.Name, r.Namespace)).Errorf(template, args...)
	c.eventRecorder.Event(r, corev1.EventTypeWarning, "Synced", fmt.Sprintf(template, args...))
	c.sendEventToWebhook(r, corev1.EventTypeWarning, template, args)
}

func (c *Controller) recordEventWarningf(r *flaggerv1.Canary, template string, args ...interface{}) {
	c.logger.With("canary", fmt.Sprintf("%s.%s", r.Name, r.Namespace)).Infof(template, args...)
	c.eventRecorder.Event(r, corev1.EventTypeWarning, "Synced", fmt.Sprintf(template, args...))
	c.sendEventToWebhook(r, corev1.EventTypeWarning, template, args)
}

附錄

Goland本地啟動(dòng)服務(wù)

參考文檔:https://docs.flagger.app/dev/dev-guide#manual-testing

增加啟動(dòng)參數(shù):-kubeconfig=/Users/admin/.kube/config -log-level=info -mesh-provider=istio -metrics-server=http://prom.istio.cn:9090

啟動(dòng)配置
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

執(zhí)行日志:
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

調(diào)試效果:
自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

結(jié)語(yǔ)

本文以Webhook疑問(wèn)為出發(fā)點(diǎn),通過(guò)粗讀源碼全面解讀了Webhook相關(guān)知識(shí),同時(shí)附上了Goland本地調(diào)試方法。

自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼),DevOps,云原生,自動(dòng)化,運(yùn)維,devops

請(qǐng)用微信掃碼關(guān)注下?? ,持續(xù)更新云原生DevOps最佳實(shí)踐。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847702.html

到了這里,關(guān)于自動(dòng)化金絲雀部署:Flagger全面解讀webhook(含源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • KubeSphere實(shí)現(xiàn)金絲雀發(fā)布(Canary Release)

    KubeSphere實(shí)現(xiàn)金絲雀發(fā)布(Canary Release)

    KubeSphere 基于 [Istio] 向用戶提供金絲雀發(fā)布功能,即: 引入服務(wù)的新版本,并向其發(fā)送一小部分流量來(lái)進(jìn)行測(cè)試 同時(shí),舊版本負(fù)責(zé)處理其余的流量 如果一切順利,就可逐漸增加向新版本發(fā)送的流量,同時(shí)逐步停用舊版本 如出現(xiàn)任何問(wèn)題,可用 KubeSphere 更改流量比例來(lái)回滾至

    2024年02月02日
    瀏覽(24)
  • K8S Nginx Ingress實(shí)現(xiàn)金絲雀發(fā)布

    K8S Nginx Ingress實(shí)現(xiàn)金絲雀發(fā)布

    通過(guò)給 Ingress 資源指定 Nginx Ingress 所支持的 annotation 可實(shí)現(xiàn)金絲雀發(fā)布。 需給服務(wù)創(chuàng)建2個(gè) Ingress,其中 1個(gè)常規(guī) Ingress , 另1個(gè)為帶? nginx.ingress.kubernetes.io/canary: \\\"true\\\" ?固定的 annotation 的 Ingress,稱為 Canary Ingress。 Canary Ingress 一般代表新版本的服務(wù),結(jié)合另外針對(duì)流量切分策

    2024年02月11日
    瀏覽(31)
  • 【K8s】1版本回退升級(jí)&金絲雀發(fā)布

    【K8s】1版本回退升級(jí)&金絲雀發(fā)布

    為了更好的解決服務(wù)編排的問(wèn)題, 我們可以使用Deployment控制器。這種控制器不直接管理pod,他通過(guò)ReplicaSet來(lái)管理pod。 目錄 1.使用yaml文件形式,創(chuàng)建deployment 2.擴(kuò)縮容 3.鏡像更新 4.版本回退 5.金絲雀發(fā)布 金絲雀發(fā)布的優(yōu)點(diǎn) 金絲雀發(fā)布的缺點(diǎn) Deployment主要功能: 支持ReplicaSet的

    2024年02月03日
    瀏覽(18)
  • 1W字長(zhǎng)文:藍(lán)綠發(fā)布、金絲雀發(fā)布、滾動(dòng)發(fā)布、A/B測(cè)試 原理和實(shí)操

    1W字長(zhǎng)文:藍(lán)綠發(fā)布、金絲雀發(fā)布、滾動(dòng)發(fā)布、A/B測(cè)試 原理和實(shí)操

    藍(lán)綠發(fā)布、金絲雀發(fā)布、滾動(dòng)發(fā)布、A/B測(cè)試 ,是大家日常常見(jiàn)的發(fā)布工作。所以 發(fā)布的原理和實(shí)操 是一個(gè) 非常、非常核心的面試知識(shí)點(diǎn) 。 在40歲老架構(gòu)師 尼恩的 讀者交流群 (50+)中,其相關(guān)面試題是一個(gè)非常、非常高頻的交流話題。 只要一面試,基本就會(huì)問(wèn): 對(duì)灰度發(fā)布

    2024年02月04日
    瀏覽(25)
  • 使用AWS和Kubernetes進(jìn)行流程自動(dòng)化:自動(dòng)化部署和監(jiān)控

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和自動(dòng)化技術(shù)正在成為信息技術(shù)行業(yè)的新趨勢(shì)。2017年以來(lái),越來(lái)越多的企業(yè)開(kāi)始采用機(jī)器學(xué)習(xí)技術(shù)解決業(yè)務(wù)上的實(shí)際問(wèn)題。這項(xiàng)技術(shù)的應(yīng)用已經(jīng)從統(tǒng)計(jì)學(xué)模型逐漸轉(zhuǎn)向基于數(shù)據(jù)的分析方法。隨著云計(jì)算技術(shù)的蓬勃發(fā)展,越

    2024年02月07日
    瀏覽(25)
  • jekins自動(dòng)化部署

    jekins自動(dòng)化部署

    為什么要用Jenkins?我說(shuō)下我以前開(kāi)發(fā)的痛點(diǎn),在一些中小型企業(yè),每次開(kāi)發(fā)一個(gè)項(xiàng)目完成后,需要打包部署,可能沒(méi)有專門(mén)的運(yùn)維人員,只能開(kāi)發(fā)人員去把項(xiàng)目打成一個(gè)exe包,可能這個(gè)項(xiàng)目已經(jīng)上線了,需要把服務(wù)關(guān),在部署到服務(wù)器上,將項(xiàng)目啟動(dòng)起來(lái),這個(gè)時(shí)候可能某個(gè)

    2024年02月05日
    瀏覽(41)
  • 前端項(xiàng)目自動(dòng)化部署

    前端項(xiàng)目自動(dòng)化部署

    一、Git倉(cāng)庫(kù)管理項(xiàng)目 二、購(gòu)買(mǎi)云服務(wù)器 三、搭建服務(wù)器環(huán)境(重點(diǎn)) 四、Jenkins進(jìn)行自動(dòng)化部署(重點(diǎn)) 提示:本地項(xiàng)目自動(dòng)化部署流程,如下圖 一、Git倉(cāng)庫(kù)管理項(xiàng)目 Git的安裝和配置在這里就不做說(shuō)明了 1、首先在Git倉(cāng)庫(kù)中創(chuàng)建一個(gè)倉(cāng)庫(kù),用來(lái)保存本地項(xiàng)目,這里使用Git

    2024年02月15日
    瀏覽(21)
  • Github 自動(dòng)化部署

    Github 自動(dòng)化部署

    官方地址 點(diǎn)擊進(jìn)入 注冊(cè)/登錄 .githubworkflows 固定不變 develop.yml 文件名自定義 變量解釋 secrets 是定義在github中的變量 通過(guò) secerts.變量名 來(lái)取值 steps steps 是github action的 create_release 是上一個(gè)步驟的 id outputs.upload_url 是上一個(gè)步驟的返回結(jié)果 倉(cāng)庫(kù)地址:https://github.com/yi-

    2024年02月03日
    瀏覽(22)
  • Docker 自動(dòng)化部署(實(shí)踐)

    Docker 自動(dòng)化部署(實(shí)踐)

    docker search jenkins查看需要的jenkins鏡像源 docker pull jenkins/jenkins 拉取jenkins鏡像 docker images查看下載的鏡像源 docker ps 查看包含啟動(dòng)以及未啟動(dòng)的容器 docker ps -a查看啟動(dòng)的容器 docker rm 容器id/容器名稱 刪除容器 docker rm -f 容器id/容器名稱 刪除容器(強(qiáng)制刪除容器,運(yùn)行狀態(tài)也刪除

    2024年02月07日
    瀏覽(50)
  • Ansible自動(dòng)化部署工具

    Ansible自動(dòng)化部署工具

    1、運(yùn)維工具特點(diǎn) Ansible 與 Saltstack 均是基于 Python 語(yǔ)言開(kāi)發(fā),Ansible 只需要在一臺(tái)普通的服務(wù)器上運(yùn)行即可,不需要在客戶端服務(wù)器上安裝客戶端。因?yàn)?Ansible 是基于 SSH 遠(yuǎn)程管理,而Linux服務(wù)器大都離不開(kāi)SSH,所以Ansible不需要為配置工作添加額外的支持。 Ansible 安裝使用非常

    2024年02月01日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包