使用 GitHub Action 自動更新 Sealos 集羣的應用鏡像

在 IT 領域,自動化無疑已成爲提高工作效率和減少人爲錯誤的關鍵。Sealos 作爲一個強大的雲操作系統,已經爲許多企業和開發者提供了穩定可靠的服務。與此同時,隨着技術不斷髮展,集成更多的功能和服務變得尤爲重要。考慮到這一點,本文將介紹如何利用 GitHub Action 來進一步豐富 Sealos 在應用更新方面的自動化體驗

原文鏈接:https://forum.laf.run/d/1059

GitHub Action 介紹

在現代軟件開發中,持續集成 (CI) 和持續部署/交付 (CD) 是至關重要的環節。它們可以幫助開發團隊高效地驗證代碼的質量並確保其準確無誤地交付到生產環境中。GitHub Action 正是在這個背景下誕生的 CI/CD 工具,致力於爲開發者提供一種簡潔且高效的自動化工具。

簡單來說,GitHub Action 是一個 CI/CD 工具,它允許開發者在 GitHub 倉庫中自動執行多種任務,從而極大地提高了工作效率。它可以自動進行代碼的構建、測試和部署等關鍵步驟,確保在每次代碼更新或合併請求中都能夠進行快速而準確的驗證和交付。

但 GitHub Action 不僅僅是一個傳統的 CI/CD 工具。其獨特之處在於,它與 GitHub 倉庫實現了無縫集成。這意味着開發者無需離開 GitHub 環境,就能夠配置和管理整個自動化流程,極大地簡化了操作過程。此外,由於 GitHub 是目前世界上最大的代碼託管平臺,這種深度整合使得大量開發者能夠輕鬆上手並利用 GitHub Action 進行自動化操作。

Sealos:同時面向初學者與專家

Sealos 的可視化桌面環境極大簡化了用戶對分佈式應用的管理和維護,用戶不再需要進行復雜的操作或擁有深厚的技術背景就能輕鬆管理分佈式應用。通過減少複雜性和提供直觀的界面,Sealos 顯著地降低了用戶的心智負擔,使其可以更加集中地完成工作。

Sealos 海外集羣:https://cloud.sealos.io

Sealos 國內集羣:https://cloud.sealos.top

但 Sealos 不僅僅適用於普通用戶,對於雲原生領域的專業人員,提供了終端,您可以在終端中執行各種命令行操作。

同時還提供了 kubeconfig 文件的下載功能。擁有這個文件,專業人員可以將其下載到本地電腦,並使用 kubectl 命令行工具來直接管理和操作 Sealos 中的應用資源。這爲那些希望深入管理和配置的雲原生專家們提供了極大的靈活性。

有了 kubeconfig 之後,我們可以用來實現各種神奇的功能,比如本文將要介紹的自動更新應用鏡像

GitHub Action 自動構建鏡像

對於自己開發的應用,要想自動更新應用的鏡像,前提是得先自動構建鏡像。

GitHub Action 完美集成在 GitHub 平臺上,無需額外配置或切換到其他平臺即可基於源碼來構建鏡像。對於公開的倉庫,GitHub 提供了一定的免費計算額度,適合小型項目或個人開發者。

使用 GitHub Action 自動構建並推送鏡像的流程如下:

  1. 創建工作流文件:在你的 GitHub 倉庫中創建一個 .github/workflows 目錄,並在該目錄下創建一個工作流配置文件,例如 docker_build.yml

  2. 配置 Secret:爲了安全地推送鏡像到 Docker Hub 和 ghcr.io,你需要在 GitHub 倉庫的 "Secrets" 部分配置相應的認證信息。通常,這包括你的 Docker Hub 用戶名、密碼,以及 ghcr.io 的 token。例如:

  3. 編寫工作流腳本:在配置文件中,定義所需的觸發條件(如 pushmaster 分支)、運行環境以及執行的命令。

    示例:

    # 定義工作流的名稱
    name: Build and Push Docker Image
    
    # 定義觸發工作流的條件
    on:
      workflow_dispatch: # 允許手動觸發工作流
      push: # 當有代碼推送事件發生時
        branches:
          - master # 只有推送到 master 分支時才觸發
    
    # 定義工作流的任務
    jobs:
      build-image:
        # 定義運行此任務的環境:最新版本的 ubuntu
        runs-on: ubuntu-latest
    
        # 定義任務中的步驟
        steps:
          # 檢出代碼。只檢出最新的1次提交
          - uses: actions/checkout@v3
            with:
              fetch-depth: 1
    
          # 設置 QEMU 模擬器,這通常用於多平臺的 Docker 構建
          - name: Set up QEMU
            uses: docker/setup-qemu-action@v2
    
          # 設置 Docker Buildx,用於構建多平臺的 Docker 鏡像
          - name: Set up Docker Buildx
            uses: docker/setup-buildx-action@v2
    
          # 登錄到 Docker Hub
          - name: Login to DockerHub
            uses: docker/login-action@v2
            with:
              username: ${{ secrets.DOCKER_USERNAME }} # 使用存儲在 GitHub Secrets 中的 DockerHub 用戶名
              password: ${{ secrets.DOCKER_PASSWORD }} # 使用存儲在 GitHub Secrets 中的 DockerHub 密碼
    
          # 登錄到 ghcr.io (GitHub Container Registry)
          - name: Login to ghcr.io
            uses: docker/login-action@v2
            with:
              registry: ghcr.io
              username: ${{ github.repository_owner }} # 使用倉庫的擁有者名作爲用戶名
              password: ${{ secrets.GHCR_TOKEN }} # 使用存儲在 GitHub Secrets 中的 ghcr.io 的訪問令牌
    
          # 構建並推送 Docker 鏡像到 docker.io 和 ghcr.io
          - name: Build and push Docker images to docker.io and ghcr.io
            uses: docker/build-push-action@v2
            with:
              platforms: linux/amd64 # 設置構建平臺爲 linux/amd64
              context: . # Docker 構建上下文設置爲當前目錄
              push: true # 設置爲真以確保構建後的鏡像被推送
              tags: | # 定義推送的標籤
                ${{ secrets.DOCKER_USERNAME }}/xxxx:latest
                ghcr.io/${{ github.repository_owner }}/xxxx:latest
    
  4. 觸發工作流:每當符合觸發條件的事件發生時,GitHub Action 就會自動執行定義的工作流,從而構建和推送 Docker 鏡像。

  5. 監控與調試:你可以在 GitHub 倉庫的 "Actions" 標籤頁中,查看工作流的執行情況,包括日誌、狀態和結果。

使用 GitHub Action 自動構建鏡像不僅可以簡化開發流程,還可以確保每次代碼的更改都得到了有效且一致的處理,大大提高了開發效率和代碼質量。同時通過使用 GitHub 的 secrets 功能,還確保了認證信息的安全。

自動更新 Sealos 應用鏡像

現在我們來到了最後一步。要想自動更新鏡像,首先我們來回顧一下整個流程:

首先,當你的應用代碼更新併合併到主分支時,GitHub Action 會自動觸發構建鏡像的任務。構建完成後,新的應用鏡像會被推送到鏡像倉庫。

接下來,你需要在 GitHub Action 中調用 kubectl,更新 Sealos 集羣中對應的 Deployment 或 StatefulSet。這樣,Sealos 集羣的應用就會使用新的鏡像版本進行滾動更新。

我們可以利用一個特定的 GitHub Action:actions-hub/kubectl。這個 Action 提供了在 GitHub Actions 工作流中執行 kubectl 命令的能力。

以下是如何在你的 GitHub Actions 工作流中使用 actions-hub/kubectl 來更新 Sealos 應用鏡像:

設置 kubeconfig

爲了讓 kubectl 能夠與你的 Sealos 或其他 Kubernetes 集羣進行通信,你需要提供一個有效的 Kubeconfig,Sealos 的 kubeconfig 可以在桌面中下載。

下載完成後,你需要將其中的內容轉換爲 base64 格式:

$ cat kubeconfig.yaml | base64

然後將轉換後的內容存儲到 GitHub 倉庫的 Secret 中,假設 Secret 名爲 KUBE_CONFIG 。Secret 配置方式參考上文。

使用 actions-hub/kubectl

現在您只需要在前面自動構建鏡像的工作流腳本中添加一個新的 job 來調用 kubectl 即可。例如:

# 定義工作流的名稱
name: Build and Push Docker Image

# 定義觸發工作流的條件
on:
  workflow_dispatch: # 允許手動觸發工作流
  push: # 當有代碼推送事件發生時
    branches:
      - master # 只有推送到 master 分支時才觸發

# 定義工作流的任務
jobs:
  build-image:
  ...
  ...
  deploy:
    needs: build-image
    runs-on: ubuntu-latest
    if: github.repository == '<your_repository>'
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - uses: actions-hub/kubectl@master
        env:
          KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
        with:
          args: rollout restart deployment my-deployment

在這個例子中,我們更新一個名爲 my-deployment 的 Deployment,更新的方法非常簡單:直接滾動重啓。因爲 Deployment 的 imagePullPolicy 默認都是 Always,且鏡像 tag 保持 latest 不變,所以直接重啓就會拉取最新的鏡像。

如果您的鏡像每次構建的 tag 都不同,那可以使用這個命令來更新鏡像:

...
        with:
          args: set image deployment/my-deployment my-container=my-repo/my-image:<tag>

在這個例子中,我們更新一個名爲 my-deployment 的 Deployment,將 my-container 的鏡像設置爲 my-repo/my-image:<tag>。其中 tag 可以通過環境變量的形式從構建鏡像的 job 中獲取

如果您的應用不是自己開發的,且這個應用已提供了鏡像,那麼您可以設計一個定時觸發的工作流,工作流的任務是檢測鏡像倉庫(例如 Docker Hub)的鏡像有沒有更新,如果更新了,就調用 kubectl 來更新鏡像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章