# 安裝 Yunikorn - 本文將在版本為 **1.29.4** 的 k8s 安裝版本為 **1.5** 的 Yunikorn ## 前置作業 ### 安裝 golang 去 [go 官網](https://go.dev/doc/install) 抓下來 ```bash wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin ``` 可以用 `go version` 來檢查 ### 確保使用者可以使用 docker 指令 使用指令 `sudo adduser <username> docker` 讓指定 user 可以使用 docker 指令 ## 安裝 Yunikorn-k8shim 到 [yunikorn-k8shim](https://github.com/apache/yunikorn-k8shim) 複製 url,並 `git clone` ```bash git clone https://github.com/apache/yunikorn-k8shim.git ``` ### 改變 image 參考位置 Yunikorn 預設使用的 docker image 並不是官方事先處理好的 image ,而是需要通過 Makefile build 的 image 因此,如果需要使用 Yunikorn 官方的 image ,則需要去修改 **deployments/scheduler** 內的 yaml 檔案 首先先取得 [Yunikorn 官方 image](https://hub.docker.com/r/apache/yunikorn/tags) 的 NAME:TAG ,對於版本 1.5 ,會需要的有: - apache/yunikorn:web-1.5.0 - apache/yunikorn:scheduler-1.5.0 - apache/yunikorn:admission-1.5.0 而需要修改的 yaml 檔案為以下兩個: - scheduler-load.yaml(已修改過) ![image](https://hackmd.io/_uploads/Skz67o3bA.png) - admission-controller.yaml(已修改過) ![image](https://hackmd.io/_uploads/BJ4tXoh-C.png) ## 部署到 k8s 在 `yunikorn-k8shim/` 下,使用以下指令部屬指定 yaml 檔 ```bash kubectl create -f deployments/scheduler/yunikorn-rbac.yaml -n yunikorn cd deployments/scheduler kubectl create configmap yunikorn-configs --from-file=yunikorn-configs.yaml -n yunikorn cd ../.. kubectl create -f deployments/scheduler/scheduler-load.yaml -n yunikorn kubectl create -f deployments/scheduler/admission-controller-rbac.yaml -n yunikorn kubectl create -f deployments/scheduler/admission-controller-secrets.yaml -n yunikorn kubectl create -f deployments/scheduler/admission-controller.yaml -n yunikorn ``` 可以使用 `kubectl get all -n yunikorn` 來檢查 ![image](https://hackmd.io/_uploads/S1LvC33ZC.png) 若需要砍掉重來,則把上述指令的 `create` 換成 `delete` 就行,也就是說 ```bash kubectl delete -f deployments/scheduler/yunikorn-rbac.yaml -n yunikorn cd deployments/scheduler kubectl delete configmap yunikorn-configs -n yunikorn cd ../.. kubectl delete -f deployments/scheduler/scheduler-load.yaml -n yunikorn kubectl delete -f deployments/scheduler/admission-controller-rbac.yaml -n yunikorn kubectl delete -f deployments/scheduler/admission-controller-secrets.yaml -n yunikorn kubectl delete -f deployments/scheduler/admission-controller.yaml -n yunikorn ``` ## 使用自己的 docker image ### 登入 docker 如果不確定當前機器是否登入過 docker ,可以先 `docker logout` 以 `docker login` 登入 ### 修改 Makefile 檔案 將 `REGISTRY` 的值改成自己的 docker user name ![image](https://hackmd.io/_uploads/HyWAXp2ZA.png) ### build docker image 在 `yunikorn-k8shim/` 下面執行 `make image` 可以使用下列指令來檢查是否成功 ``` docker inspect <dockerusername>/yunikorn:scheduler-amd64-latest docker inspect <dockerusername>/yunikorn:scheduler-plugin-amd64-latest docker inspect <dockerusername>/yunikorn:admission-amd64-latest ``` ### 推送 docker image 使用 `docker push` 將 image 推送到 Docker hub,之後就能拉下來用了 ### 處理 web image 剛剛做的只有處理到 `scheduler` 及 `admission` 這兩個 image 而已,至於 web 的 image 則要通過另一個 respority: [apache/yunikorn-web](https://github.com/apache/yunikorn-web/tree/branch-1.5) 下的 Makefile 來 build `git clone https://github.com/apache/yunikorn-web.git` 接下來就跟上面做的一樣: - 到 `yunikorn-web/` 下 - 到 Makefile 裡修改 `REGISTRY` 的值 - 執行 `make image` - 推送 docker iamge ### 替換成自己的 image 與上面[改變 image 參考位置](#改變-image-參考位置) 相同,修改 `yunikorn-k8shim/deployments/scheduler` 下的 `scheduler-load.yaml` 及 `admission-controller.yaml`,將他們的 image 更改為剛剛推上去的那三個 image 接著就與[部署到 k8s](#部署到-k8s)相同了 ## 造訪 yunikorn web UI 執行以下指令讓 web UI 的 port 暴露出來 ``` kubectl port-forward svc/yunikorn-service 9889 -n yunikorn --address=<機器ip> ``` 接著造訪 <機器ip>:9889 就能看到 yunikorn 的 web ui 了 # 可能出現的問題 ## make image 失敗 ![image](https://hackmd.io/_uploads/SygZM5T2-R.png) ### 原因 在執行 make image 時,若當前 user 不能執行 docker 指令的話,就會出現 premission denied 但如果使用 sudo 執行的話, root 會因為讀不到 go 的路徑而報錯 ### 解決方法 執行 `sudo adduser <username> docker` ,將該 user 加進 docker 的群組裡,使其能夠使用 docker 指令 ## yunikorn-admission-controller 的 pod 遲遲沒有 READY ![image](https://hackmd.io/_uploads/H1SEhT2bC.png) ### 原因 `admission-controller-rbac.yaml` 與 `yunikorn-rbac.yaml` 內的 ServiceAccount 都有指定命名空間為 `yunikorn` 如果部署時命名空間不是 `yunikorn`,那麼 pod 將沒有權限去做某些事,自然會出問題 ### 解決方法 在部署時,加上 `-n yunikorn` 來指定命名空間 ## yunikorn 的 pod 出現 ErrImagepull ![image](https://hackmd.io/_uploads/ryPskA3bR.png) ### 原因 部署的文件上指定的 image 在拉取時失敗,可能是指定到錯的 image ### 解決方法 檢查 `yunikorn-k8shim/deployments/scheduler` 下的 `scheduler-load.yaml` 及 `admission-controller.yaml` 是否正確 ![image](https://hackmd.io/_uploads/S1u57CfP0.png) ## make run 失敗 ### 原因 從 error message 發現,在 `mkdir` 時出現權限問題,再往下搜尋會發現當前 go 這個 dir 的所有者是 root ,而不是 user ,因此不使用 sudo 的話就沒辦法在 root 所屬的 dir 下新增 dir ### 解決方法 - 發現 go 的 所有者是 root ![image](https://hackmd.io/_uploads/HyWmNRzvA.png) - 以下指令將 go 這個 dir 改為 user 所有 ``` sudo chown -R user:user /home/user/go ```