安装或更新 Amazon VPC CNI plugin for Kubernetes 指标帮助程序附加组件 - Amazon EKS

安装或更新 Amazon VPC CNI plugin for Kubernetes 指标帮助程序附加组件

Amazon VPC CNI plugin for Kubernetes 指标帮助程序是一种工具,您可以用来抓取网络接口和 IP 地址信息、在集群级别聚合指标以及将指标推送到 Amazon CloudWatch。要详细了解指标帮助程序,请参阅 GitHub 上的 cni-metrics-helper

在管理 Amazon EKS 集群时,您可能希望了解已经分配了多少个 IP 地址以及还有多少个地址可用。Amazon VPC CNI plugin for Kubernetes 指标帮助程序可帮助您:

  • 跟踪这些指标随时间的变化

  • 诊断和排除与 IP 分配和回收相关的问题

  • 提供容量规划见解

预置了节点时,Amazon VPC CNI plugin for Kubernetes 会自动从节点的子网向主网络接口(eth0)分配辅助 IP 地址池。此 IP 地址池称为暖池,其大小由节点的实例类型确定。例如,一个 c4.large 实例的每个接口可以支持三个网络接口和九个 IP 地址。可供指定 pod 使用的 IP 地址数量比最大值(十个)少一个,因为其中一个 IP 地址预留给弹性网络接口自身。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的每个实例类型的每个网络接口的 IP 地址

在 IP 地址池耗尽时,该插件会自动附加另一个弹性网络接口到实例,并将另外一组辅助 IP 地址分配到接口。此过程将继续,直到节点不再支持额外的弹性网络接口。

系统为您的集群收集以下指标并导出到 CloudWatch:

  • 集群可以支持的网络接口的最大数量

  • 已分配到 pods 的网络接口数

  • 当前分配给 pods 的 IP 地址

  • IP 地址总数以及最大可用 IP 地址数

  • ipamD 错误数

先决条件
  • 集群的现有 AWS Identity and Access Management IAM OpenID Connect (OIDC) 提供商。要确定您是否已经拥有一个或是否要创建一个,请参阅 为集群创建 IAM OIDC 提供商

  • 您的设备或 AWS CloudShell 上安装并配置了 2.9.20 版或更高版本,或 1.27.63 版或更高版本的 AWS CLI。您可以使用 aws --version | cut -d / -f2 | cut -d ' ' -f1 检查您的当前版本。软件包管理器(如 yumapt-get 或适用于 macOS 的 Homebrew)通常比 AWS CLI 的最新版本落后几个版本。要安装最新版本,请参阅《AWS Command Line Interface 用户指南》中的安装、更新和卸载 AWS CLI使用 aws configure 进行快速配置。AWS CloudShell 中安装的 AWS CLI 版本也可能比最新版本落后几个版本。要对其进行更新,请参阅《AWS CloudShell 用户指南》中的将 AWS CLI 安装到您的主目录

  • 您的设备或 AWS CloudShell 上安装了 kubectl 命令行工具。该版本可以与集群的 Kubernetes 版本相同,或者最多早于或晚于该版本一个次要版本。例如,如果您的集群版本为 1.24,则可以将 kubectl1.231.241.25 版本与之配合使用。要安装或升级 kubectl,请参阅 安装或更新 kubectl

  • 如果您的集群为 1.21 版本或更高版本,确保您的 Amazon VPC CNI plugin for Kubernetes、kube-proxy 和 CoreDNS 附加组件为服务账户令牌中列出的最低版本。

部署或更新 CNI 指标帮助程序

创建 IAM policy 和角色并部署指标帮助程序。如果您之前为要使用的附加组件服务账户创建了 IAM 角色,则可以跳至确定集群上安装的 Amazon VPC CNI plugin for Kubernetes 的版本步骤。

部署 CNI 指标帮助程序
  1. 创建一项 IAM policy,该策略需向 CNI 指标帮助程序授予 cloudwatch:PutMetricData 权限,以便向 CloudWatch 发送指标数据。

    1. 要创建名为 cni-metrics-helper-policy.json 的文件,请运行以下命令。

      cat >cni-metrics-helper-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "ec2:DescribeTags" ], "Resource": "*" } ] } EOF
    2. 创建一项名为 AmazonEKSVPCCNIMetricsHelperPolicy 的 IAM policy。

      aws iam create-policy --policy-name AmazonEKSVPCCNIMetricsHelperPolicy \ --description "Grants permission to write metrics to CloudWatch" \ --policy-document file://cni-metrics-helper-policy.json
  2. 检索您的 AWS 账户 ID 并将其存储在一个变量中。

    account_id=$(aws sts get-caller-identity --query Account --output text)

    确认变量已设置。

    echo $account_id

    输出示例如下。

    111122223333
  3. 创建 IAM 角色并向其附加此 IAM policy。创建 Kubernetes 服务账户。用 IAM 角色 ARN 对 Kubernetes 服务账户进行注释,用 Kubernetes 服务账户名称对 IAM 角色进行注释。您可以使用 eksctl 或 AWS CLI 创建角色。

    eksctl

    运行以下命令以创建 IAM 角色。您可以将 AmazonEKSVPCCNIMetricsHelperRole-my-cluster 替换为您选择的任何名称,但我们建议您包含将在角色名称中使用此角色的集群名称。将 my-cluster 替换为您的集群名称。

    eksctl create iamserviceaccount \ --name cni-metrics-helper \ --namespace kube-system \ --cluster my-cluster \ --role-name "AmazonEKSVPCCNIMetricsHelperRole-my-cluster" \ --attach-policy-arn arn:aws:iam::$account_id:policy/AmazonEKSVPCCNIMetricsHelperPolicy \ --approve
    AWS CLI
    1. 检索集群的 OIDC 提供商 URL 并将其存储在变量中。将 my-cluster 替换为您的集群名称。

      oidc_issuer=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -c9-)

      确认变量已设置。

      echo $oidc_issuer

      输出示例如下。

      oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
    2. 创建 IAM 角色,向 Kubernetes 服务账户授予 AssumeRoleWithWebIdentity 操作权限。

      1. 创建名为 trust-policy.json 的信任策略文件。

        cat >trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_issuer" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_issuer:aud": "sts.amazonaws.com", "$oidc_issuer:sub": "system:serviceaccount:kube-system:cni-metrics-helper" } } } ] } EOF
      2. 创建角色。您可以将 AmazonEKSVPCCNIMetricsHelperRole-my-cluster 替换为您选择的任何名称,但我们建议您包含将在角色名称中使用此角色的集群名称。

        aws iam create-role \ --role-name AmazonEKSVPCCNIMetricsHelperRole-my-cluster \ --assume-role-policy-document file://"trust-policy.json"
    3. 向角色附加 IAM policy。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::$account_id:policy/AmazonEKSVPCCNIMetricsHelperPolicy \ --role-name AmazonEKSVPCCNIMetricsHelperRole-my-cluster
  4. 确认您创建的角色已正确配置。

    1. 确认角色的信任策略。

      aws iam get-role --role-name AmazonEKSVPCCNIMetricsHelperRole-my-cluster --query Role.AssumeRolePolicyDocument.Statement[]

      输出示例如下。

      [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:cni-metrics-helper", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ]
    2. 确认集群的 OIDC 提供程序是否符合上一步中返回的提供程序。

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -c9-

      输出示例如下。

      oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
  5. 确定集群上安装的 Amazon VPC CNI plugin for Kubernetes 的版本。

    kubectl describe daemonset aws-node -n kube-system | grep amazon-k8s-cni: | cut -d ":" -f3 | cut -d "v" -f2 | cut -d "-" -f1

    输出示例如下。

    1.11.4

    在之前的输出中,1 是主要版本,11 是次要版本,4 是修补版本。

  6. 要将相同版本的 CNI 指标帮助程序添加到您的集群中(或更新到相同版本)作为 Amazon VPC CNI plugin for Kubernetes,请为您的集群所在的 AWS 区域运行以下命令。

    重要

    您一次只能更新一个次要版本。例如,如果您的当前次要版本为 1.10,并且您想要更新到 1.12,则必须首先更新到 1.11,再更新到 1.12。但是,您一次可以更新多个修补版本。例如,您可以直接从 1.11.2 更新到 1.11.4。如果您需要更新到早于或晚于以下命令中列出的版本,请参阅 GitHub 上的 Releases(发布)。每个版本的 URL 在发布说明的 To apply this release: 部分中列出。将以下 URL 的部分替换为发行说明中 URL 的相同部分。

    AWS GovCloud(美国东部)(us-gov-east-1)

    kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.12.1/config/master/cni-metrics-helper-us-gov-east-1.yaml

    AWSGovCloud (US-West)us-gov-west-1

    kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.12.1/config/master/cni-metrics-helper-us-gov-west-1.yaml

    所有其他 AWS 区域

    1. 下载清单文件。

      curl -O https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/v1.12.1/config/master/cni-metrics-helper.yaml
    2. 如果您的集群不位于 us-west-2,则将以下命令中的 region-code 替换为您的集群所在的运行修改的命令将文件中的 us-west-2 替换为您的 AWS 区域。

      sed -i.bak -e 's/us-west-2/region-code/' cni-metrics-helper.yaml
    3. 如果您的集群不位于 us-west-2,则对于您的集群所在的 AWS 区域,将以下命令中的 602401143452 替换为 Amazon 容器镜像注册表 中的账户,然后运行修改的命令将文件中的 602401143452

      sed -i.bak -e 's/602401143452/602401143452/' cni-metrics-helper.yaml
    4. 将清单文件应用于集群。

      kubectl apply -f cni-metrics-helper.yaml
  7. 如果您之前为要使用的附加组件服务账户配置了 IAM 角色,则可以跳到重新启动 cni-metrics-helper 部署步骤。

    用之前创建的 IAM 角色的 ARN 注释上一步创建的 cni-metrics-helper Kubernetes 服务账户。将 my-cluster 替换为集群名称,将 AmazonEKSVPCCNIMetricsHelperRole-my-cluster 替换为上一步创建的 IAM 角色名称。

    kubectl annotate serviceaccount cni-metrics-helper -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/AmazonEKSVPCCNIMetricsHelperRole-my-cluster
  8. (可选)配置您的 Kubernetes 服务账户使用的 AWS Security Token Service 端点类型。有关更多信息,请参阅配置服务账户的 AWS Security Token Service 端点

  9. 重新启动 cni-metrics-helper 部署。

    kubectl rollout restart deployment cni-metrics-helper -n kube-system
  10. 确认您部署的指标帮助程序的版本。

    kubectl describe deployment cni-metrics-helper -n kube-system | grep cni-metrics-helper: | cut -d ":" -f 3

    输出示例如下。

    v1.12.1

创建指标控制面板

部署 CNI 指标帮助程序之后,您可在 Amazon CloudWatch 控制台中查看 CNI 指标。本主题可帮助您创建控制面板来查看集群的 CNI 指标。

创建 CNI 指标面板
  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 请在左侧导航窗格中,选择 Metrics(指标),然后选择 All metrics(全部指标)。

  3. 选择 Graphed metrics(绘制的指标)选项卡。

  4. 选择 Add metrics using browse or query(使用浏览或查询添加指标)。

  5. 确保在 Metrics(指标)下,为集群选择了 AWS 区域。

  6. 在 Search(搜索)框中,输入 Kubernetes,然后按 Enter

  7. 选择要添加到控制面板的指标。

  8. 在控制台右上方,选择 Actions(操作),然后选择 Add to dashboard(添加到控制面板)。

  9. Select a dashboard(选择控制面板)部分,选择 Create new(新建),为控制面板输入一个名称(例如 EKS-CNI-metrics),然后选择 Create(创建)。

  10. Widget type(小组件类型)部分选择 Number(数字)。

  11. Customize widget title(自定义小组件标题)部分中,输入控制面板标题的逻辑名称,例如 EKS CNI metrics

  12. 选择添加到控制面板以完成操作。现在,您的 CNI 指标已添加到您可以监控的控制面板。有关 Amazon CloudWatch Logs 指标的更多信息,请参阅《Amazon CloudWatch 用户指南》中的使用 Amazon CloudWatch 指标

    
                        EKS CNI 指标