そもそもの前提として、現状Ingressの設定だけでバックエンドサービスのCloudCDNを有効にすることは出来ないっぽいです(対応予定はあると思うのですが https://github.com/kubernetes/contrib/issues/1680) 。なので作成後直接手で有効にしてます…
CI上で動かそうと思って調べたけど、結局必要無さそうなのでメモとして。
値の取得と実行
Cloud CDNのキャッシュをinvalidationするには、バックエンド サービスにリクエストをルーティングするURL Mapの名前が必要になります。詳しくは公式を見てもらえればと思いますが、Ingressで構築している場合は k8s-xx-xxxx--adsfsewfwefewfwef
みたいな名前が自動的に振られています。
kubectl get ingress $ingress -o go-template='{{ index .metadata.annotations "ingress.kubernetes.io/url-map" }}'
Ingressの情報を取得するにはkubectl
を使うのが手っ取り早いです。metadata.annotationsにurl-mapの情報が入っているのでそれを取得しましょう。
Cloud CDNのinvalidationはgcloud
から実行できます。
gcloud compute url-maps invalidate-cdn-cache $urlmap --path "$target_path"
例
引数処理などは簡略化してます。
# !/bin/sh
project=$1
cluster=$2
zone=$3
ingress=$4
target_path=$5
gcloud --project=$project container clusters get-credentials $cluster --zone $zone
urlmap=$(kubectl get ingress $ingress -o go-template='{{ index .metadata.annotations "ingress.kubernetes.io/url-map" }}')
gcloud compute url-maps invalidate-cdn-cache $urlmap --path "$target_path"
おわり
本来はGCSで完結できれば上記のような事は不要なんですが、GCSではHTTPS・カスタムドメインが使用できない + HTTP LoadBalancerのバックエンドサービスをGCSバケットに指定するのはまだAlphaなので、本番ではちょっと使えなかったんですよね その内来ると思うので、その場合には出来る限りGCSを使いましょう。