微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 AKS 中的 Istio 从 1.7 版升级到 1.8 版

如何解决如何将 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 的安装方式如下:

  1. 创建的清单:

    istioctl manifest generate --set profile=default -f /manifests/overlay/overlay.yaml > $HOME/generated-manifest.yaml

  2. 已安装的 istio:

    istioctl install --set profile=default -f /manifests/overlay/overlay.yaml

  3. 根据部署的清单验证 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时,出现policytelemetry组件错误:

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.yaml1.7.3 istio安装的asnwer开头描述了1.8.6,并在它们之间得到了diffpolicy和{ 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.yamlcanary

3 - 清单不是默认的并且具有自定义功能。使用 --set profile=default 获取默认配置文件的转储:

istioctl 1.8.6

“调整”它以适应当前现有的清单,然后继续安装带有 istioctl profile dump default > default-profile-186.yaml 选项和 canary 清单的 -f

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。