如何在 cron 中 运行 kubectl 命令

How to run kubectl commands in a cron

我在我的 Gcloud 项目中创建了一个计划配置来创建一堆虚拟磁盘的快照。

现在我想将我的计划配置添加到我的磁盘,但我不知道如何以自动方式进行,因为我有超过 1200 个磁盘。

我尝试使用内部带有 cron 的 POD,但我无法执行 kubectl 命令来列出我所有的持久卷:

kubectl describe pv | grep "Name" | awk 'NR % 2 == 1' | awk '{print }'

我想将此列表与循环中的下一个命令一起使用,以将我的编程时间表自动添加到我的磁盘中:

gcloud compute disks add-resource-policies [DISK_NAME] --resource-policies [SCHEDULE_NAME] --zone [ZONE]

在此先感谢您的帮助。

编辑 1:经过一些评论后,我更改了我的代码以添加 Kubernetes CronJob,但结果是一样的,代码不起作用(创建了 pod,但它给我一个错误:ImagePullBackOff):

resource "kubernetes_cron_job" "schedulerdemo" {
  metadata {
    name = "schedulerdemo"
  }
  spec {
    concurrency_policy            = "Replace"
    failed_jobs_history_limit     = 5
    schedule                      = "*/5 * * * *"
    starting_deadline_seconds     = 10
    successful_jobs_history_limit = 10
    job_template {
      metadata {}
      spec {
        backoff_limit = 2
        ttl_seconds_after_finished    = 10
        template {
          metadata {}
          spec {
            container {
              name    = "scheduler"
              image   = "imgscheduler"
              command = ["/bin/sh", "-c", "date; kubectl describe pv | grep 'Name' | awk 'NR % 2 == 1' | awk '{print }'"]
            }
          }
        }
      }
    }
  }
}

回复评论:

Ok, shame on me, wrong image name. Now I have an error in the Container Log: /bin/sh: kubectl: not found

这意味着您正在使用的图像没有安装 kubectl(或者它不在 PATH 中)。您可以使用图像:google/cloud-sdk:latest。此映像已安装 cloud-sdk,其中包括:

  • gcloud
  • kubectl

到 运行 将获取有关 PV 的信息并更改 GCP 存储配置的 CronJob 您将需要以下访问权限:

  • Kubernetes/GKE API(kubectl) - ServiceAccount 带有 RoleRoleBinding.
  • GCP API (gcloud) - Google Service account 具有 IAM 存储操作权限。

我发现此链接在为列表 PV 分配权限时很有用:

GCP 访问分配特定权限的推荐方法:

Workload Identity is the recommended way to access Google Cloud services from applications running within GKE due to its improved security properties and manageability.

-- Cloud.google.com: Kubernetes Engine: Workload Identity: How to

我鼓励您阅读我上面链接的文档并检查其他 alternatives


至于脚本里面用了一个CronJob。您应该查找 pdName 而不是 Name,因为 pdNameGCPgce-pd 磁盘的表示(假设我们正在谈论 in-tree插件)。

您将有多个选项从 API 检索磁盘名称以在 gcloud 命令中使用它。

选项之一:

kubectl get pv -o yaml | grep "pdName" | cut -d " " -f 8 | xargs -n 1 gcloud compute disks add-resource-policies --zone=ZONE --resource-policies=POLICY

Disclaimer!

Please treat above command only as an example.

以上命令将从 PV 中获取 PDName 属性,并在 xargs.

之后的命令中对每个属性进行迭代

创建 script/program 时需要考虑的一些事项:

  • 运行 在单个磁盘上多次执行此命令将发出无法分配多个策略的错误。您可能有一个不需要分配策略的已配置磁盘列表。
  • 考虑使用 .spec.concurrencyPolicy: Forbid 而不是 Replace。 Replaced CronJob 将从头开始遍历所有这些磁盘。命令无法在所需时间内完成,CronJob 将被替换。
  • 您将需要检查正确的 kubectl 版本,因为官方支持允许客户端和服务器之间存在 +1/-1 版本差异(cloud-sdk:latest 使用 v1.19.3)。

我强烈建议您寻找其他方法来备份您的 PVC(例如 VolumeSnapshots)。

查看以下链接了解更多信息 reference/ideas:

值得一提的是:

CSI drivers are the future of storage extension in Kubernetes. Kubernetes has announced that the in-tree volume plugins are expected to be removed from Kubernetes in version 1.21. For details, see Kubernetes In-Tree to CSI Volume Migration Moves to Beta. After this change happens, existing volumes using in-tree volume plugins will communicate through CSI drivers instead.

-- Cloud.google.com: Kubernetes Engine: Persistent Volumes: GCE PD CSI Driver: Benefits of using

为您的 StorageClass 切换到 CSI 插件将允许您在 GKE:

中使用 Volume Snapshots

Volume snapshots let you create a copy of your volume at a specific point in time. You can use this copy to bring a volume back to a prior state or to provision a new volume.

-- Cloud.google.com: Kubernetes Engine: Persistent Volumes: Volume snaphosts: How to


其他资源: