👋
Istio Canary Upgrade by Helm
前提
- 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の更新
- kubectl apply -f https://raw.githubusercontent.com/istio/istio/1.17.0/manifests/charts/base/crds/crd-all.gen.yaml
新しい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