Watchdog 提供外部世界与函数之间的接口。它为每个请求启动一个新进程,并使用 STDIO 进行通信。
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
每个函数都需要嵌入此二进制文件,并将其用作 ENTRYPOINT 或 CMD,实际上它是容器的 init 进程。一旦进程被 fork,Watchdog 会通过 stdin 传入 HTTP 请求,并通过 stdout 读取 HTTP 响应。这意味着您的进程无需了解任何 Web 或 HTTP 相关知识。
ENTRYPOINT、CMD、stdin、stdout
您是否希望对 HTTP 响应、“热函数”、持久连接池或内存中缓存机器学习模型有更多控制?那么请查看新 of-watchdog 的 http 模式。
通过 CLI 创建函数
创建函数最简单的方法是使用模板和 FaaS CLI。CLI 可让您无需了解 Docker 知识,只需用一种支持的编程语言编写处理程序文件即可。
使用 OpenFaaS 创建您的第一个无服务器 Python 函数 使用 OpenFaaS 创建您的第一个无服务器 Python 函数
阅读 FaaS CLI 教程 阅读 FaaS CLI 教程
打包函数
回显函数的 Dockerfile 示例:
FROM ghcr.io/openfaas/classic-watchdog:0.3.4 AS watchdog
FROM alpine:3.22.1
RUN mkdir -p /home/app
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
# 添加非 root 用户
RUN addgroup -S app && adduser app -S -G app
RUN chown app /home/app
WORKDIR /home/app
USER app
# 在此处填充示例 - 例如 "cat"、"sha512sum" 或 "node index.js"
ENV fprocess="cat"
# 设置为 true 可在函数日志中查看请求
ENV write_debug="false"
EXPOSE 8080
CMD ["fwatchdog"]
Watchdog 可通过环境变量进行配置。您必须始终指定 fprocess 变量。
| 选项 | 用法说明 |
|---|---|
| fprocess | 每次函数调用时要调用的进程(函数进程)。必须是 UNIX 二进制文件,通过 STDIN 接收输入并通过 STDOUT 输出 |
| cgi_headers | 请求中的 HTTP 头通过环境变量提供 - 如 Http_X_Served_By 等。详见:处理头信息部分。默认启用 |
| marshal_request | 不将原始 HTTP 正文重定向到 fprocess,而是先将其编组为 JSON。如果需要处理 HTTP 头且不想通过 cgi_headers 标志使用环境变量,请使用此选项 |
| content_type | 为所有响应强制指定特定的 Content-Type 响应 |
| write_timeout | 从函数写入响应正文的 HTTP 超时时间(秒) |
| read_timeout | 从客户端调用者读取有效负载的 HTTP 超时时间(秒) |
| healthcheck_interval | 容器编排器(如 kubelet)进行 HTTP 健康检查的间隔(秒)。用于优雅关闭 |
| suppress_lock | Watchdog 将尝试向 /tmp/ 写入锁文件以进行 swarm 健康检查 - 设置为 true 可禁用此行为 |
| exec_timeout | 为每个传入请求执行的进程的硬超时(秒)。如果设置为 t... |
fprocess、cgi_headers、Http_X_Served_By、marshal_request、cgi_headers、content_type、write_timeout、read_timeout、healthcheck_interval、suppress_lock、exec_timeout、write_debug、combine_output、stderr、max_inflight、jwt_auth、true、http://gateway.openfaas:8080、jwt_auth_debug、jwt_auth_local、true、http://127.0.0.1:8080
默认情况下,watchdog 会将函数的响应与客户端的“Content-Type”匹配。
application/json 的 JSON 请求,响应中将自动匹配该类型。text/plain 的 JSON 请求,响应中也将自动匹配该类型。要覆盖所有响应的 Content-Type,请设置 content_type 环境变量。
Watchdog 提供了外部世界与函数之间的接口。它为每个请求启动一个新进程,并使用 STDIO 进行通信。
上文所述:一个小型 Web 服务器或垫片,为每个传入的 HTTP 请求 fork 所需进程
每个函数都需要嵌入此二进制文件,并将其用作 ENTRYPOINT 或 CMD,实际上它是容器的 init 进程。一旦进程被 fork,watchdog 会通过 stdin 传递 HTTP 请求,并通过 stdout 读取 HTTP 响应。这意味着您的进程无需了解任何 Web 或 HTTP 相关知识。
您是否希望更好地控制 HTTP 响应、“热函数”、持久连接池或在内存中缓存机器学习模型?那么请查看新 https://github.com/openfaas-incubator/of-watchdog 的 http 模式。
通过 CLI 创建函数
创建函数最简单的方法是使用模板和 FaaS CLI。CLI 可以让您无需了解 Docker 知识,只需用一种支持的编程语言编写处理程序文件即可。
打包函数
echo 函数的 Dockerfile 示例:
FROM ghcr.io/openfaas/classic-watchdog:0.3.4 AS watchdog
FROM alpine:3.22.1
RUN mkdir -p /home/app
COPY --from=watchdog /fwatchdog /usr/bin/fwatchdog
RUN chmod +x /usr/bin/fwatchdog
# Add non root user
RUN addgroup -S app && adduser app -S -G app
RUN chown app /home/app
WORKDIR /home/app
USER app
# Populate example here - i.e. "cat", "sha512sum" or "node index.js"
ENV fprocess="cat"
# Set to true to see request in function logs
ENV write_debug="false"
EXPOSE 8080
CMD ["fwatchdog"]
Watchdog 可通过环境变量进行配置。您必须始终指定 fprocess 变量。
| 选项 | 用途 |
|---|---|
fprocess | 每次函数调用时要调用的进程(函数进程)。必须是 UNIX 二进制文件,并通过 STDIN 接受输入,通过 STDOUT 输出 |
cgi_headers | 请求中的 HTTP 头通过环境变量提供,例如 Http_X_Served_By 等。详见:处理头信息 部分。默认启用 |
marshal_request | 不将原始 HTTP 正文重定向到 fprocess,而是先将其序列化为 JSON。如果需要处理 HTTP 头且不想通过 cgi_headers 标志使用环境变量,请使用此选项 |
content_type | 为所有响应强制设置特定的 Content-Type |
write_timeout | 函数写入响应正文的 HTTP 超时时间(秒) |
read_timeout | 从客户端调用者读取有效负载的 HTTP 超时时间(秒) |
healthcheck_interval | 容器编排器(如 kubelet)进行 HTTP 健康检查的间隔(秒)。用于优雅关闭 |
suppress_lock | Watchdog 会尝试向 /tmp/ 写入锁定文件以进行 swarm 健康检查 - 设置为 true 可禁用此行为 |
exec_timeout | 为每个传入请求执行的进程的硬超时时间(秒)。设为 0 则禁用 |
write_debug | 将所有输出、错误消息和附加信息写入日志。默认值为 false |
combine_output | 默认值为 true - 在函数响应中合并 stdout/stderr;设为 false 时,stderr 写入容器日志,stdout 用于函数响应 |
max_inflight | 限制最大并发请求数 |
jwt_auth | 仅适用于 OpenFaaS for Enterprises 客户。设为 true 时,watchdog 要求在 Authorization 头中传递 JWT token 作为 Bearer token。此 token 只能通过 OpenFaaS 网关使用 http://gateway.openfaas:8080 地址作为授权机构进行令牌交换获取 |
jwt_auth_debug | 打印 JWT 身份验证过程的调试消息(仅适用于 OpenFaaS for Enterprises) |
jwt_auth_local | 设为 true 时,watchdog 将尝试使用端口转发或运行在 http://127.0.0.1:8080 的本地网关验证 JWT token,而非通过集群内服务名称访问(仅适用于 OpenFaaS for Enterprises) |
| 名称 | 描述 | 类型 |
|---|---|---|
| http_requests_total | 请求总数 | Counter |
| http_request_duration_seconds | 请求持续时间 | Histogram |
| http_requests_in_flight | 并发请求数 | Gauge |
每个请求 fork 一个新进程具有进程隔离、可移植性和简单性等优势。任何进程都可以无需额外代码即可转换为函数。of-watchdog 及其“HTTP”模式是一种优化,可在所有请求之间维持单个进程。
新版本的 watchdog 正在 https://github.com/openfaas-incubator/of-watchdog 进行测试。
此次重写主要是为了持续维护的结构调整。它将成为现有 watchdog 的即插即用替代品,并提供二进制版本。
Watchdog 能够与健康检查配合以实现优雅关闭。
当 watchdog 进程中检测到 SIGTERM 信号时,Go 协程将删除 /tmp/.lock 文件,并将 HTTP 健康检查标记为不健康,返回 HTTP 503。然后代码将等待 write_timeout 中指定的持续时间。在此期间,容器编排器的健康检查必须运行并完成。
现在编排器会将此副本标记为不健康,并将其从有效 HTTP 端点池中移除。
现在我们将停止接受新连接,并等待 write_timeout 中定义的值,然后最终允许进程退出。
头信息和其他请求信息会以以下格式注入到环境变量中:
X-Forwarded-By 头会以 Http_X_Forwarded_By 的形式可用
Http_Method - GET/POST 等Http_Query - 查询字符串值Http_ContentLength 和 Http_Content_Length - 提供看门狗接收到的传入 HTTP 请求的总内容长度,见下方说明Http_Transfer_Encoding - 仅在提供时设置,若设置为 chunked,则 Content-Length 将为 -1,表示不适用此行为由
cgi_headers环境变量启用,该变量默认启用(true)。
以下是一个带有附加头和查询字符串的 POST 请求示例。
$ cgi_headers=true fprocess=env ./watchdog &
2017/06/23 17:02:58 Writing lock-file to: /tmp/.lock
$ curl "localhost:8080?q=serverless&page=1" -X POST -H X-Forwarded-By:http://my.vpn.com
如果在 Linux 系统上将 fprocess 设置为 env,你会看到以下内容:
Http_User_Agent=curl/7.43.0
Http_Accept=*/*
Http_X_Forwarded_By=http://my.vpn.com
Http_Method=POST
Http_Query=q=serverless&page=1
你也可以使用 GET 方法:
$ curl "localhost:8080?action=quote&qty=1&productId=105"
看门狗的输出将是:
Http_User_Agent=curl/7.43.0
Http_Accept=*/*
Http_Method=GET
Http_Query=action=quote&qty=1&productId=105
现在你可以在应用程序中使用 HTTP 状态来做出决策。
看门狗支持的 HTTP 方法如下:
带请求体:
不带请求体:
API Gateway 当前支持函数的 POST 路由。
默认情况下,看门狗会将函数的响应与客户端的 "Content-Type" 匹配。
application/json 的 JSON 请求,响应中会自动匹配此类型。text/plain 的 JSON 请求,响应中也会自动匹配此类型要覆盖所有响应的 Content-Type,请设置 content_type 环境变量。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务