如何用 Dokku scheduler-k3s 初始化 k3s 集群并添加工作节点?
【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku
如果你已经在 Dokku 上跑应用,但单机的 docker-local 调度器装不下负载,可以用 Dokku 自带的scheduler-k3s插件(0.33.0 起引入,取代了外部的 scheduler-kubernetes 插件)在 Dokku 服务器上初始化一个 k3s 集群,再通过 SSH 把远端机器加入集群作为 worker 节点来运行应用负载。完成后的结果是:Dokku 节点上运行控制面,worker 节点上跑应用容器,应用通过scheduler:set指定用 k3s 调度。
准备条件
在动手之前,文档明确了几个前置要求:
scheduler-k3s:initialize必须使用 root 用户运行。k3s 插件要求使用一个 docker registry 来存储部署的镜像产物,否则集群里的节点拉不到应用镜像。配置方式参考 registry 管理文档,典型做法是先全局登录 registry:
dokku registry:login --global docker.io $USERNAME $PASSWORD添加节点时,
dokku用户必须能 SSH 登录目标服务器,且远端用户必须是 root 或已启用 sudo,否则安装会失败。如果要让集群外的机器能操作 k8s API,需要按 K3s 网络文档提前放通服务器之间的相关端口(文档指向 K3s 官方 networking 要求,此处不再展开端口清单)。
Dokku 会把 k3s 作为默认调度器;如需为某个应用显式指定,可以运行:
dokku scheduler:set node-js-app selected k3s第一步:在 Dokku 节点上初始化集群
在 Dokku 服务器上以 root 身份运行初始化命令,它会在 Dokku 节点本机启动 k3s 集群:
dokku scheduler-k3s:initialize按默认方式初始化后,该节点同时运行控制面和应用负载。如果你的应用负载要放到独立的 worker 节点上,用--taint-scheduling让控制面节点只允许运行 Critical 集群组件:
dokku scheduler-k3s:initialize --taint-scheduling如果 Dokku 自动探测到的服务器 IP 不正确,可以用--server-ip覆盖,例如:
dokku scheduler-k3s:initialize --server-ip 192.168.20.15ingress 有两个可选分支:默认使用nginx(通过 ingress-nginx 实现,nginx插件设置的属性会被转成 annotation 或自定义 server/location snippet,修改 nginx 属性后需要ps:restart才生效);也可以在初始化时改用 Traefik:
dokku scheduler-k3s:initialize --ingress-class traefik初始 server 节点的 kubelet 参数只能通过--kubelet-args传入(逗号分隔的key=value列表),因为该节点从不经过cluster:add,这是配置它 kubelet 的唯一途径:
dokku scheduler-k3s:initialize \ --kubelet-args allowed-unsafe-sysctls=net.ipv6.conf.all.disable_ipv6,max-pods=150第二步:添加 worker 节点
运行应用负载的节点通过scheduler-k3s:cluster:add添加。该命令会 SSH 登录目标服务器、安装 k3s 并以 worker 模式加入当前 Dokku 节点:
dokku scheduler-k3s:cluster:add ssh://root@worker-1.example.comssh://user@host:port是文档给出的格式,worker-1.example.com和端口按你的实际机器替换。针对单个 worker 也可以传 kubelet 参数:
dokku scheduler-k3s:cluster:add \ --kubelet-args allowed-unsafe-sysctls=net.ipv6.conf.all.disable_ipv6 \ ssh://root@worker-1.example.com两个常见的连接问题按文档处理:
目标服务器不在
known_hosts文件里时连接会失败,加--insecure-allow-unknown-hosts可以绕过校验:dokku scheduler-k3s:cluster:add --insecure-allow-unknown-hosts ssh://root@worker-1.example.com远端节点回连 Dokku 服务器时用的 IP 自动探测不正确时,同样用
--server-ip覆盖:dokku scheduler-k3s:cluster:add --server-ip 192.168.20.15 ssh://root@worker-1.example.com
可选:添加 server 节点(高可用控制面)
如果还想复制集群状态(etcd),用--role server加入 server 节点。它运行控制面服务、etcd 和调度器本身:
dokku scheduler-k3s:cluster:add --role server ssh://root@server-1.example.com文档给出两点明确提示:server 节点数量建议为奇数并跨多个可用区分布;只有初始 Dokku 服务器才会被正确配置为 push 部署的 git remote,额外的 server 节点仅用于复制 K3s etcd 状态——所以要确保初始服务器有可靠的备份和恢复手段,否则部署会不可用。server 节点默认也允许调度应用负载,不想让控制面跑应用时加--taint-scheduling:
dokku scheduler-k3s:cluster:add --role server --taint-scheduling ssh://root@server-1.example.com按需调整:网络接口与节点 profile
网络接口:加入节点时 K3s 插件默认读取eth0的 IP 来连接集群。如果你的机器用其他网卡对外,先改全局的network-interface属性:
dokku scheduler-k3s:set --global network-interface eth1节点 profile(可选):当多台节点需要相同的加入参数时,可以先建一个 profile,再用--profile引用,直接传给cluster:add的 flag 会覆盖 profile 中存储的值:
dokku scheduler-k3s:profiles:add edge-workers \ --role worker \ --insecure-allow-unknown-hosts \ --kubelet-args protect-kernel-defaults=true,eviction-hard=memory.available<200Miprofile 名称要求:小写字母数字,可含内部连字符,不能以连字符开头或结尾,且不超过 26 个字符(名称会成为 helm release 的一部分)。加入节点后可以用kubectl get nodes -L dokku.com/node-profile查看dokku.com/node-profile=<name>标签;不带--profile加入的节点不会有该标签。查看和删除 profile 分别用:
dokku scheduler-k3s:profiles:list dokku scheduler-k3s:profiles:remove edge-workers删除 profile 只删除存储的定义,已加入集群的节点保留现有配置。
验证集群与节点
文档提供的检查手段有两条:
列出 Dokku 管理的集群中的全部节点:
dokku scheduler-k3s:cluster:list dokku scheduler-k3s:cluster:list --format json如果需要直接用 kubectl 检查(例如确认节点标签、Ready 状态),先用
show-kubeconfig取出集群 kubeconfig 并在客户端配置后使用:dokku scheduler-k3s:show-kubeconfig使用前记得确认上一节提到的 K3s 网络端口已放通。
限制与后续操作
- 部署应用前确认 registry 已登录,镜像会由集群节点从 registry 拉取,而不是要求 Dokku 宿主机本地保留镜像。
- 移除节点用
dokku scheduler-k3s:cluster:remove [node-id];彻底卸载则用dokku scheduler-k3s:uninstall。 - 修改 nginx 插件属性、annotation 或 label 之后,都要执行
ps:restart才会作用到运行中的资源。 - 集群内的应用部署超时等参数可通过
scheduler-k3s:set按应用或全局调整,例如dokku scheduler-k3s:set node-js-app deploy-timeout 60s(全局默认300s),用dokku scheduler-k3s:report node-js-app检查生效值。
完整命令与属性参考见 k3s scheduler 文档,调度器选择机制见 scheduler 管理文档。
【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考