Ubuntu 22.04 安装 Apache YuniKorn 1.10.0 指南
在 Ubuntu 22.04 上从零部署 Apache YuniKorn 1.10.0 调度器,基于 k3s 与 Helm 完成安装,涵盖版本选型、部署步骤、功能验证、配置说明与卸载方式,全部命令经真实环境实测。
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 部署。
二、前置条件
- 可以 root 登录服务器,内核支持 systemd。
- 服务器可访问以下下载源(实测均可达):
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)
- 以下端口未被占用:6443(Kubernetes API)、9889、9080。
- 检查系统与端口:
cat /etc/os-release | head -2
实测回显:
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
ss -lntp | grep -E ':6443|:9889|:9080' || echo "端口未被占用"
实测回显:
端口未被占用
三、版本选型说明
- 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。 - 官方 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 通道版本),在官方支持矩阵内。
- 重要口径: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 概念),内存管控方式见「五、配置说明」。
- 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.pullPolicy | Always | 组件 image 拉取策略,内网或带宽紧张时建议 IfNotPresent |
| resources.requests/limits | requests 100m/128Mi,limits 4/512Mi | 调度器 CPU 与内存配额 |
| admissionController.resources | requests 100m/128Mi,limits 500m/500Mi | 准入控制器配额 |
| web.resources | requests 100m/100Mi,limits 200m/500Mi | Web UI 配额 |
| goMemoryLimitPercentage | 80 | GOMEMLIMIT 占 Pod 内存 limit 的百分比 |
| goGC | 100 | Go 运行时 GOGC 阈值 |
| embedAdmissionController | true | 准入控制器以独立 Pod 形式随 Chart 部署 |
| enableWebService | true | 是否随调度器部署 Web UI |
| service.port / service.portWeb | 9080 / 9889 | REST 服务与 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 配置参数详解》。
六、注意事项
- 组件 image 默认由集群节点在部署时自动拉取;如节点无法访问公共 image 仓库,需先在节点上完成 image 离线导入(k3s 环境可使用 ctr -n k8s.io images import 导入节点本地 image 存储),并将 pullPolicy 设为 IfNotPresent。
- 默认放置规则(placementrules: tag value namespace)会把应用归入 root.<命名空间名> 队列,并优先于 Pod 上的 queue 标签;若希望以
yunikorn.apache.org/queue标签为准,需把放置规则改为provided create: true,本文已在实测环境验证两种行为差异。 - yunikorn-defaults 配置文件带有 helm.sh/resource-policy: keep 注解,helm uninstall 后仍会保留,重装同名 release 前必须先删除它,否则安装报错(详见七)。
- 一个集群只应部署一个 YuniKorn release。Chart 的 ClusterRole 名称固定,在其他命名空间重复安装同名组件会导致集群级 RBAC 主体指向错误命名空间,调度器失去 API 权限;本文实测曾复现该问题,修复方式为对主 release 执行 helm upgrade --reuse-values。
- REST 与 Web UI 默认无登录认证,生产环境应通过 NetworkPolicy 或防火墙限制 9889、9080 的访问来源。
- 服务器重启后 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
九、参考链接
- YuniKorn 官方文档:https://yunikorn.apache.org/docs/
- 官方 Get Started(Kubernetes 安装):https://yunikorn.apache.org/docs/get_started/
- YuniKorn Helm Chart 仓库:https://apache.github.io/yunikorn-release/
- YuniKorn 1.10.0 发行包:https://downloads.apache.org/yunikorn/1.10.0/
- k3s 官方文档:https://docs.k3s.io/
- Helm 官方文档:https://helm.sh/docs/