---
# System prepended metadata

title: 安裝 Yunikorn
tags: [K8s]

---

# 安裝 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
```