はじめに
CronJobとは
ソースコード
- CronJob
- Kubernetes Namespace、Kubernetes ServiceAccount
CronJobのyamlファイル
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-maintenance-ex
namespace: ns-maintenance-ex
spec:
schedule: "0 15 * * 0"
jobTemplate:
spec:
backoffLimit: 0
template:
spec:
serviceAccountName: sa-maintenance-ex
containers:
- name: c-maintenance-ex
image: google/cloud-sdk:latest
command:
- "/bin/bash"
- "-c"
- |
set -e;
apt-get update;
apt-get install -y jq;
apt-get clean;
CLUSTER_NAME='gke-pilot-versionup-dev-autopilot';
ZONE='asia-northeast1';
NEW_EXCLUSION_NAME="exclusion-$(date '+%Y%m%d')";
PERIOD='20 days';
gcloud container clusters update $CLUSTER_NAME --zone $ZONE --add-maintenance-exclusion-name $NEW_EXCLUSION_NAME --add-maintenance-exclusion-start $(date +"%Y-%m-%dT%H:%M:%S%z") --add-maintenance-exclusion-end $(date -d "$PERIOD" +"%Y-%m-%dT%H:%M:%S%z");
echo 'New maintenance exclusion created successfully.';
EXCLUSION_NAMES=$(gcloud container clusters describe $CLUSTER_NAME --zone $ZONE --format='json' | jq -r '.maintenancePolicy.window.maintenanceExclusions | keys[]');
EXCLUSION_NAMES_ARRAY=($EXCLUSION_NAMES);
if [ ${#EXCLUSION_NAMES_ARRAY[@]} -ge 2 ]; then
for EXCLUSION_NAME in $EXCLUSION_NAMES; do
if [ $EXCLUSION_NAME != $NEW_EXCLUSION_NAME ]; then
echo 'Removing maintenance exclusion: $EXCLUSION_NAME';
gcloud container clusters update $CLUSTER_NAME --zone $ZONE --remove-maintenance-exclusion $EXCLUSION_NAME;
fi;
done;
fi
restartPolicy: Never
Kubernetesリソースの指定
kind: CronJob
メタデータ
metadata:
name: cronjob-maintenance-ex
namespace: ns-maintenance-ex
-
name:実装するCronJobの名前
-
namespace:実装するCronJobが所属するKubernetes Namespaceの名前
スケジュール設定
spec:
schedule: "0 15 * * 0"
バックオフリミット設定
jobTemplate:
spec:
backoffLimit: 0
使用するKubernetes ServiceAccountの設定
template:
spec:
serviceAccountName: sa-maintenance-ex
コンテナ設定
containers:
- name: c-maintenance-ex
image: google/cloud-sdk:latest
- name:コンテナの名前
- image:コンテナイメージ
ジョブ内容
command:
- "/bin/bash"
- "-c"
- |
set -e;
apt-get update;
apt-get install -y jq;
apt-get clean;
CLUSTER_NAME='test-gke-cluster';
ZONE='asia-northeast1';
NEW_EXCLUSION_NAME="exclusion-$(date '+%Y%m%d')";
PERIOD='20 days';
gcloud container clusters update $CLUSTER_NAME --zone $ZONE --add-maintenance-exclusion-name $NEW_EXCLUSION_NAME --add-maintenance-exclusion-start $(date +"%Y-%m-%dT%H:%M:%S%z") --add-maintenance-exclusion-end $(date -d "$PERIOD" +"%Y-%m-%dT%H:%M:%S%z");
echo 'New maintenance exclusion created successfully.';
EXCLUSION_NAMES=$(gcloud container clusters describe $CLUSTER_NAME --zone $ZONE --format='json' | jq -r '.maintenancePolicy.window.maintenanceExclusions | keys[]');
EXCLUSION_NAMES_ARRAY=($EXCLUSION_NAMES);
if [ ${#EXCLUSION_NAMES_ARRAY[@]} -ge 2 ]; then
for EXCLUSION_NAME in $EXCLUSION_NAMES; do
if [ $EXCLUSION_NAME != $NEW_EXCLUSION_NAME ]; then
echo 'Removing maintenance exclusion: $EXCLUSION_NAME';
gcloud container clusters update $CLUSTER_NAME --zone $ZONE --remove-maintenance-exclusion $EXCLUSION_NAME;
fi;
done;
fi
リスタートポリシー設定
restartPolicy: Never
Kubernetes Namespace、Kubernetes ServiceAccountのyamlファイル
apiVersion: v1
kind: Namespace
metadata:
labels:
projectid: <プロジェクトID>
name: ns-maintenance-ex
---
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
iam.gke.io/gcp-service-account: <Google ServiceAccountのEメール>
labels:
projectid: <プロジェクトID>
name: sa-maintenance-ex
namespace: ns-maintenance-ex
実装手順
Workload Identityの有効化
$ gcloud container clusters update <クラスタ名> \
--location=<クラスタのロケーション> \
--workload-pool=<PROJECT_ID>.svc.id.goog \
--project=<PROJECT_ID>
Kubectlの有効化
$ gcloud container clusters get-credentials <クラスタ名> \
--location=<クラスタのロケーション> \
--project=$PROJECT
Kubernetes Namespace、Kubernetes ServiceAccountの作成
$ kubectl apply -f kns_ksa.yaml
namespace/ns-maintenance-ex created
serviceaccount/sa-maintenance-ex created
$ kubectl get serviceaccounts -n ns-maintenance-ex
IAM許可ポリシーの作成
Kubernetes ServiceAccountにGoogle ServiceAccountの権限借用を許可するIAM許可ポリシーを作成します。任意のサービスアカウントにKubernetes ServiceAccountを紐づけします。
$ gcloud iam service-accounts add-iam-policy-binding <GSAのEメール> \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:<プロジェクトID>.svc.id.goog[ns-maintenance-ex/sa-maintenance-ex]" \
--project=<プロジェクトID>
CronJobの作成
作成したyamlファイルを適用してCronJobを作成します。Kubernetes NamespaceとKubernetes ServiceAccountを作成したときと同じ要領で進めます。
kubectl apply -f cronjob.yaml
cronjob.batch/cronjob-maintenance-ex created
$ kubectl get cronjob -n ns-maintenance-ex
CronJobの実行
実行結果
まとめ
参考
- Kubernetes公式ドキュメント CronJob
- Google Cloud公式ドキュメント cron ジョブの形式
- Kubernetes公式ドキュメント Pod失敗のバックオフポリシー
- Google Cloud SDKの公式コンテナイメージ
- Google Cloud公式ドキュメント GKE ワークロードから Google Cloud APIs に対する認証を行う
Google Cloud、Google Workspace に関するご相談はXIMIXへ!
Google Cloud、Google Workspaceに関する お問い合わせはこちら
- カテゴリ:
- Google Cloud