如何在 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
带有 Role
和 RoleBinding
.
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
,因为 pdName
是 GCP
中 gce-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:
- whosebug.com: Answer: Periodic database backup in kubernetes
- Stash.run: Guides: Latest: Volumesnapshot: PVC
- Velero.io
值得一提的是:
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
其他资源:
我在我的 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
带有Role
和RoleBinding
.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
,因为 pdName
是 GCP
中 gce-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
。 ReplacedCronJob
将从头开始遍历所有这些磁盘。命令无法在所需时间内完成,CronJob
将被替换。 - 您将需要检查正确的
kubectl
版本,因为官方支持允许客户端和服务器之间存在 +1/-1 版本差异(cloud-sdk:latest
使用v1.19.3
)。
我强烈建议您寻找其他方法来备份您的 PVC
(例如 VolumeSnapshots
)。
查看以下链接了解更多信息 reference/ideas:
- whosebug.com: Answer: Periodic database backup in kubernetes
- Stash.run: Guides: Latest: Volumesnapshot: PVC
- Velero.io
值得一提的是:
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
其他资源: