【问题标题】:How to run kubectl commands in a cron如何在 cron 中运行 kubectl 命令
【发布时间】:2020-10-16 12:53:24
【问题描述】:

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

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

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

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

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

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

提前感谢您的帮助。

编辑1:在一些cmets之后,我更改了代码以添加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 $2}'"]
            }
          }
        }
      }
    }
  }
}

【问题讨论】:

  • “我无法执行 kubectl 命令”是什么意思?另外,最好不要在 pod 内运行 cron,而是使用 kubernetes CronJob ressource (kubernetes.io/docs/concepts/workloads/controllers/cron-jobs)。
  • kubectl 可能无法工作的原因是因为您没有给它一个 ServiceAccount,这就是 kubectl 无法通过您的集群进行身份验证的原因。但是,按照 Markus 的解决方案,我还宁愿使用 Cronjob 资源并运行发出 gcloud 命令的 shell 脚本。要完全解决这个问题,您只需要一个可以列出和描述永久性磁盘的 ServiceAccount,还需要使用同一个服务帐号将其链接到 GCP 中的 IAM 实体。
  • 我关注了您的 cmets,并更改了 terraform 代码中的代码以创建 CronJob:我将代码粘贴到问题中。
  • ImagePullBackOff 错误意味着它无法找到image 属性中指定的图像。此映像是否在您的容器注册表中?
  • 好吧,不好意思,图片名称错误。现在我在容器日志中有一个错误:/bin/sh: kubectl: not found

标签: kubernetes cron google-kubernetes-engine persistent-volumes


【解决方案1】:

回复评论:

好吧,不好意思,图片名称错误。现在我在容器日志中有一个错误:/bin/sh: kubectl: not found

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

  • gcloud
  • kubectl

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

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

我发现此链接在分配权限以列出 PV 时很有帮助:

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

工作负载身份是从 GKE 中运行的应用程序访问 Google Cloud 服务的推荐方式,因为它改进了安全属性和可管理性。

-- 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

免责声明!

请仅将上述命令视为示例

上述命令将从PV 中获取PDName 属性,并在xargs 之后的命令中对它们中的每一个进行迭代。

创建脚本/程序时需要考虑的一些事项:

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

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

查看以下链接以获取更多参考/想法:

值得一提的是:

CSI 驱动程序是 Kubernetes 存储扩展的未来。 Kubernetes 宣布,预计在 1.21 版本中将移除 Kubernetes 中的 in-tree volume 插件。 详情请参阅Kubernetes In-Tree to CSI Volume Migration Moves to Beta。发生此更改后,使用树内卷插件的现有卷将改为通过 CSI 驱动程序进行通信。

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

为您的StorageClass 切换到CSI 插件将允许您在GKE 内部使用Volume Snapshots

卷快照可让您在特定时间点创建卷的副本。您可以使用此副本将卷恢复到之前的状态或配置新卷。

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


其他资源:

【讨论】:

  • 天啊,这么多信息!非常感谢!我将阅读所有内容,然后测试您提供给我的一些解决方案。现在,为了避免使用 cron,我启动了 google 命令来测试它们是否有效。是的,我发现禁止多项政策的错误。
  • 关于这个的另一个问题:有没有一种方法可以在不使用 CSI 驱动程序的情况下将 GCE 快照恢复到持久卷中?
  • @BarragánLouisenbairn 是的,请看这里:use snapshot to create a disk 和这里:use preexisting disk as PV
  • 经过一些测试,我将我的项目更改为拥有一个带有 CSI 驱动程序的集群。我更改了所有版本(集群 + 节点),配置了 CSI 驱动程序并将我的 Persistent Volume Claim 配置为 standard-rwo storageClass。现在我正在尝试了解如何创建快照卷类。
  • @BarragánLouisenbairn 请查看此文档:cloud.google.com/kubernetes-engine/docs/how-to/…
猜你喜欢
  • 2019-06-03
  • 2017-07-27
  • 2022-10-26
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多