GitHub Actions打包容器,推送 AWS ECR 并使 EKS 自動拉取以完成發版部署

以下是關于 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;…