

# 使用 CloudFormation 或 Helm 部署 Enhanced Container Insights（Classic）
<a name="container-insights-eks-classic-iac"></a>

可以使用 CloudFormation 模板或 Helm 图表将 Enhanced Container Insights（Classic）部署为基础设施即代码。此方法可安装 v6.2.0 之前版本的 `amazon-cloudwatch-observability` 附加组件，以启用 Classic 指标管道。如果通过 IaC 管道管理集群，并且想要可重复的、受版本控制的部署，请选择此方法。

**建议**  
对于新的部署，建议使用 [Enhanced Container Insights（建议）](container-insights-eks-otel.md)，其将附加组件版本 6.2.0 或更高版本与基于 OTEL 的管道搭配使用。

## 先决条件
<a name="container-insights-eks-classic-iac-prereqs"></a>

在通过 CloudFormation 或 Helm 部署 Enhanced Container Insights（Classic）之前，请确认已满足以下要求。
+ 运行 Kubernetes 1.25 版本或更高版本的现有 Amazon EKS 集群
+ AWS CLI 版本 2.12.0 或更高版本
+ 已配置 `kubectl` 以与目标集群通信
+ 用于创建 CloudFormation 堆栈的 IAM 权限（适用于 CloudFormation 方法）
+ Helm v3.8 或更高版本（适用于 Helm 方法）
+ 从集群到 CloudWatch 端点的出站互联网访问

## 使用 CloudFormation 进行部署
<a name="container-insights-eks-classic-iac-cloudformation"></a>

使用 CloudFormation 模板部署具有 Classic 配置的 CloudWatch 可观测性附加组件。此模板使用 `AWS::EKS::Addon` 资源来安装 v6.2.0 之前版本的附加组件。

### CloudFormation 模板
<a name="container-insights-eks-classic-iac-cfn-template"></a>

以下模板创建了在 Amazon EKS 集群上启用 Enhanced Container Insights（Classic）所需的资源。

```
AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy Enhanced Container Insights (Classic) on an EKS cluster

Parameters:
  ClusterName:
    Type: String
    Description: The name of your EKS cluster

Resources:
  CloudWatchAgentRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: EKS-CloudWatch-Agent-Role
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: pods.eks.amazonaws.com
            Action:
              - sts:AssumeRole
              - sts:TagSession
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

  PodIdentityAssociation:
    Type: AWS::EKS::PodIdentityAssociation
    Properties:
      ClusterName: !Ref ClusterName
      Namespace: amazon-cloudwatch
      ServiceAccount: cloudwatch-agent
      RoleArn: !GetAtt CloudWatchAgentRole.Arn

  CloudWatchObservabilityAddon:
    Type: AWS::EKS::Addon
    DependsOn: PodIdentityAssociation
    Properties:
      ClusterName: !Ref ClusterName
      AddonName: amazon-cloudwatch-observability
      AddonVersion: v5.4.0-eksbuild.1
      ServiceAccountRoleArn: !GetAtt CloudWatchAgentRole.Arn
      ResolveConflicts: OVERWRITE
```

此模板创建以下资源：
+ 附加了 `CloudWatchAgentServerPolicy` 托管策略的 IAM 角色
+ EKS 容器组身份关联，用于将角色映射到 CloudWatch 代理服务账户
+ 带有 Classic 版本（v6.2.0 之前的版本）的 `amazon-cloudwatch-observability` EKS 附加组件

### 部署 CloudFormation 堆栈
<a name="container-insights-eks-classic-iac-cfn-deploy"></a>

使用 AWS CLI 根据模板创建 CloudFormation 堆栈。

**部署堆栈**

1. 将前述模板保存到一个名为 `classic-container-insights.yaml` 的文件中。

1. 运行如下命令。将 {{cluster-name}} 替换为 Amazon EKS 集群的名称。

   ```
   aws cloudformation create-stack \
     --stack-name classic-container-insights \
     --template-body file://classic-container-insights.yaml \
     --parameters ParameterKey=ClusterName,ParameterValue={{cluster-name}} \
     --capabilities CAPABILITY_NAMED_IAM
   ```

1. 等待堆栈创建完成。

   ```
   aws cloudformation wait stack-create-complete \
     --stack-name classic-container-insights
   ```

1. 确认堆栈状态是否为 `CREATE_COMPLETE`。

   ```
   aws cloudformation describe-stacks \
     --stack-name classic-container-insights \
     --query "Stacks[0].StackStatus" \
     --output text
   ```

## 使用 Helm 进行部署
<a name="container-insights-eks-classic-iac-helm"></a>

如果使用 Helm 来管理 Kubernetes 工作负载，请使用 Helm 图表部署 Enhanced Container Insights（Classic）。该图表安装了带有 Classic 指标管道的 CloudWatch 可观测性算子。

**注意**  
使用 Helm 时，必须分别创建 IAM 角色和容器组身份关联。Helm 图表仅安装 Kubernetes 资源。

### 步骤 1：创建 IAM 角色
<a name="container-insights-eks-classic-iac-helm-iam"></a>

安装 Helm 图表之前为 CloudWatch 代理创建 IAM 角色。

**创建 IAM 角色和容器组身份关联**

1. 运行以下命令为 EKS 容器组身份创建具有信任策略的角色。

   ```
   aws iam create-role \
     --role-name EKS-CloudWatch-Agent-Role \
     --assume-role-policy-document '{
       "Version": "2012-10-17",
       "Statement": [{
         "Effect": "Allow",
         "Principal": { "Service": "pods.eks.amazonaws.com" },
         "Action": ["sts:AssumeRole", "sts:TagSession"]
       }]
     }'
   ```

1. 将 `CloudWatchAgentServerPolicy` 托管式策略附加到角色。

   ```
   aws iam attach-role-policy \
     --role-name EKS-CloudWatch-Agent-Role \
     --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
   ```

1. 创建容器组身份关联。将 {{cluster-name}} 替换为 Amazon EKS 集群的名称，并将 {{account-id}} 替换为 AWS 账户 ID。

   ```
   aws eks create-pod-identity-association \
     --cluster-name {{cluster-name}} \
     --namespace amazon-cloudwatch \
     --service-account cloudwatch-agent \
     --role-arn arn:aws:iam::{{account-id}}:role/EKS-CloudWatch-Agent-Role
   ```

### 步骤 2：安装 Helm 图表
<a name="container-insights-eks-classic-iac-helm-install"></a>

安装 Classic 版本（v6.2.0 之前的版本）的 CloudWatch 可观测性 Helm 图表。

**安装 Helm 图表**

1. 运行如下命令。将 {{cluster-name}} 替换为 Amazon EKS 集群的名称，并将 {{region}} 替换为您的 AWS 区域。

   ```
   helm install amazon-cloudwatch-observability \
     oci://public.ecr.aws/cloudwatch-agent/amazon-cloudwatch-observability-helm-chart \
     --namespace amazon-cloudwatch \
     --create-namespace \
     --set clusterName={{cluster-name}} \
     --set region={{region}} \
     --version 5.4.0
   ```

1. 确认 Helm 版本是否已成功部署。

   ```
   helm list -n amazon-cloudwatch
   ```

   状态必须为 `deployed`。

## 验证部署
<a name="container-insights-eks-classic-iac-verify"></a>

CloudFormation 堆栈创建或 Helm 安装完成后，请确认附加组件是否正在运行并将数据发送到 CloudWatch。

**验证部署**

1. 确认 CloudWatch 代理容器组（pod）是否正在运行。

   ```
   kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent
   ```

   所有容器组（pod）都必须显示 `Running` 状态。

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Metrics**（指标），然后选择 **All metrics**（所有指标）。

1. 确认指标是否显示在集群的 `ContainerInsights` 命名空间中。

指标通常会在部署完成后的 3 到 5 分钟内显示在 CloudWatch 中。

## 后续步骤
<a name="container-insights-eks-classic-iac-next"></a>

部署 Enhanced Container Insights（Classic）后，即可浏览以下主题。
+ 有关基于控制台的设置，请参阅[从控制台启用 Enhanced Container Insights（Classic）](container-insights-eks-classic-console.md)。
+ 有关基于 AWS CLI 的设置，请参阅[设置指南（AWS CLI）](container-insights-eks-classic-setup.md)。
+ 有关 Enhanced Container Insights（Classic）收集的指标的信息，请参阅 [Enhanced Container Insights（Classic）指标参考](container-insights-eks-classic-metrics.md)。
+ 要迁移到 OTel Containainer Insights，请参阅[从 Enhanced Container Insights（Classic）迁移到 OTel Container Insights](container-insights-eks-migrate-from-classic.md)。
+ 有关 OTel Container Insights 的更多信息，请参阅 [Enhanced Container Insights（建议）](container-insights-eks-otel.md)。