Ubuntu 22.04 安装 Apache YuniKorn 1.10.0 指南

在 Ubuntu 22.04 上从零部署 Apache YuniKorn 1.10.0 调度器,基于 k3s 与 Helm 完成安装,涵盖版本选型、部署步骤、功能验证、配置说明与卸载方式,全部命令经真实环境实测。

Apache YuniKornApache YuniKorn2026/10/12

Ubuntu 22.04 安装 Apache YuniKorn 1.10.0 指南

一、环境信息

项目值
操作系统Ubuntu 22.04.5 LTS(x86_64)
服务器规格建议2 核 CPU、4GB 内存起(本文实测机 12 核、32GB 内存)
YuniKorn 版本1.10.0(官方最新稳定版)
Kubernetes 版本v1.36.5+k3s1(k3s stable 通道)
Helm 版本v3.22.0
部署形态k3s 单节点集群 + Helm Chart 安装 YuniKorn
主要端口9889(Web UI)、9080(REST 与 UI 代理)、443(Admission Controller Webhook)
执行账号root

YuniKorn 1.10.0 的调度器、准入控制器与 Web UI 均为 Go 编译的二进制程序,随官方 Helm Chart 以 Pod 方式运行在 Kubernetes 集群内,本指南在 Ubuntu 22.04 服务器上以 k3s 作为最小可用的 Kubernetes 环境完成 0 到 1 部署。

二、前置条件

  1. 可以 root 登录服务器,内核支持 systemd。
  2. 服务器可访问以下下载源(实测均可达):
    • https://get.k3s.io(k3s 安装脚本)
    • https://github.com/k3s-io/k3s/releases(k3s 二进制)
    • https://get.helm.sh(Helm 发行包)
    • https://apache.github.io/yunikorn-release(YuniKorn 官方 Helm 仓库)
    • 公共 image 仓库(拉取 apache/yunikorn 官方组件 image)
  3. 以下端口未被占用:6443(Kubernetes API)、9889、9080。
  4. 检查系统与端口:
cat /etc/os-release | head -2

实测回显:

PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
ss -lntp | grep -E ':6443|:9889|:9080' || echo "端口未被占用"

实测回显:

端口未被占用

三、版本选型说明

  1. YuniKorn 官方站点(yunikorn.apache.org)当前最新稳定版为 1.10.0,GitHub 仓库 apache/yunikorn-core 对应 release v1.10.0 发布于 2026-10-06,本文全部实测基于该版本,REST 接口 GET /ws/v1/clusters 返回的 buildVersion 字段实测值为 1.10.0。
  2. 官方 Kubernetes 兼容矩阵(Get Started 站点 Version 页面):Kubernetes 1.36.x 自 YuniKorn 1.10.0 起支持,1.28.x 至 1.35.x 在更早版本已支持且未标注终止。本文选用 k3s v1.36.5+k3s1(2026-10-12 时 get.k3s.io 的 stable 通道版本),在官方支持矩阵内。
  3. 重要口径:YuniKorn 1.x 官方仅提供 Kubernetes 独立调度器(standalone scheduler)部署方式。1.10.0 官方源码发行包 apache-yunikorn-1.10.0-src.tar.gz 中仅包含 core、k8shim、scheduler-interface、web、helm-charts 五个模块,均为 Go 实现,不含任何 YARN 集成组件;早期版本的 YARN shim 自 1.0.0 起已从官方发行物中移除。因此本指南不涉及 YARN,也不涉及任何 JVM 堆参数(组件无 -Xms/-Xmx 概念),内存管控方式见「五、配置说明」。
  4. Helm 选择 v3.22.0(v3 最新版),官方文档推荐 Helm 3 及以上。

四、部署步骤

以下步骤均在 root 账号下执行,命令逐条执行。

4.1 安装基础工具

apt-get update -qq
apt-get install -y -qq curl ca-certificates

安装后确认 curl 可用:

curl -V | head -1

实测回显:

curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.7 zstd/1.5.5 libidn2/2.3.3 libpsl/0.21.0 (+libidn2/2.3.3) libssh/0.10.6/openssl/zlib nghttp2/1.52.0 librtmp/2.3 OpenLDAP/2.5.18

4.2 安装 k3s(单节点 Kubernetes)

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable=traefik --disable=metrics-server --write-kubeconfig-mode=644" sh -s - server

安装脚本会自动下载 k3s 二进制、创建 systemd 服务并启动。确认服务状态(systemctl 每次只检查一个单元):

systemctl is-active k3s

实测回显:

active

查看节点是否就绪:

k3s kubectl get nodes

实测回显:

NAME           STATUS   ROLES           AGE   VERSION
b76ff320bc96   Ready    control-plane   88m   v1.36.5+k3s1

节点名称与本机 IP 因环境而异,状态为 Ready 即可。

4.3 安装 Helm 3

curl -sfL https://get.helm.sh/helm-v3.22.0-linux-amd64.tar.gz -o /tmp/helm.tgz
tar -C /tmp -xzf /tmp/helm.tgz
install /tmp/linux-amd64/helm /usr/local/bin/helm

确认版本:

helm version

实测回显:

version.BuildInfo{Version:"v3.22.0", GitCommit:"144ca65f8501953fa8b41cd1d37c7223051c85b7", GitTreeState:"clean", GoVersion:"go1.26.8"}

4.4 添加 YuniKorn 官方 Helm 仓库

helm repo add yunikorn https://apache.github.io/yunikorn-release

实测回显:

"yunikorn" has been added to your repositories
helm repo update
helm search repo yunikorn --versions | head -3

实测回显:

NAME                    CHART VERSION   APP VERSION     DESCRIPTION
yunikorn/yunikorn       1.10.0          1.10.0          YuniKorn scheduler for Kubernetes
yunikorn/yunikorn       1.9.0           1.9.0           YuniKorn scheduler for Kubernetes

4.5 部署 YuniKorn 1.10.0

本文实测采用如下资源限制:调度器 requests 256Mi、limits 512Mi;准入控制器 requests 128Mi、limits 256Mi;Web UI limits 256Mi。三项组件 image 拉取策略统一设为 IfNotPresent(Chart 默认 Always,联网服务器两者均可):

helm install yunikorn yunikorn/yunikorn -n yunikorn --create-namespace --set image.pullPolicy=IfNotPresent --set admissionController.image.pullPolicy=IfNotPresent --set web.image.pullPolicy=IfNotPresent --set resources.requests.memory=256Mi --set resources.limits.memory=512Mi --set admissionController.resources.requests.memory=128Mi --set admissionController.resources.limits.memory=256Mi --set web.resources.limits.memory=256Mi

实测回显(部署时间因执行时刻不同而异):

NAME: yunikorn
NAMESPACE: yunikorn
STATUS: deployed
REVISION: 1
TEST SUITE: None

4.6 验证部署

等待 Pod 全部就绪后查看组件状态:

k3s kubectl get pods -n yunikorn -o wide

实测回显:

NAME                                             READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
yunikorn-admission-controller-68bf995696-pjb5w   1/1     Running   0          55s   172.17.0.15    b76ff320bc96   <none>           <none>
yunikorn-scheduler-d895d94f5-rvkw2               2/2     Running   0          61s   10.42.0.64     b76ff320bc96   <none>           <none>

调度器 Pod 内含两个业务 Pod:yunikorn-scheduler-k8s(调度器与 REST 服务)与 yunikorn-scheduler-web(Web UI)。

查看服务:

k3s kubectl get svc -n yunikorn

实测回显:

NAME                                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
yunikorn-admission-controller-service   ClusterIP   10.43.73.29   <none>        443/TCP             86m
yunikorn-service                        ClusterIP   10.43.17.0    <none>        9080/TCP,9889/TCP   86m

通过端口转发在服务器本机访问 REST 接口验证:

k3s kubectl port-forward -n yunikorn svc/yunikorn-service 9080:9080 --address=127.0.0.1

保持该命令运行,另开一个终端执行:

curl -s http://127.0.0.1:9080/ws/v1/clusters

实测回显(JSON 较长,此处截取关键字段):

{"buildVersion":"1.10.0","buildDate":"2026-09-29","goVersion":"1.26.7","rmId":"mycluster","clusterName":"kubernetes","rmBuildInformation":[{"buildDate":"2026-09-29T00:36:22+00:00","buildVersion":"1.10.0","coreSHA":"d345f41c50c46e65d826413c7e8f166b5e88b469","k8shimSHA":"7ed87e947c71b4ab4c7bf4294a299e62e87362a3","version":"1.10.0"}],"partition":"[default]default"……}

buildVersion 为 1.10.0 说明调度器已正常工作。Web UI 验证:

k3s kubectl port-forward -n yunikorn svc/yunikorn-service 9889:9889 --address=0.0.0.0

浏览器访问 http://<服务器IP>:9889/,页面标题为 YuniKorn UI。

4.7 验证调度功能

创建一个带 YuniKorn 应用标签的测试 Pod(使用集群内已有的 pause image,避免外网依赖):

cat > /tmp/app-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: sleep-job-1
  labels:
    app: sleep
    yunikorn.apache.org/app-id: app-sleep-0001
    yunikorn.apache.org/queue: root.default
spec:
  restartPolicy: Never
  containers:
  - name: sleep
    image: rancher/mirrored-pause:3.10.2
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
EOF
k3s kubectl apply -f /tmp/app-pod.yaml

实测回显:

pod/sleep-job-1 created

等待约 30 秒后查询 YuniKorn 视角的应用列表(端口转发保持运行):

curl -s http://127.0.0.1:9080/ws/v1/partition/default/applications/active

实测回显(截取关键字段):

[{"applicationID":"app-sleep-0001","usedResource":{"pods":1,"cpu":200,"memory":268435456},"maxUsedResource":{"pods":1,"cpu":200,"memory":268435456},"user":{"username":"system:admin","groups":["system:masters","system:authenticated"]},"queueName":"root.default","submissionTime":1791792846140,"startTime":1791792846666,"applicationState":"Running","nodeID":"b76ff320bc96"……}]

应用 app-sleep-0001 状态为 Running、归属队列 root.default、运行节点为 k3s 节点,说明该 Pod 已经由 YuniKorn 完成调度决策。验证完毕后清理:

k3s kubectl delete pod sleep-job-1 -n default

实测回显:

pod "sleep-job-1" deleted

五、配置说明

5.1 Helm 安装级参数

部署时通过 --set 调整的核心 values(完整参数见官方 chart 的 values.yaml):

values 路径默认值说明
image.pullPolicyAlways组件 image 拉取策略,内网或带宽紧张时建议 IfNotPresent
resources.requests/limitsrequests 100m/128Mi,limits 4/512Mi调度器 CPU 与内存配额
admissionController.resourcesrequests 100m/128Mi,limits 500m/500Mi准入控制器配额
web.resourcesrequests 100m/100Mi,limits 200m/500MiWeb UI 配额
goMemoryLimitPercentage80GOMEMLIMIT 占 Pod 内存 limit 的百分比
goGC100Go 运行时 GOGC 阈值
embedAdmissionControllertrue准入控制器以独立 Pod 形式随 Chart 部署
enableWebServicetrue是否随调度器部署 Web UI
service.port / service.portWeb9080 / 9889REST 服务与 Web UI 端口

5.2 内存管控方式(Go 组件)

YuniKorn 1.10.0 全部组件为 Go 二进制,内存软限通过环境变量 GOMEMLIMIT 注入,取值为 Pod 内存 limit 乘以 goMemoryLimitPercentage。查看调度器实际注入值:

k3s kubectl get deploy yunikorn-scheduler -n yunikorn -o jsonpath="{.spec.template.spec.containers[0].env[?(@.name==\"GOMEMLIMIT\")].value}"

实测回显(512Mi 的 80%):

429496730

在服务器侧确认组件进程形态(非 JVM,无 -Xms/-Xmx 参数):

ps -ef | grep yunikorn | grep -v grep

实测回显:

root       1  0.1  0.3 1611348 114176 ?       Ssl  09:41   0:08 /yunikorn-scheduler -clusterId mycluster -logEncode json

5.3 调度配置(yunikorn-defaults 配置文件)

调度行为(队列树、资源配额、放置规则等)由命名空间 yunikorn 下名为 yunikorn-defaults 的配置文件载体承载,其中 queues.yaml 键保存队列配置,修改后默认热加载,无需重启。查看调度器启动加载日志:

k3s kubectl logs -n yunikorn deploy/yunikorn-scheduler -c yunikorn-scheduler-k8s | head -8

实测回显:

2026-10-12T09:41:30.000Z        INFO    builder         Starting yunikorn scheduler
2026-10-12T09:41:30.100Z        INFO    shims           build information: {Version: 1.10.0 Go Version: go1.26.7 GOOS: linux GOARCH: amd64}
2026-10-12T09:41:30.200Z        INFO    shims           RM ID: mycluster
2026-10-12T09:41:30.210Z        INFO    shims           Cluster ID: mycluster
2026-10-12T09:41:30.220Z        INFO    shims           Cluster Name: kubernetes
2026-10-12T09:41:30.300Z        INFO    shims           Scheduler sync interval: 1s
2026-10-12T09:41:30.400Z        INFO    webapp          web-app started: localhost:9080
2026-10-12T09:41:30.450Z        INFO    webapp          yunikorn admin service listening on port 9080

具体队列配置写法与参数详解见《Apache YuniKorn 1.10.0 配置参数详解》。

六、注意事项

  1. 组件 image 默认由集群节点在部署时自动拉取;如节点无法访问公共 image 仓库,需先在节点上完成 image 离线导入(k3s 环境可使用 ctr -n k8s.io images import 导入节点本地 image 存储),并将 pullPolicy 设为 IfNotPresent。
  2. 默认放置规则(placementrules: tag value namespace)会把应用归入 root.<命名空间名> 队列,并优先于 Pod 上的 queue 标签;若希望以 yunikorn.apache.org/queue 标签为准,需把放置规则改为 provided create: true,本文已在实测环境验证两种行为差异。
  3. yunikorn-defaults 配置文件带有 helm.sh/resource-policy: keep 注解,helm uninstall 后仍会保留,重装同名 release 前必须先删除它,否则安装报错(详见七)。
  4. 一个集群只应部署一个 YuniKorn release。Chart 的 ClusterRole 名称固定,在其他命名空间重复安装同名组件会导致集群级 RBAC 主体指向错误命名空间,调度器失去 API 权限;本文实测曾复现该问题,修复方式为对主 release 执行 helm upgrade --reuse-values。
  5. REST 与 Web UI 默认无登录认证,生产环境应通过 NetworkPolicy 或防火墙限制 9889、9080 的访问来源。
  6. 服务器重启后 k3s 会随 systemd 自启,YuniKorn 随之恢复,无需人工干预。

七、常见问题

Q1:helm uninstall 后在同一命名空间重新安装报错 Invalid resource: ConfigMap yunikorn-defaults? 该配置文件带有 helm.sh/resource-policy: keep 注解,卸载时被保留。先删除再重装:

k3s kubectl delete cm yunikorn-defaults -n yunikorn

Q2:浏览器访问 9889 无响应? 9889 端口由 yunikorn-service 提供,默认 ClusterIP 仅集群内部可达。临时使用 kubectl port-forward(见 4.6),长期暴露建议将 service.type 改为 NodePort 并放行防火墙对应端口。

Q3:提交的 Pod 没有被 YuniKorn 调度? 确认三点:Pod 是否带有 yunikorn.apache.org/app-id 标签(准入控制器依据它创建应用);命名空间是否在准入控制器的 bypassNamespaces 排除列表中;放置规则与 queue 标签的优先级关系(见 6.2)。可用 curl http://127.0.0.1:9080/ws/v1/partition/default/applications 查看应用是否注册。

Q4:组件是 JVM 进程吗,如何设置堆大小? 不是。1.10.0 调度器、准入控制器、Web UI 均为 Go 二进制,不存在 -Xms/-Xmx 参数。内存管控通过 K8s resources.limits 加 GOMEMLIMIT 软限实现,默认 GOMEMLIMIT 为 limit 的 80%(goMemoryLimitPercentage 可调),验证方式见 5.2。

Q5:嵌套虚拟化或特殊底层环境安装 k3s 后节点一直 NotReady? 若 journalctl -u k3s 出现 overlayfs 不支持多层 lowerdir 的报错,说明底层根文件系统本身运行在 overlay 上,需在 /etc/rancher/k3s/config.yaml 写入 snapshotter: native 后 systemctl restart k3s。普通裸金属或主流虚拟机环境不会遇到此问题,本文仅在说明该场景的处理方式。

八、卸载方式

卸载 YuniKorn release:

helm uninstall yunikorn -n yunikorn

实测回显(keep 注解的配置文件被保留):

These resources were kept due to the resource policy:
[ConfigMap] yunikorn/yunikorn-defaults
release "yunikorn" uninstalled

删除残留配置文件与命名空间:

k3s kubectl delete cm yunikorn-defaults -n yunikorn
k3s kubectl delete ns yunikorn

如需整体移除 Kubernetes 环境:

/usr/local/bin/k3s-uninstall.sh

移除 Helm 与 k3s 二进制及缓存:

rm -f /usr/local/bin/helm /usr/local/bin/k3s /usr/local/bin/kubectl /usr/local/bin/ctr /usr/local/bin/crictl
rm -rf /root/.cache/helm

九、参考链接

  1. YuniKorn 官方文档:https://yunikorn.apache.org/docs/
  2. 官方 Get Started(Kubernetes 安装):https://yunikorn.apache.org/docs/get_started/
  3. YuniKorn Helm Chart 仓库:https://apache.github.io/yunikorn-release/
  4. YuniKorn 1.10.0 发行包:https://downloads.apache.org/yunikorn/1.10.0/
  5. k3s 官方文档:https://docs.k3s.io/
  6. Helm 官方文档:https://helm.sh/docs/