#kubernetes #sidecar #virtualization

app proa

管理Kubernetes边车容器生命周期

3个版本

0.1.2 2023年7月10日
0.1.1 2023年6月12日
0.1.0 2023年6月7日

56#virtualization

每月25 次下载

MIT 许可证

78KB
802

Proa用于Kubernetes边车管理

crates.io CI status Rust Report Card

https://github.com/redboxllc/scuttlehttps://github.com/joho/godotenvhttps://github.com/kubernetes/enhancements/issues/753等启发。该程序旨在成为Pod中包含边车容器的“主要”容器的入口点。Proa是主容器中主进程的包装器。它在启动主程序之前等待边车准备好,并在主进程退出时关闭边车,以便整个Pod可以优雅地退出,就像Job的情况一样。

Drawing of a proa

简要来说,它做了以下几件事

  1. 监视其Pod的规范和状态。
  2. 等待所有容器(除了它自己的)都准备好。
  3. 启动主(包装的)进程并等待其退出。
  4. 执行一些关闭操作,如击中本地主机的HTTP端点或发送类似pkill的信号。
  5. 等待边车退出。

如果在关闭期间遇到错误,它会记录每个错误,但会以与包装进程相同的退出代码退出。

要求

  • 边车需要就绪探针。
  • 服务帐户需要权限来读取和监视其自身的Pod。

用法

如果您愿意,只需复制 job.yaml 并对其进行修改以供您使用。作业有一个边车,由Python脚本模拟,必须在主进程开始之前就绪。我们通过在启动Python HTTP服务器之前休眠30秒来模拟一个缓慢启动的边车。Proa使用Kubernetes关于边车容器就绪状态的知识。这意味着每个边车都必须提供 readinessProbe,并且Pod的 serviceAccount 需要权限来读取和监视其运行的Pod。

或者,如果您愿意,按照以下步骤进行

  1. 构建一个包含您的主应用程序和 proa 可执行文件的容器镜像。最简单的方法可能是使用多阶段Dockerfile来编译 proa 并将其复制到最终镜像中。请参阅Dockerfile 以获取示例。
  2. 为您的作业创建一个 ServiceAccount
  3. 创建一个 RoleRoleBinding,给服务账户授权,使其能够在自己的命名空间中 getwatchlist pods
  4. 修改 Job 的 spec.template.spec.serviceAccountName,使其指向该服务账户。
  5. 修改 Job 并确保每个侧载容器的 spec.template.spec.containers 条目都有一个 readinessProbe。(主容器是否有 readiness probe 并不重要;proa 会忽略它。)
  6. 更改主容器的入口点(command 和/或 args),使其调用 proa。
    • 传递标志来告诉 proa 如何关闭您的侧载。这通常将是 --shutdown-http-get=URL--shutdown-http-post=URL。这些标志可以重复多次。
    • 传递分隔符字符串 --,后跟主程序及其所有参数的路径。
  7. 可选地为主容器添加一个 RUST_LOG 环境变量来控制 proa 的日志详细程度。

终止

在需要关闭时,proa 可以通过发送 SIGTERM 来结束您的侧载进程,但这可能不是您想要的。大多数接收到 SIGTERM 的进程将以状态 143 或其他非零值退出。Kubernetes 将将其解释为容器故障,并尝试重启或重新创建 Pod 以再次尝试。

如果您确定想使用此功能,请使用功能 kill 编译程序,并确保您的 Pod 满足以下要求

  • 需要 shareProcessNamespace 以使 proa 能够停止侧载,并且
    • 主容器需要以 UID 0 运行(不推荐)
    • 所有容器需要运行相同的 UID。
  • 不要使用 hostPID,否则在尝试杀死节点上的每个进程时,会导致混乱。

名称

这是一个管理侧载的程序,但侧载是一个摩托车比喻,而 Kubernetes 是关于航海梗的。一个 proa 是一种带有外舷板的帆船,有点像摩托车上的侧载。

开发

要求

  • 使用 nixdirenv,或者手动安装这些工具。有关所需工具的列表,请参阅 flake.nix
  • Docker 或等效工具。
  1. 使用 kind create cluster 在本地 Docker 中启动一个微型的 Kubernetes 集群。
  2. 使用 skaffold dev 启动编译-构建-部署循环。

每次保存文件时,skaffold 都会重新构建和重新部署,然后显示 Pod 中的容器输出。


赞助商

此项目由 IronCore Labs 赞助,IronCore Labs 是云应用程序数据隐私和安全解决方案的制造商,包括用于多租户 SaaS 应用程序的 SaaS Shield 和用于在 Elasticsearch 和 OpenSearch 上进行数据使用加密的 Cloaked Search

依赖关系

~71MB
~1M SLoC