中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Pod的創建和管理

發布時間:2021-12-15 18:52:00 來源:億速云 閱讀:111 作者:柒染 欄目:云計算

這期內容當中小編將會給大家帶來有關如何實現Pod的創建和管理,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Pod同步流程是kubelet進程的核心主流程,下面將分析該主流程中最關鍵的部分--Pod的創建和管理。這部分邏輯封裝在kubeGenericRuntimeManager.SyncPod(kuberuntime_manager.go)方法中,主要執行以下步驟:

  1. 根據從API Server獲得的Pod Spec以及當前Pod的Status計算所需要執行的Actions

  2. 在需要情況下Kill掉當前Pod

  3. 根據需要(如重啟)kill掉pod內的containers

  4. 根據需要創建Pod的sandbox container

  5. 啟動下一個init container

  6. 啟動Pod內的containers

其中比較復雜的步驟解釋如下:

1.computePodActions

對比spec和status,計算出要達到預期狀態所需的actions:

// computePodActions checks whether the pod spec has changed and returns the changes if true.

func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions {

   // 1. 對比sandbox狀態,計算是否需要創建sandbox,以及當前sandbox id

   createPodSandbox, attempt, sandboxID := m.podSandboxChanged(pod, podStatus)

   changes := podActions{

      KillPod:           createPodSandbox,

      CreateSandbox:     createPodSandbox,

      SandboxID:         sandboxID,

      Attempt:           attempt,

      ContainersToStart: []int{},

      ContainersToKill:  make(map[kubecontainer.ContainerID]containerToKillInfo),

   }

 

   // 2. 需要新建sandbox,一旦進入該分支就必定return,之后代碼不再執行

   if createPodSandbox {

      ....

      // 在新建sandbox分支中,若存在init容器,則取第一個,返回

     if len(pod.Spec.InitContainers) != 0 {

         // Pod has init containers, return the first one.

         changes.NextInitContainerToStart = &pod.Spec.InitContainers[0]

         return changes

      }

       

      // 不存在init容器,直接跑工作containers

      for idx, c := range pod.Spec.Containers {

         if containerSucceeded(&c, podStatus) && pod.Spec.RestartPolicy == v1.RestartPolicyOnFailure {

            continue

         }

         changes.ContainersToStart = append(changes.ContainersToStart, idx)

      }

      return changes

   }

 

   // 3. sandbox已運行,啟動init容器。尋找下一個需要執行的init容器

   initLastStatus, next, done := findNextInitContainerToRun(pod, podStatus)

   if !done {

      if next != nil {

         initFailed := initLastStatus != nil && isContainerFailed(initLastStatus)

         if initFailed && !shouldRestartOnFailure(pod) {

            changes.KillPod = true

         else {

            changes.NextInitContainerToStart = next

         }

      }

      // 若init未完成,直接返回

      return changes

   }

 

   // 4. init已完成,計算需要kill&start的工作container

   keepCount := 0

   for idx, container := range pod.Spec.Containers {

   .....

   }

 

   // 5. 是否需要kill pod

   if keepCount == 0 && len(changes.ContainersToStart) == 0 {

      changes.KillPod = true

   }

 

   return changes

}

2. SyncPod

該方法是pod管理的關鍵,實現了本文開頭講的六個步驟:

func (m *kubeGenericRuntimeManager) SyncPod(pod *v1.Pod, _ v1.PodStatus, podStatus *kubecontainer.PodStatus, pullSecrets []v1.Secret, backOff *flowcontrol.Backoff) (result kubecontainer.PodSyncResult) {

   // 1. 計算pod actions,見上文

   podContainerChanges := m.computePodActions(pod, podStatus)

   .....

 

   // 2. 需要情況下執行kill pod

   if podContainerChanges.KillPod {

      ....

      killResult := m.killPodWithSyncResult(pod, kubecontainer.ConvertPodStatusToRunningPod(m.runtimeName, podStatus), nil)

      ....

   else {

      // 3. 不需要kill pod,但需要kill工作container

      for containerID, containerInfo := range podContainerChanges.ContainersToKill {

         ....

         if err := m.killContainer(pod, containerID, containerInfo.name, containerInfo.message, nil); err != nil {

            ...

            return

         }

      }

   }

 

   .....

 

   // 4. 按需創建sandbox

   podSandboxID := podContainerChanges.SandboxID

   if podContainerChanges.CreateSandbox {

      .....

      podSandboxID, msg, err = m.createPodSandbox(pod, podContainerChanges.Attempt)

      ....

   }

 

   ....

 

   // 5. 運行next init container

   if container := podContainerChanges.NextInitContainerToStart; container != nil {

      ....

      if msg, err := m.startContainer(podSandboxID, podSandboxConfig, container, pod, podStatus, pullSecrets, podIP); err != nil {

         startContainerResult.Fail(err, msg)

         utilruntime.HandleError(fmt.Errorf("init container start failed: %v: %s", err, msg))

         return

      }

      ....

   }

 

   // 6. 運行工作containers。注意,根據computePodActions,若NextInitContainerToStart不為空,則不存在ContainersToStart ,即這個循環在當前這個SyncPod中不會被執行

   for _, idx := range podContainerChanges.ContainersToStart {

      ....

      if msg, err := m.startContainer(podSandboxID, podSandboxConfig, container, pod, podStatus, pullSecrets, podIP); err != nil {

         startContainerResult.Fail(err, msg)

         // known errors that are logged in other places are logged at higher levels here to avoid

         // repetitive log spam

         switch {

         case err == images.ErrImagePullBackOff:

            glog.V(3).Infof("container start failed: %v: %s", err, msg)

         default:

            utilruntime.HandleError(fmt.Errorf("container start failed: %v: %s", err, msg))

         }

         continue

      }

   }

 

   return

}

SyncPod中需要特別注意的是:在init containers啟動過程中,SyncPod每次只會運行一個init container(next),之后就返回了。

上述就是小編為大家分享的如何實現Pod的創建和管理了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

pod
AI

扎兰屯市| 乌拉特中旗| 阳江市| 会昌县| 桂林市| 扶沟县| 兰考县| 屏边| 仙游县| 南丰县| 东丽区| 马关县| 闵行区| 郴州市| 麦盖提县| 井冈山市| 南丹县| 奇台县| 板桥市| 绩溪县| 教育| 手游| 泰顺县| 东明县| 化州市| 荣昌县| 蓬莱市| 秭归县| 太谷县| 长海县| 五家渠市| 曲靖市| 胶南市| 额敏县| 麦盖提县| 师宗县| 甘南县| 海晏县| 昭平县| 城市| 乾安县|