使用 Kubernetes 在亚马逊 EKS 工作节点上安装 SSM 代理 DaemonSet - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Kubernetes 在亚马逊 EKS 工作节点上安装 SSM 代理 DaemonSet

由 Mahendra Revanasiddappa (AWS) 创建

环境:PoC 或试点

技术:容器和微服务; DevOps;基础架构

Amazon Web Services:Amazon EKS、AWS Systems Manager

Summary

注意,2021 年 9 月:最新的 Amazon EKS 优化的 AMI 会自动安装 SSM Agent。有关更多信息,请参阅 2021 年 6 月 AMI 的发布说明

在 Amazon Elastic Kubernetes Service(Amazon EKS) 中,由于安全指导方针,Worker 节点没有附加 Secure Shell (SSH) 密钥对。此模式显示了如何使用 Kubernetes DaemonSet 资源类型在所有工作节点上安装 AWS Systems Manager 代理(SSM 代理),而不是手动安装或替换节点的亚马逊系统映像 (AMI)。 DaemonSet 使用工作节点上的 cron 作业来安排 SSM 代理的安装。您也可以使用这种模式在 Worker 节点上安装其他软件包。

在对集群中的问题进行故障排除时,按需安装 SSM Agent 可让您与 Worker 节点建立 SSH 会话、收集日志或查看实例配置,而无需使用 SSH 密钥对。

先决条件和限制

先决条件

  • 包含 Amazon Elastic Compute Cloud (Amazon EC2) Worker 节点的现有 Amazon EKS 集群。

  • 容器实例应获得与 SSM 服务通信的许可。AWS Identity and Access Management (IA M) 托管角色 AmazonSS M 为 SSM 代理ManagedInstanceCore提供在 EC2 实例上运行所需的权限。有关更多信息,请参阅 AWS Systems Manager 文档

限制

  • 这种模式不适用于 AWS Fargate,因为 F DaemonSets argate 平台不支持。

  • 此模式仅适用于基于 Linux 的 Worker 节点。

  • P DaemonSet od 在特权模式下运行。如果 Amazon EKS 集群有阻止特权模式的容器组(pod),则不会安装 SSM Agent。

架构

下图阐明了该模式的架构。

使用 Kubernetes DaemonSet 在亚马逊 EKS 工作节点上安装 SSM 代理。

工具

工具

  • Kubectl 是命令行实用程序,用于与 Amazon EKS 集群交互。此模式用于kubectl在 Amazon EKS 集群 DaemonSet 上部署,该集群将在所有工作节点上安装 SSM 代理。

  • Amazon EKS 让您在 AWS 上轻松运行 Kubernetes,而无需安装、操作和维护您自己的 Kubernetes 控制面板或节点。Kubernetes 是一个用于实现容器化应用程序的部署、扩缩和管理自动化的开源系统。

  • AWS Systems Manager 会话管理器允许您通过交互式、一键式、基于浏览器的 Shell 或通过AWS 命令行界面(AWS CLI)管理 EC2 实例、本地实例和虚拟机 (VM)。

代码

使用以下代码创建将在 Amazon EKS 集群上安装 SSM 代理的 DaemonSet 配置文件。按照操作说明部分中的说明操作。

cat << EOF > ssm_daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: labels: k8s-app: ssm-installer name: ssm-installer namespace: kube-system spec: selector: matchLabels: k8s-app: ssm-installer template: metadata: labels: k8s-app: ssm-installer spec: containers: - name: sleeper image: busybox command: ['sh', '-c', 'echo I keep things running! && sleep 3600'] initContainers: - image: amazonlinux imagePullPolicy: Always name: ssm command: ["/bin/bash"] args: ["-c","echo '* * * * * root yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm & rm -rf /etc/cron.d/ssmstart' > /etc/cron.d/ssmstart"] securityContext: allowPrivilegeEscalation: true volumeMounts: - mountPath: /etc/cron.d name: cronfile terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumes: - name: cronfile hostPath: path: /etc/cron.d type: Directory dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler terminationGracePeriodSeconds: 30 EOF

操作说明

任务描述所需技能

安装和配置 kubectl 以访问 EKS 集群。

如果 kubectl 尚未安装并配置为访问 Amazon EKS 集群,请参阅 Amazon EKS 文档中的安装 kubectl

DevOps
任务描述所需技能

创建 DaemonSet 配置文件。

使用此模式前面代码部分中的代码创建名为的 DaemonSet 配置文件ssm_daemonset.yaml,该文件将部署到 Amazon EKS 集群。

启动的 pod DaemonSet 有一个主容器和一个init容器。主容器包含一个 sleep 命令。该 init 容器包括一个 command 部分,用于创建 cron 作业文件,以在 /etc/cron.d/ 路径上安装 SSM Agent。cron 作业仅运行一次,其创建的文件会在作业完成后自动删除。

容器初始化完成后,主容器将等待 60 分钟后再退出。60 分钟后,将启动新容器组(pod)。此容器组(pod)会安装 SSM Agent(如果缺失),或者将 SSM Agent 更新至最新版本。

如果需要,您可以修改 sleep 命令,以每天重启容器组(pod)一次或更频繁地运行。 

DevOps

在 Amazon EKS 集群 DaemonSet 上部署。

要在 Amazon EKS 集群上部署您在上一步中创建的 DaemonSet 配置文件,请使用以下命令:

kubectl apply -f ssm_daemonset.yaml

此命令创建 DaemonSet 用于在工作节点上运行 pod 以安装 SSM 代理。

DevOps

相关资源