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