以下是关于 EKS 直接拉取 ECR 镜像的解答,以及如何通过 GitHub Actions 将项目打包为容器、推送至 AWS ECR 并使 EKS 自动拉取以完成发版部署的详细步骤。当前时间为 2025 年 7 月 23 日下午 12:27 HKT,基于最新技术实践提供方案。


1. EKS 直接拉取 ECR 镜像吗?

  • 答案:是的,EKS 可以直接拉取 ECR 镜像,但需要满足以下条件:

    • IAM 权限:EKS 集群的节点(Worker Nodes)需关联一个 IAM 角色,拥有 AmazonEC2ContainerRegistryReadOnly 权限,以便从 ECR 拉取镜像。
    • 配置正确:在 Kubernetes Pod 的 spec.containers.image 字段中指定 ECR 镜像路径(例如 account-id.dkr.ecr.region.amazonaws.com/repository:tag)。
    • 网络访问:EKS 集群需能访问 ECR(通常通过 VPC 配置或公网访问)。
    • 默认行为:EKS 的 kubelet 会自动尝试拉取指定的镜像,无需额外工具,但拉取过程依赖节点的网络和权限设置。
  • 验证方法

    • 使用 kubectl describe pod <pod-name> 检查事件日志,确认拉取成功或失败(例如 “ImagePullBackOff” 表示权限或网络问题)。

2. 通过 GitHub Actions 打包容器、推送至 ECR 并部署到 EKS 的步骤

准备工作
  • AWS 配置
    • 创建 ECR 仓库(例如 my-app),记录仓库 URL(account-id.dkr.ecr.region.amazonaws.com/my-app)。
    • 设置 EKS 集群(例如 my-eks-cluster),并通过 aws eks update-kubeconfig --region region --name my-eks-cluster 获取 kubeconfig
    • 创建 IAM 角色并附加到 EKS 节点组,包含 AmazonEC2ContainerRegistryReadOnly 权限。
    • 在 GitHub 仓库的 Settings > Secrets and variables > Actions 中添加:
      • AWS_ACCESS_KEY_ID
      • AWS_SECRET_ACCESS_KEY
      • AWS_REGION(例如 us-east-1
      • ECR_REPOSITORY(例如 my-app
      • KUBE_CONFIG_DATA(将 kubeconfig 转为 Base64 编码,例如 cat ~/.kube/config | base64)。
  • 项目配置
    • 根目录下创建 Dockerfile(示例见下)。
    • 创建 Kubernetes 部署文件 deployment.yaml(示例见下)。
Dockerfile 示例
# 使用官方 Node.js 镜像作为基础
FROM node:18-alpine# 设置工作目录
WORKDIR /app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装依赖
RUN npm install# 复制项目文件
COPY . .# 构建应用
RUN npm run build# 暴露端口
EXPOSE 3000# 启动命令
CMD ["node", "dist/index.js"]
Kubernetes 部署文件(deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 2selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-appimage: <account-id>.dkr.ecr.<region>.amazonaws.com/my-app:latestports:- containerPort: 3000resources:requests:memory: "256Mi"cpu: "200m"limits:memory: "512Mi"cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 3000type: LoadBalancer
GitHub Actions 工作流(.github/workflows/deploy.yml)
name: Deploy to EKSon:push:branches:- mainjobs:deploy:name: Build and Deployruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Configure AWS credentialsuses: aws-actions/configure-aws-credentials@v4with:aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}aws-region: ${{ secrets.AWS_REGION }}- name: Login to Amazon ECRid: login-ecruses: aws-actions/amazon-ecr-login@v2- name: Build, tag, and push image to Amazon ECRid: build-imageenv:ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}IMAGE_TAG: ${{ github.sha }}run: |docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAGecho "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT- name: Update kubeconfigrun: |echo "${{ secrets.KUBE_CONFIG_DATA }}" | base64 -d > kubeconfigexport KUBECONFIG=kubeconfig- name: Deploy to EKSuses: kodermax/kubectl-aws-eks@mainwith:args: set image deployment/my-app my-app=${{ steps.build-image.outputs.image }} --recordenv:KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}- name: Verify deploymentuses: kodermax/kubectl-aws-eks@mainwith:args: rollout status deployment/my-appenv:KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}- name: Cleanupif: always()run: |rm -f kubeconfig
实现流程
  1. 触发工作流
    • 推送到 main 分支时,GitHub Actions 自动运行。
  2. 构建与推送
    • 配置 AWS 凭证,登录 ECR。
    • 使用 Docker Buildx 构建镜像,打上 Git 提交哈希标签(${{ github.sha }}),推送到 ECR。
  3. 部署到 EKS
    • 解码 kubeconfig,更新 Deployment 中的镜像标签。
    • 使用 kubectl 应用更改,EKS 节点自动拉取新镜像。
  4. 验证与清理
    • 检查部署状态,确保 Pod 运行。
    • 清理临时文件。
EKS 自动拉取镜像
  • EKS 的 kubelet 会在 Pod 启动时自动拉取 deployment.yaml 中指定的镜像(例如 account-id.dkr.ecr.us-east-1.amazonaws.com/my-app:sha256...)。
  • 如果镜像未找到或权限不足,Pod 状态将显示 ImagePullBackOff,需检查 IAM 角色和网络配置。
注意事项
  • IAM 角色:确保 EKS 节点组的 IAM 角色有 ECR 读取权限。
  • 镜像标签:使用动态标签(${{ github.sha }})避免缓存问题,生产环境可加环境标识(如 prod-${{ github.sha }})。
  • 网络:若 EKS 在私有 VPC,配置 VPC Endpoint 或 NAT Gateway 访问 ECR。
  • 安全:使用 GitHub OIDC 替代长期凭证,提升安全性。
  • 测试:初次部署后,使用 kubectl get podskubectl logs 验证。
验证部署
  • 推代码后,检查 GitHub Actions 日志。
  • 使用 kubectl get deployments 确认 my-app 更新。
  • 通过 Service 的外部 IP(kubectl get svc my-app-service)访问应用。

此方案实现了从代码提交到 EKS 自动部署的全流程,适合中小型项目。如需多环境或回滚支持,可扩展工作流逻辑。

优化改进版action.yml

name: Deploy to EKSon:push:branches:- main- devjobs:deploy:name: Build and Deployruns-on: ubuntu-latestenv:ENVIRONMENT: ${{ github.ref == 'refs/heads/main' && 'prod' || 'dev' }}IMAGE_TAG: ${{ github.ref == 'refs/heads/main' && format('prod-{0}', github.sha) || format('dev-{0}', github.sha) }}steps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Configure AWS credentialsuses: aws-actions/configure-aws-credentials@v4with:aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}aws-region: ${{ secrets.AWS_REGION }}- name: Login to Amazon ECRid: login-ecruses: aws-actions/amazon-ecr-login@v2- name: Build, tag, and push image to Amazon ECRid: build-imageenv:ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}run: |docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAGecho "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT- name: Update kubeconfigrun: |echo "${{ secrets.KUBE_CONFIG_DATA }}" | base64 -d > kubeconfigexport KUBECONFIG=kubeconfig- name: Deploy to EKSuses: kodermax/kubectl-aws-eks@mainwith:args: set image deployment/my-app my-app=${{ steps.build-image.outputs.image }} --recordenv:KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}- name: Verify deploymentrun: |kubectl rollout status deployment/my-app --timeout=5menv:KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}timeout-minutes: 5- name: Rollback on failureif: failure()run: |kubectl rollout undo deployment/my-appenv:KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}- name: Cleanupif: always()run: |rm -f kubeconfig- name: Notify deployment statusif: always()run: |echo "Deployment to ${ENVIRONMENT} completed with status ${{ job.status }}"# 可选:集成 Slack 或邮件通知# curl -X POST -H 'Content-type: application/json' --data '{"text":"Deployment to ${ENVIRONMENT} ${{ job.status }}"}' https://hooks.slack.com/services/xxx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90240.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90240.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90240.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷刷题7.24

P1087 [NOIP 2004 普及组] FBI 树 - 洛谷 简单的二叉树遍历 #include<bits/stdc.h> #define ll long long using namespace std; int n; char show(string s){if(s.find(1)string::npos) return B;if(s.find(0)string::npos) return I;return F; } void dfs(string s){…

FreeRTOS—二值信号量

文章目录一、二值信号量简介二、二值信号量相关的API函数2.1.动态方式创建二值信号量2.2.获取信号量2.3.释放信号量三、实验3.1.实验设计3.2.软件设计一、二值信号量简介 二值信号量的本质是一个队列长度为 1 的队列&#xff0c;该队列就只有空和满两种情况&#xff0c;也就是…

挖掘录屏宝藏:Screenity 深度解析与使用指南

挖掘录屏宝藏&#xff1a;Screenity 深度解析与使用指南 在数字内容创作与信息分享日益频繁的今天&#xff0c;录屏软件成为了众多创作者、教育者和办公族的必备工具。今天&#xff0c;我要给大家介绍一款在 GitHub 上收获了大量关注的开源录屏软件 ——Screenity。它功能强大…

4.1.2 XmlInclude 在 C# 中的作用及示例

xmlInclude 是 .NET 中用于 XML 序列化的一个重要特性,XmlInclude 的主要作用是: 1.告知 XML 序列化器可能遇到的派生类型 2.解决多态类型的序列化和反序列化问题 3.允许基类序列化时包含派生类信息 当你有基类引用指向派生类对象时,如果不使用 XmlInclude,序列化器…

ARM汇编常见伪指令及其用法示例

伪指令不是指令&#xff0c;伪指令和指令的根本区别是经过编译后会不会生成机器码。 伪指令的意义在于指导编译过程。 伪指令是和具体的编译器相关的&#xff0c;我们使用gnu工具链&#xff0c;因此学习gnu环境下的汇编伪指令。在 ARM 汇编中&#xff0c;伪指令&#xff08;Pse…

算法调试技巧

引言算法调试常比编写更耗时&#xff0c;尤其是动态规划、递归等逻辑复杂的代码。本文分享一套系统化的调试方法&#xff0c;帮助快速定位问题。一、调试前的准备代码格式化使用统一缩进&#xff08;4 空格&#xff09;和命名规范&#xff0c;避免因格式混乱导致的逻辑误读。边…

每日功能分享|让观看者体验“无缝链接”观看的功能——视频自动续播功能

你是否遇到过这样的困扰——看到一半的视频&#xff0c;关闭后却忘记进度&#xff0c;再打开时需要手动拖拽寻找上次的观看位置&#xff1f;如今&#xff0c;“视频自动续播功能”完美解决了这一痛点&#xff01;无论是在线教育课程、影视剧集还是企业内部员工培训&#xff0c;…

AWS: 云上侦探手册,七步排查ALB与EC2连接疑云

今天&#xff0c;咱们来聊一个对于许多刚接触AWS的运维同学来说&#xff0c;既常见又有点头疼的话题&#xff1a;如何优雅地排查和解决AWS上ALB&#xff08;Application Load Balancer&#xff09;暴露EC2服务时遇到的种种疑难杂症。 最近&#xff0c;我刚帮一个朋友解决了类似…

EIDE 创建基于STM32-HD的项目快速创建流程

EIDE 创建基于STM32-HD的项目流程芯片系列定义宏Flash 大小RAM 大小STM32F10x_HD#define STM32F10X_HD256KB~512KB48KB~64KBSTM32F10x_MD#define STM32F10X_MD64KB~128KB20KBSTM32F10x_LD#define STM32F10X_LD16KB~32KB4KB~10KB 新建项目远程仓库获取裸机开发程序STM(意法半导体…

使用 QLExpress 构建灵活可扩展的业务规则引擎

目录 一、什么是 QLExpress&#xff1f; 二、推荐系统中的规则脚本应用 1 场景描述 2 推荐规则脚本&#xff08;QLExpress&#xff09; 3 系统实现 4 执行结果 5 推荐系统应用建议 三、风控系统中的规则判定 1 场景描述 2 风控规则脚本&#xff08;QLExpress&#xff…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-13,(知识点:DC-DC电源,相位裕度,增益裕度)

目录 1、题目 2、解答 相位裕度 增益裕度 3、相关知识点 一、波特图 二、相位裕度 三、增益裕度 四、在 DC - DC 电源中的应用 【硬件-笔试面试题】硬件/电子工程师&#xff0c;笔试面试题汇总版&#xff0c;持续更新学习&#xff0c;加油&#xff01;&#xff01;&a…

学生信息管理系统 - HTML实现增删改查

学生信息管理系统 - HTML实现增删改查 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

Agile简介

Agile&#xff08;敏捷&#xff09;是一种软件开发方法论&#xff0c;核心是通过快速迭代、灵活响应变化&#xff0c;解决传统软件开发中周期长、需求变更困难等问题&#xff0c;最终高效交付符合用户实际需求的产品。 一、Agile 的起源&#xff1a;为什么需要敏捷&#xff1f;…

关于 URL 中 “+“ 号变成空格的问题

当你在 URL 中传递参数时&#xff0c;加号 () 会被自动转换为空格&#xff0c;这是 URL 编码的标准行为。问题原因在 URL 中&#xff1a;空格会被编码为 号当 URL 被解码时&#xff0c; 号又会被转换回空格这会导致原始数据中的 号丢失解决方案你需要对参数值进行正确的 URL …

综合实验(2)

文章目录 目录 文章目录 前言 OSPF运行在GRE隧道概述 典型应用场景 OSPF over GRE 配置 总结 前言 OSPF运行在GRE隧道概述 GRE&#xff08;Generic Routing Encapsulation&#xff09;隧道是一种通过封装原始数据包在IP网络中创建虚拟点对点连接的隧道技术。OSPF&#xff08;…

【应急响应工具教程】司稽(Whoamifuck):纯Shell打造的Linux应急响应利器

1、工具简介司稽&#xff08;Whoamifuck或Chief-Inspector,简称"who"&#xff09;&#xff0c;永恒之锋发布的第一款开源工具&#xff0c;这是一款由shell编写的Linux应急响应脚本&#xff0c;能对基本的检查项进行输出和分析&#xff0c;并支持一些扩展的特色功能。…

新手操作steam搬砖项目,应该如何快速起步

大家好哦&#xff0c;我是阿阳&#xff0c;今天继续给大家分享一些steam搬砖的知识。在我们操作过程中&#xff0c;问题问得最多的就是&#xff0c;新手应该怎么做&#xff1f;首先&#xff0c;那我们得先来了解-下,什么是steam搬砖,它的项目原理是什么&#xff0c;其次针对于这…

rt-thread加一个库

背景 官方软件包里没有的 可以以库或组件形式加入 本次仅为了验证&#xff0c;加到库 过程 下载源码 假设为 lib_demo 自己的板子目录为bsp/stm32 代码目录结构 bsp/stm32librarieslib_demo //新建文件夹src //把lib_demo里源码文件放进来inc //把lib_demo里头文件放进来SConsc…

c++深拷贝和浅拷贝

一、浅拷贝本质&#xff1a;简单地复制对象的成员值。如果成员里有指针&#xff0c;新对象和原对象的指针会指向同一块内存。比如你有对象 A&#xff0c;里面指针 p 指向堆内存 0x123&#xff1b;用 A 拷贝出对象 B&#xff0c;B 的指针 p 也指向 0x123。问题&#xff1a;若其中…

NineData新增SQL Server到MySQL复制链路,高效助力异构数据库迁移

在实际的数据库迁移工作中&#xff0c;异构库之间的迁移常常被视为一项“高风险、高工作量、高复杂度”的挑战任务。这不仅是一次数据库切换&#xff0c;更是对系统稳定性、数据一致性、业务连续性和技术团队耐力的全方位考验。为解决企业在异构数据库迁移中的痛点&#xff0c;…