使用 terraform 在 kubernetes 上计划重启

Posted

技术标签:

【中文标题】使用 terraform 在 kubernetes 上计划重启【英文标题】:Scheduled restarts on kubernetes using terraform 【发布时间】:2021-12-23 16:00:37 【问题描述】:

我在 terraform 管理的 aws 上运行 kubernetes 集群。我想定期(可能每周)自动重启集群中的 Pod。由于整个集群都是由 terraform 管理的,所以我也想通过 terraform 运行自动重启命令。

起初我以为 kubernetes 会为其 pod 提供某种 ttl,但事实似乎并非如此。

在 SO 的其他地方,我看到了使用由 kubernetes 管理的 cron 作业运行自动重启的能力(例如:How to schedule pods restart)。 Terraform 有一个相关的资源——kubernetes_cron_job——但我无法完全理解如何设置它并获得实际运行所需的权限。

希望得到一些反馈!

以下是我尝试过的:

resource "kubernetes_cron_job" "deployment_restart" 
  metadata 
    name = "deployment-restart"
  
  spec 
    concurrency_policy            = "Forbid"
    schedule                      = "0 8 * * *"
    starting_deadline_seconds     = 10
    successful_jobs_history_limit = 10
    job_template 
      metadata 
      spec 
        backoff_limit              = 2
                active_deadline_seconds      = 600
        template 
          metadata 
          spec 
                        service_account_name = var.service_account.name
            container 
              name    = "kubectl"
              image   = "bitnami/kubectl"
              command = ["kubectl rollout restart deploy"]
            
          
        
      
    
  


resource "kubernetes_role" "deployment_restart" 
  metadata 
    name      = "deployment-restart"
  

  rule 
    api_groups = ["apps", "extensions"]
    resources  = ["deployments"]
    verbs      = ["get", "list", "patch", "watch"]
  


resource "kubernetes_role_binding" "deployment_restart" 
  metadata 
    name      = "deployment-restart"
  
  role_ref 
    api_group = "rbac.authorization.k8s.io"
    kind      = "Role"
    name      = kubernetes_role.deployment_restart.metadata[0].name
  

  subject 
    kind      = "ServiceAccount"
    name      = var.service_account.name 
    api_group = "rbac.authorization.k8s.io"
  

这是基于Granting RBAC roles in k8s cluster using terraform 和How to schedule pods restart 的组合。

目前出现以下错误: Error: RoleBinding.rbac.authorization.k8s.io "deployment-restart" is invalid: subjects[0].apiGroup: Unsupported value: "rbac.authorization.k8s.io": supported values: ""

【问题讨论】:

那么,您在运行时收到错误消息?或者你错过了什么? @FritzDuchardt 更新了我的尝试和遇到的错误 【参考方案1】:

根据官方文档rolebinding.subjects.apiGroup 服务帐户应该是空的。

kubectl explain rolebinding.subjects.apiGroup

种类:角色绑定版本:rbac.authorization.k8s.io/v1

字段:apiGroup

说明: APIGroup 保存引用主题的 API 组。默认为“” ServiceAccount 科目。用户默认为“rbac.authorization.k8s.io” 和组主题。

【讨论】:

以上是关于使用 terraform 在 kubernetes 上计划重启的主要内容,如果未能解决你的问题,请参考以下文章

在同一个 TF 脚本中使用多个 Terraform 提供程序(GCP 和 Kubernetes)创建资源

使用 AWS 和 Kubernetes 提供商的 Terraform 循环

如何使用 Terraform 将 GKE 凭证传递给 Kubernetes 提供者?

使用 Flux 和 Terraform 的 Kubernetes 秘密

如何在 terraform 中导入生成的 Kubernetes 集群的命名空间

使用 Terraform 管理 GKE 及其部署