はじめに
GKEではk8sのバージョンアップは3世代離れてしまうと面倒くさくなるので、
頻繁(とは言っても3ヶ月ごと)にアップしていくことを強くお勧めします。
ただし、GKE上で無邪気にk8sバージョンアップしてしまうと、必ずサービスのダウンタイムが発生してしまいます。
そのため、ダウンタイムを発生させたくない場合には工夫する必要があります。
今回は、DNS切り替えにより解決する手順を残します。
(追記)リージョナルクラスタの場合はマスターノードに冗長性があるため基本的に当方法は不要です。
普通にupgradeすればダウンタイム発生しません。
ざっくり手順
- 新しいクラスタを用意する
- DNS切り替える
- 古い環境消す
新しいクラスタを用意する
- 新しいクラスタを作る
--cluster-version
は必ずバージョンアップ後のものを指定してください。デフォルトが使われると意図したものが指定されない場合があります。
--region
は指定していた方が良いです。
gcloud beta container clusters create cluster-new \
--region=asia-northeast1 \
--network=default \
--cluster-version=1.10.2-gke.1 \
--project=your_project \
--no-enable-autorepair
- コンポーネントをデプロイする
お手持ちのk8sのマニフェストをapplyしてください。
持ってない場合は頑張って作ってください。
kubectl config current-context # 念のため現在どのクラスタを向いているのか確認
kubectl config get-contexts # 一覧取得
kubectl config set-context {cluster_gke_cluster_new} # 向いてなかったら向ける
kubectl apply -f hogehoge.yaml
- static ipが割り振られるのを待つ
GKEならingress
かServiceのtype:LoadBalancer
を使っていると思います。
待ってれば、そのうち割り振られます。
kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
test-ingress * XXXXXXXXX 80, 443 1h
はい、割り振られたら覚えておいといてください。
DNS切り替え
ドメインで公開してないとかの人はまあこれ以降は参考程度にお願いします。
ここではGCPのホスティングサービス前提で話します。
- uptime checkを設置
DNS切り替えの前にちゃんとサービスが切り替わってるのか確認しながらやるためにやりましょう。
StackDriver -> Monitoring -> Uptime Checks -> Add Uptime Check
こんな感じで間隔は短めで設定します。
- ローカルからも周期的に殴っておきましょう
上記のuptime checkはいろんな地域から殴ってくるのでとても良いのですが、周期が最短1分なのできになる人はローカルでも殴ると良いです。
今回はvegetaを使います。
1秒周期で3時間以上ひたすら殴る設定です。
この状態で放置しておきます。
echo "GET https://hogehoge.com" | vegeta attack -duration=10000s -rate=1 -insecure | tee results.bin | vegeta report
- アクセスログをみる
StackDriver -> LoggingでLBのログを見ておきましょう。
Cloud HTTP Load Balancer -> 新旧それぞれのLBを選択しておいて2窓で開いておきます。
- レコードセット
ようやくDNS切り替えです。
Network Services -> Cloud DNS
ここで該当のレコードをさっき控えたIPに切り替えます。
前述したアクセスログには、uptime checkやvegetaで殴っているログが出ると思います。
新ログにログが出ていて 且つ 旧ログにアクセスがこなくなった時点で切り替えはできているとしましょう。
もしかしたら、事前に1日前くらいからDNSレコードのTTLを短くしておけば、この切り替えが早いかもしれません。
旧環境を消す
いらないので消しましょう。情けはいりません。
gcloud container clusters delete cluster-old --region=asia-northeast1
以上