使用 Kubernetes 在 Amazon EKS 工作者節點上安裝 SSM 代理程式 DaemonSet - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Kubernetes 在 Amazon EKS 工作者節點上安裝 SSM 代理程式 DaemonSet

創建者:馬亨德拉雷瓦納西達帕 (AWS)

環境:PoC 或試點

技術:容器與微服務 DevOps;基礎架構

AWS 服務:Amazon EKS;AWS Systems Manager

Summary

請注意,2021 年 9 月:最新的 Amazon EKS 最佳化 AMI 會自動安裝 SSM 代理程式。如需詳細資訊,請參閱 2021 年 6 月 AMI 的發行說明

在 Amazon Elastic Kubernetes Service (Amazon EKS) 中,基於安全準則的原因,工作者節點沒有附加安全殼層 (SSH) 金鑰配對。此模式顯示如何使用 Kubernetes DaemonSet 資源類型在所有工作節點上安裝 AWS Systems Manager 代理程式 (SSM 代理程式),而不需手動安裝或取代節點的 Amazon 機器映像 (AMI)。 DaemonSet 使用背景工作節點上的 cron 工作來排程 SSM 代理程式的安裝。您也可以使用此模式在 Worker 節點上安裝其他套件。

當您對叢集中的問題進行疑難排解時,依需求安裝 SSM Agent 可讓您在不使用安全殼層金鑰配對的情況下與 Worker 節點建立 SSH 工作階段、收集記錄或查看執行個體設定。

先決條件和限制

先決條件

  • 具有亞馬遜彈性運算雲端 (Amazon EC2) 工作者節點的現有 Amazon EKS 叢集。

  • 容器執行個體應具有與 SSM 服務通訊的必要權限。AWS Identity and Access Management (IAM) 受管角色 AmazonSSM 可為 SSM 代理程式在 EC2 執行個體上執行ManagedInstanceCore提供所需的許可。如需詳細資訊,請參閱 AWS Systems Manager 文件

限制

  • 此模式不適用於 AWS Fargate,因為 Fargate 平台 DaemonSets 不支援。

  • 此模式僅適用於以 Linux 為基礎的工作者節點。

  • DaemonSet 網繭會以特殊權限模式執行。如果 Amazon EKS 叢集具有以特殊權限模式封鎖網繭的 Webhook,將不會安裝 SSM 代理程式。

架構

下圖說明此模式的架構。

使用 Kubernetes DaemonSet 在 Amazon EKS 工作者節點上安裝 SSM 代理程式。

工具

工具

  • kubectl 是一種命令列公用程式,可用來與 Amazon EKS 叢集互動。此模式用kubectl於在 Amazon EKS 叢集 DaemonSet 上部署,該叢集將在所有工作節點上安裝 SSM 代理程式。

  • Amazon EKS 可讓您輕鬆在 AWS 上執行 Kubernetes,而無需安裝、操作和維護自己的 Kubernetes 控制平面或節點。Kubernetes 是一套開放原始碼系統,用於容器化應用程式的自動化部署、擴展與管理。

  • AWS Systems Manager 工作階段管理員可讓您透過互動式、按一下瀏覽器型殼層或 AWS Command Line Interface (AWS CLI) (AWS CLI) 管理 EC2 執行個體、現場部署執行個體和虛擬機器 (VM)。

Code

使用下列程式碼建立將在 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 叢集。

由啟動的網繭 DaemonSet 具有主容器和init容器。主容器有一個sleep命令。init容器包含一個command區段,可建立 Cron 工作檔案,以便在路徑上安裝 SSM 代理程式。/etc/cron.d/Cron 工作只會執行一次,並在工作完成後自動刪除它建立的檔案。

init 容器完成後,主容器會等待 60 分鐘,然後再結束。60 分鐘後,會啟動新的 Pod。此網繭會安裝 SSM 代理程式 (如果遺失),或將 SSM 代理程式更新為最新版本。

如果需要,您可以修改命sleep令以每天重新啟動網繭一次或更頻繁地執行。 

DevOps

在 Amazon EKS 叢集 DaemonSet 上部署。

若要在 Amazon EKS 叢集上部署您在上一個步驟中建立的 DaemonSet 組態檔案,請使用下列命令:

kubectl apply -f ssm_daemonset.yaml

此命令會建立一個 DaemonSet 在背景工作節點上執行網繭,以安裝 SSM 代理程式。

DevOps

相關資源