K8S ReplicaSet & ReplicationController

K8S ReplicaSet & ReplicationController

RC是RS的老版本API,代碼都是一份。

For RC, the objects are converted on the way in and out (see ../replication/), as if ReplicationController were just an older API version of ReplicaSet. However, RC and RS still have separate storage and separate instantiations of the ReplicaSetController object.

type ReplicationManager struct {
    replicaset.ReplicaSetController
}

code

K8S controller基本都是一個套路,通過Informer注冊事件處理函數(shù),Add事件處理都是將ev入隊;
controller的run方法會啟動一個goroutine,每隔一秒消費queue。所以跳過上述步驟,直接進入同步邏輯。

func (rsc *ReplicaSetController) syncReplicaSet(key string) error {
    namespace, name, err := cache.SplitMetaNamespaceKey(key)
    rs, err := rsc.rsLister.ReplicaSets(namespace).Get(name)
    
    // 貌似每個controller都會很暴力的獲取全量Pods,這個有點狠,為什么不加點過濾條件呢?
    // 內(nèi)存選出rs selector的Pods
    allPods, err := rsc.podLister.Pods(rs.Namespace).List(labels.Everything())
    for _, pod := range allPods {
        if controller.IsPodActive(pod) {
            filteredPods = append(filteredPods, pod)
        }
    }
    filteredPods, err = rsc.claimPods(rs, selector, filteredPods)
    
    // 老套路,管理Pods,使之達到預(yù)期
    rsc.manageReplicas(filteredPods, rs)
}

func (rsc *ReplicaSetController) manageReplicas(filteredPods []*v1.Pod, rs *apps.ReplicaSet) error {
    diff := len(filteredPods) - int(*(rs.Spec.Replicas))
    rsKey, err := controller.KeyFunc(rs)
    
    if diff < 0 {
        // "Too few replicas for %v %s/%s, need %d, creating %d", rsc.Kind, rs.Namespace, rs.Name, *(rs.Spec.Replicas), diff
        // batch create, 所有controller都這樣,類似TCP擁塞控制,并發(fā)創(chuàng)建1,2,4。。。
        successfulCreations, err := slowStartBatch(diff, controller.SlowStartInitialBatchSize, func() error {
            boolPtr := func(b bool) *bool { return &b }
            controllerRef := &metav1.OwnerReference{
                APIVersion:         rsc.GroupVersion().String(),
                Kind:               rsc.Kind,
                Name:               rs.Name,
                UID:                rs.UID,
                BlockOwnerDeletion: boolPtr(true),
                Controller:         boolPtr(true),
            }
            err := rsc.podControl.CreatePodsWithControllerRef(rs.Namespace, &rs.Spec.Template, rs, controllerRef)
        })        
    } else if diff > 0 {
        // "Too many replicas for %v %s/%s, need %d, deleting %d", rsc.Kind, rs.Namespace, rs.Name, *(rs.Spec.Replicas), diff
        
        // Choose which Pods to delete, preferring those in earlier phases of startup.
        podsToDelete := getPodsToDelete(filteredPods, diff)
        
        for _, pod := range podsToDelete {
            go func(targetPod *v1.Pod) {
                err := rsc.podControl.DeletePod(rs.Namespace, targetPod.Name, rs); 
            }(pod)
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,424評論 0 10
  • (一) 嚴禁酒駕、醉駕 過年期間,收到單位領(lǐng)導(dǎo)逐級轉(zhuǎn)發(fā)重申嚴禁酒駕、醉駕的有關(guān)規(guī)定,在國家法律的基礎(chǔ)...
    千年蒙塵閱讀 848評論 0 1
  • 在移動互聯(lián)網(wǎng)時代,可能的風口和或許的機遇還有許多,只是首要目的就是讓用戶們忘記貼在身上的門戶標簽。 文/張書樂 2...
    張書樂閱讀 947評論 0 51
  • 美西旅行,最期待的一站是斯坦福和硅谷,基本就作為一個Passer路過,但是還是有很多感觸(PS:加了兩個華人的微信...
    i王云鵬閱讀 707評論 0 51
  • jquery動畫 通過animate方法可以設(shè)置元素某屬性值上的動畫,可以設(shè)置一個或多個屬性值,動畫執(zhí)行完成后會執(zhí)...
    2simple閱讀 321評論 0 0