如何解决如何将 AKS 中的 Istio 从 1.7 版升级到 1.8 版
我对 ISTIO 很陌生,想澄清我的以下疑问。
Details
Current AKS version 1.18.14
planning upgrade to AKS 1.19.11
Current istio version 1.7
Planning upgrade to 1.8
我们计划将生产中的 AKS 集群 1.18.14 中的 Istio 版本从 1.7 升级到 1.8。
但我不确定在生产中遵循的正确升级方法,因为 Istio 提供了多种方法。
我不知道当前的 Istio 设置是如何在我的环境中完成的,以及我们很久以前使用的配置文件设置。可以理解下面是安装 istio 所遵循的步骤..
Istio 的安装方式如下:
-
创建的清单:
istioctl manifest generate --set profile=default -f /manifests/overlay/overlay.yaml > $HOME/generated-manifest.yaml
-
已安装的 istio:
istioctl install --set profile=default -f /manifests/overlay/overlay.yaml
-
根据部署的清单验证 istio:
istioctl verify-install -f $HOME/generated-manifest.yaml
是否有任何方法可以导出所有现有设置(当前正在运行的设置)并进行升级?
所以我正在寻找一种生产就绪的方法来升级 Istio,并放置所有现有设置。
解决方法
重要
首先考虑复制环境并在 dev/stage 上执行升级,以确保它适用于您和您的基础架构。
检查你到底安装了什么
可以通过获取 installed state custom resource
和所有设置来完成:
kubectl -n istio-system get IstioOperator installed-state -o yaml > installed-state.yaml
以下是根据官方文档使用 istioctl
进行升级的步骤
从 1.7.3 到 1.8.6,这对于其他版本来说是相似的,但是升级应该不超过 1 个次要版本的差异,例如1.5 到 1.6。
可用版本和发布可以在 Istio Github 中检查。
1 - 安装 istioctl
版本 1.8.6:
获取所需的二进制文件:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.6 TARGET_ARCH=x86_64 sh -
并复制 istiolctl
bin:
sudo cp bin/istioctl /usr/local/bin/
2 - 运行 istioctl version
以确认 istioctl
版本和控制/数据平面版本:
client version: 1.8.6
control plane version: 1.7.3
data plane version: 1.7.3 (3 proxies)
3 - 运行 istioctl x precheck
以查看是否设置了修订(it may be different if set - 请参阅部分末尾的警告)
Istio Revision "" already installed in namespace "istio-system"
主要有两种升级策略:
供应商 suggests 使用 Canary,因为它更安全,并且可以在最终迁移之前进行测试。
4 - Create a backup:
kubectl get istio-io --all-namespaces -oyaml > "$HOME"/istio_resource_backup.yaml
可以通过以下方式恢复:
kubectl apply -f "$HOME"/istio_resource_backup.yaml
5 - 控制平面 - 安装 Canary 版本
istioctl install --set profile=default --set revision=1-8-6
通过运行以下命令检查它是否安装成功:
kubectl get pods -n istio-system -l app=istiod
NAME READY STATUS RESTARTS AGE
istiod-1-8-6-b855c557b-qq4qd 1/1 Running 0 44s
istiod-54b46bbc58-wzklh 1/1 Running 0 14m
kubectl get svc -n istio-system -l app=istiod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istiod ClusterIP 10.109.24.78 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 15m
istiod-1-8-6 ClusterIP 10.101.241.85 <none> 15010/TCP,15014/TCP 2m12s
kubectl get mutatingwebhookconfigurations
NAME WEBHOOKS AGE
istio-sidecar-injector 1 15m
istio-sidecar-injector-1-8-6 1 98s
6 - 数据平面
与 istiod 不同,Istio 网关不运行特定于修订版的实例,而是就地升级以使用新的控制平面修订版。您可以通过运行以下命令来验证 istio-ingress
网关是否正在使用 canary
修订版:
istioctl proxy-status | grep $(kubectl -n istio-system get pod -l app=istio-ingressgateway -o jsonpath='{.items..metadata.name}') | awk '{print $7}'
要升级命名空间 NAME_SPACE
,请移除 istio-injection
标签,并添加 istio.io/rev
标签以指向 canary
修订版。必须删除 istio-injection
标签,因为它优先于 istio.io/rev
标签以实现向后兼容性:
kubectl label namespace NAME_SPACE istio-injection- istio.io/rev=1-8-6
命名空间更新后,需要重新注入 pod。这可以通过重新启动它们来完成,例如与:
kubectl rollout restart deployment -n NAME_SPACE
验证 pod 现在正在使用 canary
istiod:
istioctl proxy-status
NAME CDS LDS EDS RDS ISTIOD VERSION
istio-ingressgateway-6664d4b478-j7vhh.istio-system SYNCED SYNCED SYNCED NOT SENT istiod-1-8-6-b855c557b-qq4qd 1.8.6
nginx-68748d7f8c-82x8k.default SYNCED SYNCED SYNCED SYNCED istiod-1-8-6-b855c557b-qq4qd 1.8.6
nginx-68748d7f8c-fnhgz.default SYNCED SYNCED SYNCED SYNCED istiod-1-8-6-b855c557b-qq4qd 1.8.6
7 - 卸载旧的控制平面
运行:
istioctl x uninstall -f manifests/profiles/default.yaml
仅检查金丝雀控制平面正在运行:
kubectl get pods -n istio-system -l app=istiod
NAME READY STATUS RESTARTS AGE
istiod-1-8-6-b855c557b-qq4qd 1/1 Running 0 17m
其他类型的 istio 安装可用:
请熟悉istio installation methods' pros and cons。
有用的链接
更新
从评论中移动这个。从 1.7.3 更新到 1.8.6 istio 版本存在更多挑战。
要删除当前控制平面 -f
和以前的清单,应该使用。
向1.8.6
版本申请同一个manifest时,出现policy
和telemetry
组件错误:
Error: failed to get profile and enabled components: failed to read profile: unknown field "telemetry" in v1alpha1.IstioComponentSetSpec
挖掘后发现,即使使用了相同的 api 版本 - v1alpha1
,但较新版本的 istioctl operator
无法验证来自 1.7.3
的清单。
我从installed-state.yaml
和1.7.3
istio安装的asnwer开头描述了1.8.6
,并在它们之间得到了diff
:policy
和{ telemetry
中完全缺少 {1}} 组件,这解释了错误。也有一些变化。 Github link to the diff file,左边是 1.8.6
,右边是 1.7.3
。
在这种情况下,如果不使用清单手动操作可能无法升级:
1 - 检查应用的清单是否为默认值或有更改。获取默认配置文件(注意!应该使用 istioctl 1.8.6
):
1.7.3
2 - 如果 manifest 是默认值,则安全地继续安装 istioctl profile dump default > default-profile.yaml
和 canary
。
3 - 清单不是默认的并且具有自定义功能。使用 --set profile=default
获取默认配置文件的转储:
istioctl 1.8.6
“调整”它以适应当前现有的清单,然后继续安装带有 istioctl profile dump default > default-profile-186.yaml
选项和 canary
清单的 -f
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。