

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

# 使用 Kubernetes 在亚马逊 EKS 工作节点上安装 SSM 代理 DaemonSet
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset"></a>

*Mahendra Revanasiddappa，Amazon Web Services*

## Summary
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-summary"></a>

**注意，2021 年 9 月：**经过优化的最新亚马逊 EKS 会自动 AMIs 安装 SSM 代理。有关更多信息，请参阅 2021 年 6 月的[发行说明](https://github.com/awslabs/amazon-eks-ami/releases/tag/v20210621) AMIs。

在 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 密钥对。

## 先决条件和限制
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-prereqs"></a>

**先决条件**
+ 带有亚马逊弹性计算云 (Amazon EC2) 工作节点的现有 Amazon EKS 集群。
+ 容器实例应获得与 SSM 服务通信的许可。AWS Identity and Access Management (IAM) 托管角色**亚马逊**为 SSM 代理SSMManagedInstanceCore提供了在 EC2 实例上运行所需的权限。有关更多信息，请参阅 [AWS Systems Manager 文档](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html)。

**限制**
+ 这种模式不适用于 AWS Fargate，因为 F DaemonSets argate 平台不支持。
+ 此模式仅适用于基于 Linux 的 Worker 节点。
+ P DaemonSet od 在特权模式下运行。如果 Amazon EKS 集群有阻止特权模式的容器组（pod），则不会安装 SSM Agent。

## 架构
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-architecture"></a>

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

![使用 Kubernetes DaemonSet 在亚马逊 EKS 工作节点上安装 SSM 代理。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/016d53f3-45c1-4913-b542-67124e1462b8/images/3a6dfd00-e54b-44d5-843a-4c26ce9826c9.png)


## 工具
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-tools"></a>

**工具**
+ [Kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) 是命令行实用程序，用于与 Amazon EKS 集群交互。此模式用于`kubectl`在 Amazon EKS 集群 DaemonSet 上部署，该集群将在所有工作节点上安装 SSM 代理。
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 让您在 AWS 上轻松运行 Kubernetes，而无需安装、操作和维护您自己的 Kubernetes 控制面板或节点。Kubernetes 是一个用于实现容器化应用程序的部署、扩缩和管理自动化的开源系统。
+ [AWS Systems Manager 会话管理器](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)允许您通过交互式、一键式、基于浏览器的外壳或 AWS 命令行界面 (AWS CLIVMs) 来管理您的 EC2 实例、本地实例和虚拟机 ()。

**代码**

使用以下代码创建将在 Amazon EKS 集群上安装 SSM 代理的 DaemonSet 配置文件。按照[操作说明](#install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-epics)部分中的说明操作。

```
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
```

## 操作说明
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-epics"></a>

### 设置 kubectl
<a name="set-up-kubectl"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装和配置 kubectl 以访问 EKS 集群。 | 如果 `kubectl` 尚未安装并配置为访问 Amazon EKS 集群，请参阅 Amazon EKS 文档中的[安装 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。 | DevOps | 

### 部署 DaemonSet
<a name="deploy-the-daemonset"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 DaemonSet 配置文件。 | 使用此模式前面[代码](#install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-tools)部分中的代码创建名为的 DaemonSet 配置文件`ssm_daemonset.yaml`，该文件将部署到 Amazon EKS 集群。<br />启动的 pod DaemonSet 有一个主容器和一个`init`容器。主容器包含一个 `sleep` 命令。该 `init` 容器包括一个 `command` 部分，用于创建 cron 作业文件，以在 `/etc/cron.d/` 路径上安装 SSM Agent。cron 作业仅运行一次，其创建的文件会在作业完成后自动删除。<br />容器初始化完成后，主容器将等待 60 分钟后再退出。60 分钟后，将启动新容器组（pod）。此容器组（pod）会安装 SSM Agent（如果缺失），或者将 SSM Agent 更新至最新版本。<br />如果需要，您可以修改 `sleep` 命令，以每天重启容器组（pod）一次或更频繁地运行。  | DevOps | 
| 在 Amazon EKS 集群 DaemonSet 上部署。 | 要在 Amazon EKS 集群上部署您在上一步中创建的 DaemonSet 配置文件，请使用以下命令：<pre>kubectl apply -f ssm_daemonset.yaml </pre><br />此命令创建一个， DaemonSet 用于在工作节点上运行 pod 以安装 SSM 代理。 | DevOps | 

## 相关资源
<a name="install-ssm-agent-on-amazon-eks-worker-nodes-by-using-kubernetes-daemonset-resources"></a>
+ [安装 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)(Amazon EKS 文档)
+ [设置 Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html)（AWS Systems Manager 文档）