hashicorp/nomad-driver-podmanNomad podman Driver是HashiCorp Nomad的容器驱动插件,允许用户在Nomad集群中使用podman运行容器。该插件由@towe75和Pascom贡献,提供了容器生命周期管理、资源监控、网络配置等核心能力,适用于需要在Nomad中集成podman容器运行时的场景,尤其支持rootless容器及cgroup V2。
该项目包含go.mod定义,可克隆到任意目录,无需设置GOPATH。需使用Go 1.13或更高版本。
sh$ git clone ***:hashicorp/nomad-driver-podman cd nomad-driver-podman ./build.sh
podman的Linux主机需启用varlink的podman二进制文件和系统套接字激活单元,详见podman varlink文档。Nomad代理、驱动及podman位于同一主机,无需配置podman varlink的SSH相关功能。需确保Nomad能找到插件,配置方法见plugin_dir。
enabled - 默认true。允许任务将主机路径(卷)绑定到容器内。selinuxlabel - 允许管理员为分配和任务本地绑定挂载到容器的路径设置SELinux标签。若与volumes.enabled=false一起使用,标签仍会应用于容器中的标准绑定。hclplugin "nomad-driver-podman" { config { volumes { enabled = true selinuxlabel = "z" } } }
container - 默认true。可禁用Nomad在任务退出时删除容器。hclplugin "nomad-driver-podman" { config { gc { container = false } } }
默认true。允许驱动在Nomad客户端重启后启动并重用之前停止的容器。适用于单节点系统重启场景,可避免容器重建。
hclplugin "nomad-driver-podman" { config { recover_stopped = false } }
默认值:root用户或cgroup V1系统为"unix://run/podman/io.podman",rootless cgroup V2系统为"unix://run/user/<USER_ID>/podman/io.podman"。
hclplugin "nomad-driver-podman" { config { socket_path = "unix://run/podman/io.podman" } }
指定要运行的容器镜像。
hclconfig { image = "docker://redis" }
容器的入口点,默认为镜像中定义的入口点。
hclconfig { entrypoint = "/entrypoint.sh" }
启动容器时执行的命令。
hclconfig { command = "some-command" }
命令参数列表。若未指定command,参数将直接传递给容器。
hclconfig { args = [ "arg1", "arg2", ] }
容器的工作目录,默认为镜像中定义的默认目录。
hclconfig { working_dir = "/data" }
主机路径与容器路径绑定的字符串列表,格式为host_path:container_path。
hclconfig { volumes = [ "/some/host/data:/container/data" ] }
tmpfs挂载点的容器路径列表,详见podman run --tmpfs选项。
hclconfig { tmpfs = [ "/var" ] }
分配给容器的主机名。使用count启动多个任务实例时,所有容器将共享此主机名。
配置方法详见Docker驱动端口配置。
在容器内运行init进程,用于转发信号和回收子进程。
hclconfig { init = true }
容器init二进制文件的路径。
hclconfig { init = true init_path = "/usr/libexec/podman/catatonit" }
在容器内以指定用户/UID运行命令,详见任务用户配置。
hcluser = "nobody" config { }
内存软限制(单位:b/字节、k/千字节、m/兆字节、g/千兆字节)。当系统内存紧张时,容器将被限制在预留值内,需小于memory硬限制。
hclconfig { memory_reservation = "100m" }
内存+交换空间的总限制,必须大于内存资源值。单位同上,设置为-1表示无限制交换空间。
hclconfig { memory_swap = "180m" }
调整容器内存交换行为,取值范围0-100(整数)。
hclconfig { memory_swappiness = 60 }
设置容器网络模式:
bridge:(root用户默认)使用默认桥接网络none:禁用网络container:id:重用其他容器的网络栈host:使用主机网络栈(不安全,容器可访问主机系统服务)slirp4netns:(rootless默认)使用slirp4netns创建用户网络栈(root容器暂不支持)hclconfig { network_mode = "bridge" }
hcljob "redis" { datacenters = ["dc1"] type = "service" group "redis" { task "redis" { driver = "podman" config { image = "docker://redis" port_map { redis = 6379 } } resources { cpu = 500 memory = 256 network { mbits = 20 port "redis" {} } } } } }
运行任务:
shnomad run redis.nomad ==> Monitoring evaluation "9fc25b88" Evaluation triggered by job "redis" Allocation "60fdc69b" created: node "f6bccd6d", group "redis" Evaluation status changed: "pending" -> "complete" ==> Evaluation "9fc25b88" finished with status "complete"
验证容器运行:
shpodman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d2d700cbce6 docker.io/library/redis:latest docker-entrypoint... 16 seconds ago Up 16 seconds ago redis-60fdc69b-65cb-8ece-8554-df49321b3462
/etc/default/grub,添加内核参数GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=1"
更新grub:sudo update-grub
shsystemctl --user status io.podman ● io.podman.service - Podman Remote API Service Loaded: loaded (/usr/lib/systemd/user/io.podman.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2020-07-01 16:01:41 EDT; 7s ago TriggeredBy: ● io.podman.socket Docs: man:podman-varlink(1) Main PID: 25091 (podman) Tasks: 29 (limit: ***) Memory: 17.5M CPU: 184ms CGroup: /user.slice/user-1000.slice/***/io.podman.service ├─25091 /usr/bin/podman varlink unix:/run/user/1000/podman/io.podman --timeout=60000 --cgroup-manager=systemd ├─25121 /usr/bin/podman varlink unix:/run/user/1000/podman/io.podman --timeout=60000 --cgroup-manager=systemd └─25125 /usr/bin/podman
shcrun -V crun version 0.13.227-d38b commit: d38b8c28fc50a***a27fa6afc69a55bfdd2c11 spec: 1.0.0 +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +YAJL
example.nomadhcljob "example" { datacenters = ["dc1"] type = "service" group "cache" { count = 1 restart { attempts = 2 interval = "30m" delay = "15s" mode = "fail" } task "redis" { driver = "podman" config { image = "redis" port_map { db = 6379 } } resources { cpu = 500 # 500 MHz memory = 256 # 256MB network { port "db" {} } } } } }
提交任务:nomad job run example.nomad
shpodman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2423ae3efa21 docker.io/library/redis:latest redis-server 7 seconds ago Up 6 seconds ago 127.0.0.1:21510->6379/tcp, 127.0.0.1:21510->6379/udp redis-b640480f-4b93-65fd-7bba-c15722886395
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务