LoginSignup
7
1

More than 1 year has passed since last update.

GKEの外部LB用Ingressをextensions/v1beta1からnetworking.k8s.io/v1にマイグレートする方法

Last updated at Posted at 2021-10-08

想定読者

  • GKEで外部LB用Ingressを利用している
  • IngressのAPIバージョンextensions/v1beta1またはnetworking.k8s.io/v1beta1を利用している
  • k8sのバージョンv1.19~ を利用している

背景

k8sのバージョンv1.22からextensions/v1beta1およびnetworking.k8s.io/v1beta1のIngressが利用出来なくなります。

ということで早速公式の指示に従ってIngressをnetworking.k8s.io/v1にマイグレートしましょう!

注目すべきマニフェストの変更点

今回のアップデートでIngressのAPIが以下のように変更されています。

  • spec.backend -> spec.defaultBackend
  • serviceName -> service.name
  • servicePort -> service.port.number
  • serviceName -> service.port.name
  • L7ルーティングをする場合はpathTypeの指定が必須

kubectl convertによるマニフェストのマイグレート

既存のマニフェストを元に新しいバージョンのマニフェストを生成する場合は以下のコマンドを利用することが推奨されています。

> kubectl convert -f old-ingress.yaml --output-version networking.k8s.io/v1
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: sample-ip
  creationTimestamp: null
  labels:
    app: app-sample
  name: ingress-sample
spec:
  defaultBackend:
    service:
      name: service-sample
      port:
        number: 8080
status:
  loadBalancer: {}

kubectl convertが利用出来ない場合はkubectlのバージョンを最新化した上で公式ドキュメントに従ってpluginをインストールしましょう。

Ingressリソースのマイグレート手順

一般的な方法

既にIngressリソースを作成されている場合は、前述したkubectl convertにより生成したマニフェストを再適用するだけで問題無くマイグレートが可能です。

> kubectl convert -f old-ingress.yaml --output-version networking.k8s.io/v1 > new-ingress.yaml
> kubectl apply -f new-ingress.yaml
ingress.networking.k8s.io/ingress-sample configured

確認した限りダウンタイムの発生は無いですが、トラフィックの多い本番環境に適用する場合は事前に開発環境でダウンタイムの確認をしておくことを推奨します。

カナリアリリースによる方法

先ほどのやり方は簡単ですが、やり直しやロールバックが実質的に不可能で、既にサービスインしているIngressに対して実行するのは怖いです。
そんな場合にもう一つの選択肢として「CloudDNSの重み付きラウンドロビン」を利用したカナリアリリースがあります。

重み付きラウンドロビンは重みに従ってDNSが返すAレコードを分散させる機能です。
今回の場合であれば、旧IngressのIPを99%、新しく作成したIngressのIPを1%の確率で返す、といったような設定を入れることでIngressのカナリアリリースが可能になります。

作業手順

  1. 外部IPを新規作成する
  2. networking.k8s.io/v1のIngressリソースを作成する
    1. リソース名は旧Ingressリソースと異なるものを付けるようにしてください
    2. kubernetes.io/ingress.allow-http:falseを指定する場合はingress.gcp.kubernetes.io/pre-shared-certに旧Ingressに紐付けられているマネージド証明書の名前を指定してください
  3. CloudDNSの重み付きラウンドロビンに2つのIngressのIPを重みとともに設定する
  4. 100%リリース出来たら旧Ingressのリソースを削除する

kubernetes.io/ingress.allow-http:falseの挙動は癖が強いので注意してください。
このアノテーションを作成済みのIngressにあとから追加しようとするとエラーが発生するため、つけ忘れた場合はリソースの作成を最初からやり直す羽目になったりします。。。

まとめ

  • k8sのバージョンv1.22からextensions/v1beta1およびnetworking.k8s.io/v1beta1のIngressが利用出来なくなる
  • 古いマニフェストから新しいバージョンのマニフェストを生成する場合はkubectl convertを使う
  • Ingressをカナリアリリースする場合はCloudDNSの重み付きラウンドロビンを使う
7
1
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
7
1