Skip to main content

此版本的 GitHub Enterprise Server 已于以下日期停止服务 2024-09-25. 即使针对重大安全问题,也不会发布补丁。 为了获得更好的性能、更高的安全性和新功能,请升级到最新版本的 GitHub Enterprise。 如需升级帮助,请联系 GitHub Enterprise 支持

部署到 Google Kubernetes Engine

您可以部署到 Google Kubernetes Engine 引擎,作为持续部署 (CD) 工作流程的一部分。

Note

GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

简介

本指南介绍如何使用 GitHub Actions 构建容器化应用程序,将其推送到 Google 容器注册表 (GCR),以及要推送到 main 分支时将其部署到 Google Kubernetes Engine (GKE)。

GKE 是 Google Cloud 的托管 Kubernetes 群集服务,可以在云中或您自己的数据中心中托管您的容器化工作负载。 有关详细信息,请参阅 Google Kubernetes Engine

Note

如果 GitHub Actions 工作流需要访问支持 OpenID Connect (OIDC) 的云提供商提供的资源,则可以将工作流配置为直接向云提供商进行身份验证。 这样就可以停止将这些凭据存储为长期存在的机密,并提供其他安全优势。 有关详细信息,请参阅“关于使用 OpenID Connect 进行安全强化”。

先决条件

在继续创建工作流程之前,您需要完成 Kubernetes 项目的以下步骤。 本指南假定项目的根目录已有 Dockerfile 和 Kubernetes 部署配置文件。

创建 GKE 群集

要创建 GKE 群集,首先需要使用 gcloud CLI 进行身份验证。 有关此步骤的更多信息,请参阅以下文章:

例如:

Shell
$ gcloud container clusters create $GKE_CLUSTER \
    --project=$GKE_PROJECT \
    --zone=$GKE_ZONE

启用 API

启用 Kubernetes Engine 和 Container Registry API。 例如:

Shell
$ gcloud services enable \
    containerregistry.googleapis.com \
    container.googleapis.com

配置服务帐户并存储其凭据

此程序显示如何为您的 GKE 集成创建服务帐户。 它介绍了如何创建帐户、向其添加角色、取回其密钥,以及将它们存储为名为 GKE_SA_KEY 以 base64 编码的存储库机密。

  1. 创建新服务帐户:

    Shell
    gcloud iam service-accounts create $SA_NAME
    
  2. 检索你刚刚创建的服务帐户的电子邮件地址:

    Shell
    gcloud iam service-accounts list
    
  3. 向服务帐户添加角色。

    Note

    应用限制更严格的角色以满足你的要求。

    Shell
    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.admin
    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/storage.admin
    gcloud projects add-iam-policy-binding $GKE_PROJECT \
      --member=serviceAccount:$SA_EMAIL \
      --role=roles/container.clusterViewer
    
  4. 下载服务帐户的 JSON 密钥文件:

    Shell
    gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL
    
  5. 将服务帐户密钥存储为名为 GKE_SA_KEY 的机密:

    Shell
    export GKE_SA_KEY=$(cat key.json | base64)
    

    有关如何存储机密的详细信息,请参阅“在 GitHub Actions 中使用机密”。

存储项目名称

将项目的名称存储为名为 GKE_PROJECT 的机密。 有关如何存储机密的详细信息,请参阅“在 GitHub Actions 中使用机密”。

(可选)配置 kustomize

Kustomize 是用于管理 YAML 规范的可选工具。 在创建 kustomization 文件之后, 下面的工作流可用于将结果中的图像和管道字段动态设置为 kubectl。 有关详细信息,请参阅 Kustomize 用法

(可选)配置部署环境

环境用于描述常规部署目标,例如 productionstagingdevelopment。 当 GitHub Actions 工作流部署到某个环境时,该环境将显示在存储库的主页上。 可以使用环境来要求批准作业才能继续,限制哪些分支可以触发工作流 ,使用自定义部署保护规则 控制部署,或限制对机密的访问。 有关创建环境的详细信息,请参阅“管理部署环境”。

创建工作流程

完成先决条件后,可以继续创建工作流程。

下面的示例工作流程演示如何生成容器映像并推送到 GCR。 然后,它使用 Kubernetes 工具(如 kubectlkustomize)将映像拉取入群集部署。

env 密钥下,将值 GKE_CLUSTER 更改为群集的名称,将 GKE_ZONE 更改为群集区域,将 DEPLOYMENT_NAME 更改为部署的名称以及将 IMAGE 更改为映像的名称。

如果配置了部署环境,请将 environment 的值更改为环境的名称。 如果未配置环境 ,请删除 environment 密钥。

YAML
# 此工作流使用未经 GitHub 认证的操作。
# 它们由第三方提供,并受
# 单独的服务条款、隐私政策和支持
# 文档。

# GitHub 建议将操作固定到提交 SHA。
# 若要获取较新版本,需要更新 SHA。
# 还可以引用标记或分支,但该操作可能会更改而不发出警告。

name: Build and Deploy to GKE

on:
  push:
    branches:
      - main

env:
  PROJECT_ID: ${{ secrets.GKE_PROJECT }}
  GKE_CLUSTER: cluster-1    # Add your cluster name here.
  GKE_ZONE: us-central1-c   # Add your cluster zone here.
  DEPLOYMENT_NAME: gke-test # Add your deployment name here.
  IMAGE: static-site

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    # Setup gcloud CLI
    - uses: google-github-actions/setup-gcloud@1bee7de035d65ec5da40a31f8589e240eba8fde5
      with:
        service_account_key: ${{ secrets.GKE_SA_KEY }}
        project_id: ${{ secrets.GKE_PROJECT }}

    # Configure Docker to use the gcloud command-line tool as a credential
    # helper for authentication
    - run: |-
        gcloud --quiet auth configure-docker

    # Get the GKE credentials so we can deploy to the cluster
    - uses: google-github-actions/get-gke-credentials@db150f2cc60d1716e61922b832eae71d2a45938f
      with:
        cluster_name: ${{ env.GKE_CLUSTER }}
        location: ${{ env.GKE_ZONE }}
        credentials: ${{ secrets.GKE_SA_KEY }}

    # Build the Docker image
    - name: Build
      run: |-
        docker build \
          --tag "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA" \
          --build-arg GITHUB_SHA="$GITHUB_SHA" \
          --build-arg GITHUB_REF="$GITHUB_REF" \
          .

    # Push the Docker image to Google Container Registry
    - name: Publish
      run: |-
        docker push "gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA"

    # Set up kustomize
    - name: Set up Kustomize
      run: |-
        curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64
        chmod u+x ./kustomize

    # Deploy the Docker image to the GKE cluster
    - name: Deploy
      run: |-
        ./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA
        ./kustomize build . | kubectl apply -f -
        kubectl rollout status deployment/$DEPLOYMENT_NAME
        kubectl get services -o wide

其他资源

有关这些示例中使用的工具的详细信息,请参阅以下文档: