部署适用于 Azure Kubernetes 服务的基于 Istio 的服务网格加载项

本文介绍如何为 Azure Kubernetes 服务 (AKS) 群集安装基于 Istio 的服务网格加载项。

有关 Istio 和服务网格加载项的详细信息,请参阅 Azure Kubernetes 服务的 Istio 服务网格加载项

开始之前

  • 加载项需要安装 Azure CLI 2.57.0 或更高版本。 可以运行 az --version 来验证版本。 若要安装或升级,请参阅安装 Azure CLI

  • 若要查找有关哪些 Istio 加载项修订在区域中可用以及它们与 AKS 群集版本的兼容性的信息,请使用命令 az aks mesh get-revisions

    az aks mesh get-revisions --location <location> -o table
    

设置环境变量。

export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>
export LOCATION=<location>

安装 Istio 加载项

本部分包括使用 Azure CLI 在群集创建期间安装 Istio 加载项或为现有群集启用的步骤。 如果要使用 Bicep 安装加载项,请参阅使用 Bicep 安装具有 Istio 服务网格加载项的 AKS 群集指南。 若要详细了解 AKS 群集的 Bicep 资源定义,请参阅 Bicep managedCluster 参考

修订选择

如果在未指定修订的情况下启用加载项,则会为你安装默认支持的修订。

若要指定修订,请执行以下步骤。

  1. 使用 az aks mesh get-revisions 命令检查哪些修订可用于区域中的不同 AKS 群集版本。
  2. 根据可用的修订,可以在用于网格安装的 enable 命令中包含 --revision asm-X-Y(例如 --revision asm-1-20)标志。

在群集创建期间安装网格

若要在创建群集时安装 Istio 加载项,请使用 --enable-azure-service-mesh--enable-asm 参数。

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

az aks create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${CLUSTER} \
    --enable-asm \
    --generate-ssh-keys    

为现有群集安装网格

以下示例为现有 AKS 群集启用 Istio 加载项:

重要

如果现有群集上已有 OSM 加载项,则不能在该群集上启用 Istio 加载项。 在安装 Istio 加载项之前卸载 OSM 加载项。 有关详细信息,请参阅从 AKS 群集卸载 OSM 加载项。 只能在版本不低于 1.23 的 AKS 群集上启用 Istio 加载项。

az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

验证是否成功安装

若要验证 Istio 加载项是否已安装在群集上,请运行以下命令:

az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}  --query 'serviceMeshProfile.mode'

确认输出显示 Istio

使用 az aks get-credentials 获取 AKS 群集的凭据:

az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

使用 kubectl 验证 istiod(Istio 控制平面)Pod 是否成功运行:

kubectl get pods -n aks-istio-system

确认 istiod Pod 的状态为 Running。 例如:

NAME                               READY   STATUS    RESTARTS   AGE
istiod-asm-1-18-74f7f7c46c-xfdtl   1/1     Running   0          2m
istiod-asm-1-18-74f7f7c46c-4nt2v   1/1     Running   0          2m

启用挎斗注入

要自动将挎斗安装到任何新 Pod,需要使用与当前安装的控制平面修订对应的修订标签来批注命名空间。

如果不确定安装了哪个修订,请使用:

az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}  --query 'serviceMeshProfile.istio.revisions'

应用修订标签:

kubectl label namespace default istio.io/rev=asm-X-Y

重要

默认 istio-injection=enabled 标签不起作用。 需要与控制平面修订(例如 istio.io/rev=asm-1-18)匹配的显式版本控制。

若要使用 istioctl kube-inject 手动注入挎斗,需要为 istioNamespace (-i) 和 revision (-r) 指定额外的参数。 例如:

kubectl apply -f <(istioctl kube-inject -f sample.yaml -i aks-istio-system -r asm-X-Y) -n foo

触发 Sidecar 注入

可以部署为测试提供的示例应用程序,也可以为现有工作负载触发 Sidecar 注入。

现有应用程序

如果已有要添加到网格中的应用程序,请确保按上一步所述标记其命名空间,然后重启其部署以触发 Sidecar 注入:

kubectl rollout restart -n <namespace> <deployment name>

验证 Sidecar 注入是否成功,方法是确保所有容器都准备就绪,并在 kubectl describe 输出中查找 istio-proxy 容器,例如:

kubectl describe pod -n namespace <pod name>

istio-proxy 容器是 Envoy Sidecar。 应用程序现在是数据平面的一部分。

部署示例应用程序

使用 kubectl apply 将示例应用程序部署到群集:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/platform/kube/bookinfo.yaml

注意

使用 HTTP 代理进行出站 Internet 访问的群集需要设置服务条目。 如需设置说明,请参阅 Azure Kubernetes 服务中的 HTTP 代理支持

确认已在群集上创建了多个部署和服务。 例如:

service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

使用 kubectl get services 验证是否已成功创建服务:

kubectl get services

确认已部署以下服务:

NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.0.180.193   <none>        9080/TCP   87s
kubernetes    ClusterIP   10.0.0.1       <none>        443/TCP    15m
productpage   ClusterIP   10.0.112.238   <none>        9080/TCP   86s
ratings       ClusterIP   10.0.15.201    <none>        9080/TCP   86s
reviews       ClusterIP   10.0.73.95     <none>        9080/TCP   86s
kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-558b8b4b76-2llld       2/2     Running   0          2m41s
productpage-v1-6987489c74-lpkgl   2/2     Running   0          2m40s
ratings-v1-7dc98c7588-vzftc       2/2     Running   0          2m41s
reviews-v1-7f99cc4496-gdxfn       2/2     Running   0          2m41s
reviews-v2-7d79d5bd5d-8zzqd       2/2     Running   0          2m41s
reviews-v3-7dbcdcbc56-m8dph       2/2     Running   0          2m41s

确认所有 Pod 的状态均为 Running,并且 READY 列中带有两个容器。 添加到每个 Pod 的第二个容器 (istio-proxy) 是 Istio 注入的 Envoy Sidecar,另一个是应用程序容器。

若要对示例应用程序进行入口测试,请查看后续步骤

删除资源

使用 kubectl delete 删除示例应用程序:

kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/platform/kube/bookinfo.yaml

如果不打算在群集上启用 Istio 入口,并且想要禁用 Istio 加载项,请运行以下命令:

az aks mesh disable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

注意

禁用服务网格加载项将会从群集中完全删除 Istio 控制平面。

默认情况下,不会删除 Istio CustomResourceDefintion (CRD)。 若要清理它们,请使用:

kubectl delete crd $(kubectl get crd -A | grep "istio.io" | awk '{print $1}')

使用 az group delete 删除群集和关联的资源:

az group delete --name ${RESOURCE_GROUP} --yes --no-wait

后续步骤