---
# System prepended metadata

title: 服務的配置選項
tags: [筆記, Yunikorn]

---

# 服務的配置選項
Yunikorn 的設置分為兩項： Helm chart及 Yunikorn 

## Helm 配置
以非 Helm chart 建立 Yunikorn，紀錄優先順序偏後

## YuniKorn 配置
存在兩個 Yunikorn 的 `ConfigMap` 配置文件： `yunikorn-defaults` 及 `yunikorn-configs`
`yunikorn-defaults` 是在 Helm 管理下的文件，對於以非 Helm chart 的方法來說，若需要更改配置，則應修改 `yunikorn-configs` 這個文件

在實際執行時， k8s 使用的是兩者的結合，但如果其內部有重複定義的屬性，則 `yunikorn-configs` 的值將會覆蓋 `yunikorn-defaults` 的值

### Default ConfigMap
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: yunikorn-configs
data:
  service.clusterId: "mycluster"
  service.policyGroup: "queues"
  service.schedulingInterval: "1s"
  service.volumeBindTimeout: "10s"
  service.eventChannelCapacity: "1048576"
  service.dispatchTimeout: "5m"
  service.disableGangScheduling: "false"
  service.enableConfigHotRefresh: "true"
  service.placeholderImage: "registry.k8s.io/pause:3.7"
  service.instanceTypeNodeLabelKey: "node.kubernetes.io/instance-type"
  health.checkInterval: "30s"
  log.level: "INFO"
  kubernetes.qps: "1000"
  kubernetes.burst: "1000"
  admissionController.webHook.amServiceName: "yunikorn-admission-controller-service"
  admissionController.webHook.schedulerServiceAddress: "yunikorn-service:9080"
  admissionController.filtering.processNamespaces: ""
  admissionController.filtering.bypassNamespaces: "^kube-system$"
  admissionController.filtering.labelNamespaces: ""
  admissionController.filtering.noLabelNamespaces: ""
  admissionController.filtering.generateUniqueAppId: "false"
  admissionController.filtering.defaultQueue: "root.default"
  admissionController.accessControl.bypassAuth: "false"
  admissionController.accessControl.trustControllers: "true"
  admissionController.accessControl.systemUsers: "^system:serviceaccount:kube-system:"
  admissionController.accessControl.externalUsers: ""
  admissionController.accessControl.externalGroups: ""
  queues.yaml: |
    partitions:
      - name: default
        placementrules:
          - name: tag
            value: namespace
            create: true
        queues:
          - name: root
            submitacl: '*'
```

### Service Settings
以下配置除了 `service.enableConfigHotRefresh` 以外，都需重啟 Yunikorn 以套用更新
| 名稱 | 描述 |
| -------- | -------- |
| `service.clusterId` | 定義 cluster 的 id ，會被 REST api 取用 |
| `service.policyGroup` | 定義如 partitions, placeholder 等等分組資訊；會取得指定的 yaml 配置|
| `service.schedulingInterval` | 定義排程頻率 |
| `service.volumeBindTimeout` | 定義綁定 volume 上限時間 |
| `service.eventChannelCapacity` |定義 Yunikorn 的調用事件上限數目|
| `service.dispatchTimeout` |定義重新調度所需時間|
| `service.disableGangScheduling` | 允許全局停用 gang scheduler (不建議)|
| `service.enableConfigHotRefresh` | 定義是否能夠 hot refresh ；若關閉則不確保重新開啟時，Yunikorn 能生效|
| `service.placeholderImage` | 定義用於 gang scheduling placeholders 的 pod iamge |
| `service.instanceTypeNodeLabelKey` | 定義用來判別 node 實例的 label  |

#### service.clusterId
預設為：`mycluster`
修改範例為：
```yaml
service.clusterId: "yunikorn-east"
```
#### service.policyGroup
預設為：`queues`
修改範例為：
```yaml
service.policyGroup: group_b
group_b.yaml: |
    partitions:
      - name: default
        placementrules:
          - name: tag
            value: namespace
            create: true
        queues:
          - name: root
            submitacl: '*'
```
#### service.schedulingInterval
預設值為： `1s`
修改範例為：
```yaml
service.schedulingInterval: "5s"
```
#### service.volumeBindTimeout
預設值為： `10s`
修改範例為：
```yaml
service.volumeBindTimeout: "30s"
```
#### service.eventChannelCapacity
預設值為： `1048576`
修改範例為：
```yaml
service.eventChannelCapacity: "1000000"
```
#### service.dispatchTimeout
預設值為： `5m`
修改範例為：
```yaml
service.dispatchTimeout: "10m"
```
#### service.disableGangScheduling
預設值為： `false`
修改範例為：
```yaml
service.disableGangScheduling: "true"
```
#### service.enableConfigHotRefresh
預設值為： `true`
修改範例為：
```yaml
service.enableConfigHotRefresh: "false"
```
#### service.placeholderImage
預設值為： `registry.k8s.io/pause:3.7`
修改範例為：
```yaml
service.placeholderImage: "registry.k8s.io/pause:3.6"
```
#### service.instanceTypeNodeLabelKey
預設值為： `node.kubernetes.io/instance-type`
修改範例為：
```yaml
service.instanceTypeNodeLabelKey: "node.kubernetes.io/my-instance-type"
```

### Health settings
#### health.checkInterval
設定 health 的自動檢查間隔時間，如果設定為 0 或以下，則代表 disable
需重啟 Yunikorn 以套用更新

預設值：`30s`
修改範例：
```yaml
health.checkInterval: "1m"
```

### Logs setting
#### log.level
設定 log 的詳細程度，可修改為數字或文字
可修改值為：

- -1 / debug / DEBUG
- 0 / info / INFO
- 1 / warn / WARN
- 2 / error / ERROR
- 3 / dpanic / DPANIC
- 4 / panic / PANIC
- 5 / fatal / FATAL

不需重啟 Yunikorn 即可套用更新

預設值：`INFO`
修改範例：
```yaml
log.level: "DEBUG"
```

#### log.{subsystem}.level
設定對於[子系統](#子系統)的 log 的詳細程度，可修改為數字或文字，可修改值與 log.level 相同
舉個例子：設定 log.core.level 條目將配置以 core 開頭的所有 log (包括 core.scheduler 等)
不需重啟 Yunikorn 即可套用更新

預設值：`INFO`
修改範例：
```yaml
log.level: "INFO"
log.admission.level: "DEBUG"
log.core.config.level: "INFO"
```

### Kubernetes settings
#### kubernetes.qps
設定每秒查詢數(QPS)的上限，該數字必須 >= 0
需重啟 Yunikorn 以套用更新

預設值：`1000`
修改範例：
```yaml
kubernetes.qps: "500"
```
#### kubernetes.burst
設定 Kubernetes 突發查詢的上限，暫時允許事件突發到該數量，同時不超過 kubernetes.qps
需重啟 Yunikorn 以套用更新

預設值：`1000`
修改範例：
```yaml
kubernetes.burst: "500"
```

### Admission controller webhook settings
#### admissionController.webHook.amServiceName
設定 Admission Controller 在 k8s 內的 service 名稱，通常不用更改
需重啟 Yunikorn 以套用更新

預設值：`yunikorn-admission-controller-service`
修改範例：
```yaml
admissionController.webHook.amServiceName: "yunikorn-admission-controller-alt-service-name"
```

#### admissionController.webHook.schedulerServiceAddress
設定 yunikorn scheduler 的 service address ，使得 Admission Controller 在驗證 ConfigMap 時可以使用，通常不用更改
需重啟 Yunikorn 以套用更新

預設值：`yunikorn-service:9080`
修改範例：
```yaml
admissionController.webHook.schedulerServiceAddress: "alt-yunikorn-service:9080"
```

### Admission controller filtering settings

| 名稱 | 描述 |
| -------- | -------- |
| `admissionController.filtering.processNamespaces` | 定義將被 Yunikorn 排程的命名空間 |
| `admissionController.filtering.bypassNamespaces` | 定義將不被 Yunikorn 排程的命名空間|
| `admissionController.filtering.labelNamespaces` | 定義 pod 擁有 label 的命名空間 |
| `admissionController.filtering.noLabelNamespaces` | 定義 pod 不擁有 label 的命名空間|
| `admissionController.filtering.generateUniqueAppId` |定義是否產生 applicationId|
| `admissionController.filtering.defaultQueue` |定義 application 的預設 queue|

#### admissionController.filtering.processNamespaces
預設值：empty
修改範例：
```yaml
# Schedule only pods in spark-* and mpi-* namespaces with YuniKorn
admissionController.filtering.processNamespaces: "^spark-,^mpi-"
```

#### admissionController.filtering.bypassNamespaces
預設值：`^kube-system$`
修改範例：
```yaml
# Don't schedule pods in kube-system or fluentd-* namespaces
admissionController.filtering.bypassNamespaces: "^kube-system$,^fluentd-"
```
> NOTE :
> 可以在命名空間的配置文檔加上 `yunikorn.apache.org/namespace.enableYunikorn` 的 annotation ，這樣可以更直觀的確認當前命名空間是否交由 Yunikorn 排程

#### admissionController.filtering.labelNamespaces
Yunikorn 只會排程擁有 `applicationId` 這個 label 的 pod，使用標準模式時，每個 pod 都應擁有 `applicationId` 這個 label，因此這個屬性**只適合插入模式**，這樣才知道哪些 pod 該給 Yunikorn 排程

預設值：empty
修改範例：
```yaml
# Add applicationId labels to pods spark-* namespaces
admissionController.filtering.labelNamespaces: "^spark-"
```

#### admissionController.filtering.nolabelNamespaces
Yunikorn 只會排程擁有 `applicationId` 這個 label 的 pod，使用標準模式時，每個 pod 都應擁有 `applicationId` 這個 label，因此這個屬性**只適合插入模式**，這樣才知道哪些 pod 該給 Yunikorn 排程

預設值：empty
修改範例：
```yaml
# Skip queueing in the noqueue namespace
admissionController.filtering.labelNamespaces: "^noqueue$"
```
> NOTE :
> 可以在命名空間的配置文檔加上 `yunikorn.apache.org/namespace.generateAppId` 的 annotation ，這樣可以更直觀的確認當前命名空間是否交由 Yunikorn 排程

#### admissionController.filtering.generateUniqueAppId
此屬性決定了在同一個命名空間下，是否對每個 application 產生 applicationId，在預設情況下，同一個命名空間應只包含一個 applicationId
如果開啟 `applicationid` 則會包含命名空間及 pod 的 uid

預設值：`false`
修改範例：
```yaml
admissionController.filtering.generateUniqueAppId: "true"
```

#### admissionController.filtering.defaultQueue
修改的 queue 名稱應該是完全可用的(fully qualified)

當預設 queue 的名字為空時，將會使用 Placement Rules 下去配對相應的 queue 名字

預設值：`root.default`
修改範例：
```yaml
# Change default queue to root.mydefault
admissionController.filtering.defaultQueue: "root.mydefault"
```
或者
```yaml
# Skip adding default queue name
admissionController.filtering.defaultQueue: ""
```

### Admission controller ACL settings


| 名稱 | 描述 |
| -------- | -------- |
| `admissionController.accessControl.bypassAuth` | 允許外部使用已定義使用者部署 pod |
| `admissionController.accessControl.trustControllers` | 允許管理員使用已定義使用者部署 pod|
| `admissionController.accessControl.systemUsers` | 定義管理員身分的 ServiceAccount |
| `admissionController.accessControl.externalUsers` | 定義允許的外部 user|
| `admissionController.accessControl.externalGroups` | 定義允許的外部 group|


#### admissionController.accessControl.bypassAuth
預設值：`false`
修改範例：
```yaml
admissionController.accessControl.bypassAuth: "true"
```
#### admissionController.accessControl.trustControllers
預設值：`true`
修改範例：
```yaml
admissionController.accessControl.trustControllers: "false"
```
#### admissionController.accessControl.systemUsers
預設值：`^system:serviceaccount:kube-system:`
修改範例：
```yaml
# allow all kube-system accounts as well as kube-controller-manager
admissionController.accessControl.systemUsers: 
    "^system:serviceaccount:kube-system, ^system:kube-controller-manager$"
```

#### admissionController.accessControl.externalUsers
預設值：empty
修改範例：
```yaml
# allow 'alice', 'bob', and 'admin-*'
admissionController.accessControl.externalUsers: "^alice$,^bob$,^admin-"
```

#### admissionController.accessControl.externalGroups
預設值：empty
修改範例：
```yaml
# allow 'sales', 'marketing', and 'admin-*'
admissionController.accessControl.externalGroups: "^sales$,^marketing$,^admin-"
```

### 使用壓縮資料
由於 ConfigMap 的大小不能超過 1 MiB， Yunikorn 支援資料使用 gzip 演算法壓縮
當配置文件內有 `.gz` 結尾的屬性時， Yunikorn 會自動使用 gzip 解壓縮，並用 base64 做編碼

而如果配置文件內有 `data` 及 `binaryData` 時， Yunikorn 會使用 `binaryData`

範例：
可以使用已下指令得到壓縮資料
```bash
echo "
partitions:
  - name: default
    queues:
      - name: root
        submitacl: '*'
        parent: true
        queues:
          - name: parent
            submitacl: '*'" | gzip | base64
```

並將其結果放置於 `binaryData` 的 field 下面
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: yunikorn-configs
binaryData:
  queues.yaml.gz: "H4sIAMyHs2UAA2WMSQ6AIBAE77yibyQmfoDfoI4JCYvCzP/FjWDsY3Wl1GYzO3YpFqOAEdEGMlhoteK5EmAXErrec6+RU+IHAUWm4NjO3kAPuuHapsgGnIUa/Ob65K13xy98AFwE9HmuAAAA"
```

### 子系統
可使用的 subsystem 有以下：
- admission
- admission.client
- admission.conf
- admission.utils
- admission.webhook
- core
- core.config
- core.entrypoint
- core.events
- core.metrics
- core.opentracing
- core.resources
- core.rest
- core.rmproxy
- core.rpc
- core.scheduler
- core.scheduler.allocation
- core.scheduler.application
- core.scheduler.application.usage
- core.scheduler.context
- core.scheduler.fsm
- core.scheduler.health
- core.scheduler.node
- core.scheduler.partition
- core.scheduler.preemption
- core.scheduler.queue
- core.scheduler.reservation
- core.scheduler.ugm
- core.security
- core.utils
- deprecation
- kubernetes
- shim
- shim.appmgmt
- shim.appmgmt.general
- shim.appmgmt.sparkoperator
- shim.cache.application
- shim.cache.external
- shim.cache.node
- shim.cache.placeholder
- shim.cache.task
- shim.client
- shim.config
- shim.context
- shim.dispatcher
- shim.framework
- shim.fsm
- shim.predicates
- shim.resources
- shim.rmcallback
- shim.scheduler
- shim.scheduler.plugin
- shim.utils

---
[官方文檔連結](https://yunikorn.apache.org/docs/user_guide/service_config)