LoginSignup
27
14

More than 5 years have passed since last update.

GKEのノードプールを利用したKubernetesのアップグレード

Last updated at Posted at 2016-12-02

Google Cloud Platform(2) Advent Calendar 2016 2日目
CyberAgent Developers Advent Calendar 2016 19日目
を担当するstrskです。

Google Cloud Platform(2) Advent Calendar 2016 1日目は、前職でほぼ仕事的に絡みのなかった、僕の師匠とも言えるkumanoryoさんのゲロ吐くほど丁寧な記事ではじまったアドベントカレンダーですが、2日目はカジュアルにGKEのノードプールを利用したKubernetesのアップグレード手順についてお話します。

gcloudコマンドでのアップグレード

アップグレード方法はいくつかありますが、稼働中でなければ以下のコマンドを打つだけです。

$ gcloud container clusters upgrade CLUSTER_NAME

gcloudコマンドでアップグレードした場合は、ノードのインスタンスが1台ずつ削除されアップグレードされます。ただし一度始めると中断できなかったり終了するPodなどをコントロールできないため、稼働中のクラスターで実行するのは危険です。

ノードプールを利用したアップグレード

そこで、GKEのノードプールを利用してアップグレードを行います。この方法であれば、移行後のPodの動作確認や切り戻しが容易にできるので安全にアップグレードできます。

アップグレード手順

ノードプールの確認

$ gcloud container node-pools list --cluster=hoge --zone=asia-east1-a
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.2.4

ノードプール作成

$ gcloud container node-pools create v145 --cluster=hoge --machine-type=n1-standard-1 --disk-size=100 --num-nodes=1 --zone=asia-east1-a
Creating node pool v145...done.
Created [https://container.googleapis.com/v1/projects/hogehoge/zones/asia-east1-a/clusters/hoge/nodePools/v145].
NAME  MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
v145  n1-standard-1  100           1.4.5

これで新しいバージョンのノードプールが作成されました。

$ gcloud container node-pools list --cluster=hoge --zone=asia-east1-a
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.2.4
v145          n1-standard-1  100           1.4.5

$ kubectl get no
NAME                          STATUS    AGE
gke-hoge-65141ecf-node-0ajo   Ready     30d
gke-hoge-v145-632da77c-kkzf   Ready     1m

追記(12/19)

GKEクラスターをHTTP Load Balancerに紐付けている場合は、以下の設定も変えてから作業を行いましょう。

  • GCE Instance groupsのPort name mapping
  • HTTP Load BalancerのBackend serviceで設定しているInstance group

Podのスケジューリング停止

次に、Podを移行する前にdefault-poolへのPodのスケジューリングを停止します。kubectl cordonコマンドでノードを指定するとステータスがSchedulingDisabledになり新規のPodは配置されなくなります。既に起動しているPodには影響ありません。

$ kubectl cordon hoge-65141ecf-node-0ajo
node "gke-hoge-65141ecf-node-0ajo" cordoned

$ kubectl get node
NAME                          STATUS                     AGE
gke-hoge-65141ecf-node-0ajo   Ready,SchedulingDisabled   30d
gke-hoge-v145-632da77c-kkzf   Ready                      1m

Podの再配置

試しにPodを1台だけdeleteしてみます。

$ kubectl delete po fugapod-fclfa
pod "fugapod-fclfa" deleted

$ kubectl get po -o wide |grep fugapod
fugapod-fclfa             1/1       Terminating         0          8h        10.178.15.5     gke-hoge-65141ecf-node-0ajo
fugapod-vpqeh             0/1       ContainerCreating   0          2s        <none>          gke-hoge-v145-632da77c-bro2
fugapod-zwhn7             1/1       Running             0          8h        10.178.20.5     gke-hoge-65141ecf-node-0ajo

新しいノードに再作成されています。

$ kubectl get po -o wide |grep fugapod
fugapod-vpqeh             1/1       Running   0          2s        10.178.63.3     gke-hoge-v145-632da77c-bro2
fugapod-zwhn7             1/1       Running   0          8h        10.178.20.5     gke-hoge-65141ecf-node-0ajo

動作確認

この状態でPodのログなどを確認して問題なければ全台新しいノードに移行させます。
Kubetoolなどで行うと便利です。

最後に

GKEクラスタのマスターは自動的にアップグレードされますが、クラスタノードとマイナーバージョンが3つ以上古くなると正しく動作しなくなる可能性があります。また、Kubernetesは開発が早くリリースが頻繁です。安全にアップグレードし、便利に使っていきましょう!メリークリスマス!!

27
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
14