首页 > 解决方案 > 使用 terraform 在 kubernetes 上计划重启

问题描述

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

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

在 SO 的其他地方,我看到了使用由 kubernetes 管理的 cron 作业运行自动重启的能力(例如:如何安排 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"
  }
}

这是基于使用 terraform 在 k8s 集群中授予 RBAC 角色如何安排 pod 重启的组合。

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

标签: kubernetescronterraformschedulingkubernetes-pod

解决方案


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

kubectl explain rolebinding.subjects.apiGroup

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

字段:apiGroup

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


推荐阅读