👋

Istio Canary Upgrade by Helm

2023/06/12に公開

前提

  • helmfileを利用
  • istioのrevisionTagを利用
  • 関係のない設定は省略

Upgradeの前にInstall

ディレクトリ構成

├── helmfile_istio-base.yaml
├── helmfile_istio-ingressgateway.yaml
├── helmfile_istiod-1-16-0.yaml
└── values
    ├── istio-base.yaml
    ├── istio-ingressgateway.yaml
    └── istiod.yaml

helmfile

helmfile_istio-base.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istio-base
    namespace: istio-system
    chart: istio/base
    version: 1.16.0
    values:
      - values/istio-base.yaml

helmfile_istiod-1-16-0.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istiod-1-16-0
    namespace: istio-system
    chart: istio/istiod
    version: 1.16.0
    values:
      - values/istiod.yaml

helmfile_istio-ingressgateway.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istio-ingressgateway
    namespace: istio-system
    chart: istio/gateway
    version: 1.16.0
    values:
      - values/istio-ingressgateway.yaml

values

istio-base.yaml

defaultRevision: "1-16-0"

istiod.yaml

revision: "1-16-0"

revisionTags: ["stable"]

global:
  tag: 1.16.0

istio-ingressgateway.yaml

revision: "1-16-0"

手順

# istio-base
- helmfile -f helmfile_istio-base.yaml diff
- helmfile -f helmfile_istio-base.yaml sync

# istiod
- helmfile -f helmfile_istiod-1-16-0.yaml diff
- helmfile -f helmfile_istiod-1-16-0.yaml sync

# istio-ingressgateway
- helmfile -f helmfile_istio-ingressgateway.yaml diff
- helmfile -f helmfile_istio-ingressgateway.yaml sync

Upgrade

1.16.0 -> 1.17.0

事前準備

  • 新しいバージョンのistiodのhelmfileを新たに用意する
  • istio-base, istio-ingressgatewayはhelmfileを更新する
  • 各valuesのversion, revisionを更新する

ファイル構成

├── helmfile_istio-base.yaml
├── helmfile_istio-ingressgateway.yaml
├── helmfile_istiod-1-16-0.yaml
├── helmfile_istiod-1-17-0.yaml # 追加
└── values
    ├── istio-base.yaml
    ├── istio-ingressgateway.yaml
    └── istiod.yaml

helmfile

helmfile_istio-base.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istio-base
    namespace: istio-system
    chart: istio/base
    version: 1.17.0 # 変更
    values:
      - values/istio-base.yaml

helmfile_istiod-1-17-0.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istiod-1-17-0 # 変更
    namespace: istio-system
    chart: istio/istiod
    version: 1.17.0 # 変更
    values:
      - values/istiod.yaml

helmfile_istio-ingressgateway.yaml

repositories:
  - name: istio
    url: https://istio-release.storage.googleapis.com/charts

releases:
  - name: istio-ingressgateway
    namespace: istio-system
    chart: istio/gateway
    version: 1.17.0 # 変更
    values:
      - values/istio-ingressgateway.yaml

values

istio-base.yaml

defaultRevision: "1-17-0" # 変更

istiod.yaml

revision: "1-17-0" # 変更

revisionTags: ["stable"]

global:
  tag: 1.17.0 # 変更

istio-ingressgateway.yaml

revision: "1-17-0" # 変更

手順

CRDの更新

新しいistiodの追加

  • helmfile -f helmfile_istiod-1-16-0.yaml diff --set 'revisionTags=null'
  • helmfile -f helmfile_istiod-1-16-0.yaml sync --set 'revisionTags=null'
    • istio-revision-tag-stableは名前にrevisionが含まれず実体が重複しエラーになるので一時的に削除
    • 存在してない間は新しくPodが立ち上がってもistio-proxyがinjectされない
  • helmfile -f helmfile_istiod-1-17-0.yaml diff
  • helmfile -f helmfile_istiod-1-17-0.yaml sync
    • istiodが2つ動くのでCPUが足りなくてPenddingする場合は、一時的に性能を上げる
  • kubectl get pods -n istio-system -l app=istiod
    • 新旧のistiodが存在することを確認

istio-proxyの更新

  • kubectl rollout restart deployments/istio-ingressgateway -n istio-system
  • kubectl rollout restart deployment -n namespace
  • istioctl proxy-status | grep '1.16.0'
    • 古いistio-proxyがないことを確認

古いistiodの削除

  • helmfile -f helmfile_istiod-1-16-0.yaml destroy
  • kubectl get pods -n istio-system -l app=istiod
    • 新しいistiodだけ存在することを確認

istio-baseの更新

  • helmfile -f helmfile_istio-base.yaml diff
  • helmfile -f helmfile_istio-base.yaml sync --skip-crds
  • kubectl get roles.rbac.authorization.k8s.io -n istio-system
    • Roleが更新されていることを確認

istio-ingressgatewayの更新

  • helmfile -f helmfile_istio-ingressgateway.yaml diff
  • helmfile -f helmfile_istio-ingressgateway.yaml sync
  • kubectl get deployment.apps/istio-ingressgateway -o jsonpath='{.metadata.labels.app.kubernetes.io/version}' -n istio-system
    • ingressgatewayが更新されていることを確認

Discussion