---
# System prepended metadata

title: Apache YuniKorn 開源專案貢獻紀錄
tags: [Blue 的學習紀錄]

---

---
tags: Blue 的學習紀錄
---

# YuniKorn 簡介

Doc:
<https://yunikorn.apache.org/docs/next/>

Github:
<https://github.com/search?q=org%3Aapache+yunikorn&type=repositories>

YuniKorn 是一個 resource scheduler for K8s
用於取代 K8s 中的 [default scheduler](https://kubernetes.io/docs/concepts/architecture/#kube-scheduler)
達成 default scheduler 所做不到的事情

:::info
**Scheduler 的作用：**
Scheduler 是 K8s 中的一個元件，負責決定 Pods 要部署在哪個 Node
Scheduler 在做的事情可以簡單拆分成兩階段: Filtering 和 Scoring

- Filtering: 將符合條件的 Node 篩選出來，例如根據 Node 的 cpu or memory 資源是否足夠
- Scoring: 對篩選出來的 Node 打分數，選出一個分數最高的 Node

[Kubernetes Documentation - Kubernetes Scheduler](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/)
:::

YuniKorn 實作了 default scheduler 不支援的功能

- Application 的概念
  當使用者定義複數個 pods 為一個 app 時
  YuniKorn 可以確保全部的 pods 都部署成功或者都失敗(All or Nothing)
  避免只有部分 pods 成功部署的情形
- Queue
  使用者可以定義 queue
  每個 queue 可以設定其資源(cpu, memory)的使用上限

# My PRs

我發出過的 PR:
https://github.com/search?q=org%3Aapache+yunikorn+is%3Apr+author%3AblueBlue0102&type=pullrequests

# 專案結構簡介

- [yunikorn-core](https://github.com/apache/yunikorn-core/pulls?q=is%3Apr+author%3AblueBlue0102+)
  YuniKorn 的資源排程核心邏輯
  可以理解成是一個 library，目前於 K8shim 專案中被引用
- [yunikorn-k8shim](https://github.com/apache/yunikorn-k8shim/pulls?q=is%3Apr+author%3AblueBlue0102+)
  YuniKorn 與 K8s 溝通的元件
  負責監聽 K8s 的事件，例如 pods 的增加或刪除
  收到事件交由 core 判斷後，呼叫 K8s 的 API 進行相應的處理
- [yunikorn-scheduler-interface](https://github.com/apache/yunikorn-scheduler-interface/pulls?q=is%3Apr+author%3AblueBlue0102+)
  定義 YuniKorn core 與 shim 之間的溝通介面
  這樣的設計使 core 與 shim 之間沒有依賴關係
  讓 YuniKorn 可以不限於使用在 K8s 上
- [yunikorn-release](https://github.com/apache/yunikorn-release/pulls?q=is%3Apr+author%3AblueBlue0102+)
  負責包版 YuniKorn，提供例如 Helm Chart 的模板
- [yunikorn-site](https://github.com/apache/yunikorn-site/pulls?q=is%3Apr+author%3AblueBlue0102+)
  官方文件
- [yunikorn-web](https://github.com/apache/yunikorn-web/pulls?q=is%3Apr+author%3AblueBlue0102+)
  一個 Dashboard Web 介面
  會讀取並顯示 YuniKorn 的相關資訊
  例如 app, node 或 queue 等等的資訊

# 研究筆記

- [K8shim 和 Core 之間的溝通方式（RMProxy）](https://hackmd.io/@vegetableBird/r1wtFbwh0)
- [App State Scheduling](https://hackmd.io/@vegetableBird/Bk9EoCLsA)
- [Gang Scheduling](https://hackmd.io/@vegetableBird/S1tVS52oC)
- [Placeholder Pod 運作方式](https://hackmd.io/@vegetableBird/BklErnC6A)
- [Jira 2737](https://hackmd.io/@vegetableBird/HJMS3Tk60)
- Go Module 是否使用 `replace` hardcode 指定 version，還是讓 `go mod` 來管理？（待研究）
  討論串: <https://github.com/apache/yunikorn-k8shim/pull/794>
  在 YK 中部份套件會在 `replace` 區塊中指定套件的版本
  這個做法的好處似乎在於可以避免不經意的更新導致的失敗
- YK 是否支援 cluster autoscaling?
  是
  YK 是一個 scheduler，當 pod 因沒有資源而無法成功部署時，只負責將 pod mark 為 `unscheduable`: [Link](https://github.com/apache/yunikorn-k8shim/blob/a53123f2d0bb3fd325dd7f8c1f2cc4640ff448d7/pkg/cache/context.go#L1204)
  node 的 scale 是由 Cluster Autoscaler 或 Karpenter 等其他元件執行
- [Verifying Apache Project Release (YuniKorn)](https://hackmd.io/@vegetableBird/Sy-zEKOvkx)
- [【閱讀紀錄】Next Level Spark on Kubernetes with Apache YuniKorn (Incubating) - Weiwei Yang, Chaoran Yu](https://hackmd.io/@vegetableBird/r1vKtBkuyx)

# 參考資訊

- [Next Level Spark on Kubernetes with Apache YuniKorn (Incubating) - Weiwei Yang, Chaoran Yu](https://youtu.be/gOST-iT-hj8?si=6VX5j6BGr2K0sfLj)
- [State of Apache YuniKorn - 2024 CoC Aisa](https://docs.google.com/presentation/d/1eOqlN07u1CZwNICg3NYvh0_3i-80i7Y0/edit?usp=sharing&ouid=109715795571680355892&rtpof=true&sd=true)
- [JIMMY SONG 整理的 K8s 電子書](https://lib.jimmysong.io/kubernetes-handbook/)
- [K8s scheduler 詳解](https://kingjcy.github.io/post/cloud/paas/base/kubernetes/k8s-scheduler/)
- Slack Spark 相關資訊連結
  - <https://opensource4you.slack.com/archives/C05PH5KB7NZ/p1710517002938709?thread_ts=1710512247.452449&cid=C05PH5KB7NZ>
  - <https://opensource4you.slack.com/archives/C05PH5KB7NZ/p1717430092634669?thread_ts=1717429769.318569&cid=C05PH5KB7NZ>