使用自定义API在Kubernetes中进行容器检查点

问题陈述

挑战

在 Kubernetes 中运行容器化应用程序的组织通常需要捕获和保留运行容器状态,以用于:

  • 灾难恢复
  • 应用程序迁移
  • 调试/故障排除
  • 状态保留
  • 环境再现

然而,目前没有直接、自动化的方法来:

  1. 根据需要创建容器检查点
  2. 将这些检查点存储在标准化格式中
  3. 使其在集群间轻松访问
  4. 通过标准接口触发检查点

目前的限制

  • 手动创建检查点需要直接访问集群
  • 检查点没有标准化存储格式
  • 与容器注册表集成有限
  • 缺乏用于自动化的程序化访问
  • 在 containerd 和存储系统之间复杂协调

解决方案

一个 Kubernetes 旁路服务,它:

  1. 通过 REST API 公开检查点功能
  2. 自动将检查点转换为符合 OCI 标准的镜像
  3. 将镜像存储在 ECR 中以便分发
  4. 与现有 Kubernetes 基础设施集成
  5. 为自动化提供标准化接口

通过:

  • 自动化检查点过程解决了核心问题
  • 标准化检查点存储
  • 使检查点可移植
  • 启用编程访问
  • 简化与现有工作流程集成

目标用户:

  • DevOps团队
  • 平台工程师
  • 应用程序开发人员
  • 站点可靠性工程师(SREs)

取证容器检查点基于用户态检查点/恢复(CRIU),允许在不让容器知道正在被检查点的情况下创建运行容器的有状态副本。容器的副本可以在沙盒环境中进行多次分析和恢复,原始容器并不知晓。取证容器检查点功能在Kubernetes v1.25中作为α特性引入。

本文将指导您如何部署 Golang 代码,用于使用 API 进行容器检查点。

该代码接受一个 pod 标识符,从 containerd 检索容器 ID 作为输入,然后使用 ctr 命令在 containerd 的 k8s.io 命名空间中检查点特定容器:

先决条件

  • Kubernetes 集群
  • 安装ctr命令行工具。如果您能在kubelet或工作节点上运行ctr命令; 如果不能,请安装或调整AMI以包含ctr
  • kubectl配置用于与您的集群通信
  • 本地安装Docker
  • 访问容器注册表(例如Docker Hub,ECR)
  • Helm(用于安装Nginx Ingress Controller)

步骤0:使用GO创建容器检查点的代码

创建名为checkpoint_container.go的文件,并包含以下内容:

Go

 

步骤1:初始化go模块

Shell

 

修改go.mod文件:

Go

 

运行以下命令:

Shell

 

步骤2:构建和发布Docker镜像

在相同目录中创建一个Dockerfile

Dockerfile

 

此Dockerfile执行以下操作:

  1. 使用golang:1.20作为构建阶段来编译您的Go应用程序。
  2. 使用amazonlinux:2作为最终基础镜像。
  3. 使用yum和amazon-linux-extras安装AWS CLI,Docker(包括containerd)和skopeo。
  4. 从构建阶段复制编译的Go二进制文件。
Shell

 

<your-docker-repo>替换为您实际的Docker存储库。

步骤3:应用RBAC资源

创建名为rbac.yaml的文件:

YAML

 

应用RBAC资源:

Shell

 

第4步:创建Kubernetes部署

创建名为deployment.yaml的文件:

YAML

 

应用部署:

Shell

 

deployment.yaml中更新以下内容:

YAML

第5步:Kubernetes服务

创建名为service.yaml的文件:

YAML

 

应用服务:

Shell

 

第6步:安装Ngnix Ingress控制器

Shell

 

第7步:创建Ingress资源

创建名为ingress.yaml的文件:

YAML

 

应用Ingress:

Shell

 

第8步:测试API

Shell

 

Shell

 

用实际外部IP替换<EXTERNAL-IP>

其他考虑

  1. 安全
    • 通过设置TLS证书实现HTTPS
    • 为API添加身份验证
  2. 监控。为API和检查点进程设置日志记录和监控。
  3. 资源管理。为辅助容器配置资源请求和限制。
  4. 错误处理。在Go应用程序中实现健壮的错误处理。
  5. 测试。在非生产环境中彻底测试设置,然后再部署到生产环境。
  6. 文档。保持关于如何使用检查点API的清晰文档。

结束

这个设置在Kubernetes中部署检查点容器作为一个旁路容器,并通过可以从集群外部访问的API暴露其功能。它为在Kubernetes环境中管理容器检查点提供了灵活的解决方案。

AWS/EKS特定

第7步:安装AWS负载均衡器控制器

我们将使用AWS负载均衡器控制器,而不是使用Nginx Ingress控制器。这个控制器将为我们的Ingress资源创建和管理ALB。

1. 将EKS chart仓库添加到Helm中:

Shell

 

2. 安装AWS负载均衡器控制器:

Shell

 

用你的EKS集群名称替换<your-cluster-name>

注意:确保你已经为AWS负载均衡器控制器设置了必要的IAM权限。你可以在AWS文档中找到详细的IAM策略。

第8步:创建Ingress资源

创建一个名为ingress.yaml的文件:

YAML

 

应用Ingress:

Shell

 

第9步:测试API

1. 获取ALB的DNS名称:

Shell

 

查找ADDRESS字段,这将是ALB的DNS名称。

2. 发送一个测试请求:

Shell

 

用第1步中的ALB的实际DNS名称替换<ALB-DNS-NAME>

AWS ALB的额外考虑事项

1. 安全组。ALB 将自动创建一个安全组。确保它允许端口 80 的入站流量(如果设置了 HTTPS,则还需允许端口 443 的流量)。

2. SSL/TLS:要启用 HTTPS,请向您的 Ingress 添加以下注释:

YAML

 

3. 访问日志。通过添加以下内容启用 ALB 的访问日志:

YAML

 

4. WAF 集成。如果要在 ALB 中使用 AWS WAF,可以添加:

YAML

 

5. 身份验证。您可以使用 Amazon Cognito 或 OIDC 设置身份验证,通过使用相应的 ALB Ingress Controller 注释。

这些更改将使用 AWS 应用负载均衡器来设置您的 Ingress,而不是使用 Nginx。ALB Ingress Controller 将根据您的 Ingress 资源自动配置和配置 ALB。

结论

请确保您的 EKS 集群具有创建和管理 ALB 所需的 IAM 权限。通常需要创建一个 IAM 策略和一个带有适当权限的服务账户。

现在,这个设置将使用 AWS 的原生负载均衡解决方案,与其他 AWS 服务集成良好,并且在 AWS 环境中可能更具成本效益。

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api