# 服務的配置選項
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)