SIDECAR 注入

要让应用程序中的 pod 加入网格,它必须有一个在 pod 中运行 sidecar 的 Envoy 代理容器。 这将建立 AWS App Mesh 的数据平面。 因此,我们必须在 Product Catalog App 部署的每个 pod 中运行一个 Envoy 容器。 例如:

App Mesh 这可以通过几种不同的方式完成:

  • 在安装应用程序之前,可以修改 Product Catalog App Deployment 的yaml文件,以包含 App Mesh sidecar 容器,并设置一些必需的配置和环境变量。 部署 Pod 后,它将运行 sidecar。
  • 安装应用程序后,可以对deployment进行patch,增加sidecar容器。 应用patch后,旧的 pod 将被干掉,新的 pod 将与sidecar一起被创建。
  • 您可以在mesh命名空间中启用 AWS App Mesh Sidecar Injector,它会监视后面创建的新 pod,并在部署时自动将 sidecar 容器和所需配置添加到 pod(推荐方式)。

在本教程中,我们将使用第三个选项为 pod 启用自动sidecar注入。

当我们在上一章 中创建mesh resource时,我们通过在 prodcatalog-ns 命名空间上添加标签 Labels: appmesh.k8s.aws/sidecarInjectorWebhook=enabled 来启用自动sidecar注入。但这是在初始 pod 创建后完成的,目前,我们的每个 pod 都只是运行着一个容器。

kubectl get pods -n prodcatalog-ns -o wide

NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE                                                   NOMINATED NODE   READINESS GATES
pod/frontend-node-77d64585d4-xxxx   1/1     Running   0          13h   192.168.X.6     ip-192-168-X-X.us-west-2.compute.internal           <none>           <none>
pod/prodcatalog-98f7c5f87-xxxxx      1/1     Running   0          13h   192.168.X.17   fargate-ip-192-168-X-X.us-west-2.compute.internal   <none>           <none>
pod/proddetail-5b558df99d-xxxxx      1/1     Running   0          18h   192.168.24.X   ip-192-168-X-X.us-west-2.compute.internal            <none>           <none>

要为这些 pod 注入 sidecar 代理,只需重新启动部署即可。 控制器将自动处理注入:

kubectl -n prodcatalog-ns rollout restart deployment prodcatalog

kubectl -n prodcatalog-ns rollout restart deployment proddetail 

kubectl -n prodcatalog-ns rollout restart deployment frontend-node

获取 Pod 详细信息。 您应该在每个 pod 中看到 3 个容器main application containerenvoy sidecar containerxray sidecar container

重启 Fargate Pod 需要 4 到 6 分钟

中间过程:

image-20210714211603044 最终部署完成:

kubectl get pods -n prodcatalog-ns -o wide

NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE                                                   NOMINATED NODE   READINESS GATES
pod/frontend-node-77d64585d4-xxxx   3/3     Running   0          13h   192.168.X.6     ip-192-168-X-X.us-west-2.compute.internal           <none>           <none>
pod/prodcatalog-98f7c5f87-xxxxx      3/3     Running   0          13h   192.168.X.17   fargate-ip-192-168-X-X.us-west-2.compute.internal   <none>           <none>
pod/proddetail-5b558df99d-xxxxx      3/3     Running   0          18h   192.168.24.X   ip-192-168-X-X.us-west-2.compute.internal            <none>           <none>                                                                       3000/TCP       44h   app=proddetail,version=v1

从 pod 获取正在运行的容器

我们可以看到有两个 sidecar 容器envoyxray-daemon, 以及应用容器frontend-node

POD=$(kubectl -n prodcatalog-ns get pods -o jsonpath='{.items[0].metadata.name}')
kubectl -n prodcatalog-ns get pods ${POD} -o jsonpath='{.spec.containers[*].name}'; echo

运行结果: frontend-node envoy xray-daemon