{"meta":{"title":"部署到 Google Kubernetes Engine","intro":"了解如何在持续部署 (CD) 工作流中将项目部署到 Google Kubernetes Engine (GKE)。","product":"GitHub Actions","breadcrumbs":[{"href":"/zh/actions","title":"GitHub Actions"},{"href":"/zh/actions/how-tos","title":"操作方法"},{"href":"/zh/actions/how-tos/deploy","title":"部署"},{"href":"/zh/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"部署到第三方平台"},{"href":"/zh/actions/how-tos/deploy/deploy-to-third-party-platforms/google-kubernetes-engine","title":"Google Kubernetes 引擎"}],"documentType":"article"},"body":"# 部署到 Google Kubernetes Engine\n\n了解如何在持续部署 (CD) 工作流中将项目部署到 Google Kubernetes Engine (GKE)。\n\n## 先决条件\n\n在继续创建工作流程之前，您需要完成 Kubernetes 项目的以下步骤。 本指南假定项目的根目录已有 `Dockerfile` 和 Kubernetes 部署配置文件。\n\n### 创建 GKE 群集\n\n要创建 GKE 群集，首先需要使用 `gcloud` CLI 进行身份验证。 有关此步骤的更多信息，请参阅以下文章：\n\n* [`gcloud auth login`](https://cloud.google.com/sdk/gcloud/reference/auth/login)\n* [\n  `gcloud`CLI（命令行界面）](https://cloud.google.com/sdk/gcloud/reference)\n* [\n  `gcloud` CLI 和 Cloud SDK](https://cloud.google.com/sdk/gcloud#the_gcloud_cli_and_cloud_sdk)\n\n例如：\n\n```shell copy\n$ gcloud container clusters create $GKE_CLUSTER \\\n    --project=$GKE_PROJECT \\\n    --zone=$GKE_ZONE\n```\n\n### 启用 API\n\n启用 Kubernetes Engine 和 Container Registry API。 例如：\n\n```shell copy\n$ gcloud services enable \\\n    containerregistry.googleapis.com \\\n    container.googleapis.com\n```\n\n### 配置服务帐户并存储其凭据\n\n此程序显示如何为您的 GKE 集成创建服务帐户。 它介绍了如何创建帐户、向其添加角色、取回其密钥，以及将它们存储为名为 `GKE_SA_KEY` 以 base64 编码的加密存储库机密。\n\n1. 创建新服务帐户：\n\n   ```shell copy\n   gcloud iam service-accounts create $SA_NAME\n   ```\n\n2. 检索你刚刚创建的服务帐户的电子邮件地址：\n\n   ```shell copy\n   gcloud iam service-accounts list\n   ```\n\n3. 向服务帐户添加角色。\n\n   > \\[!NOTE]\n   > 使用更严格限制的角色以满足你的要求。\n\n   ```shell copy\n   gcloud projects add-iam-policy-binding $GKE_PROJECT \\\n     --member=serviceAccount:$SA_EMAIL \\\n     --role=roles/container.admin\n   gcloud projects add-iam-policy-binding $GKE_PROJECT \\\n     --member=serviceAccount:$SA_EMAIL \\\n     --role=roles/storage.admin\n   gcloud projects add-iam-policy-binding $GKE_PROJECT \\\n     --member=serviceAccount:$SA_EMAIL \\\n     --role=roles/container.clusterViewer\n   ```\n\n4. 下载服务帐户的 JSON 密钥文件：\n\n   ```shell copy\n   gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL\n   ```\n\n5. 将服务帐户密钥存储为名为 `GKE_SA_KEY` 的机密：\n\n   ```shell copy\n   export GKE_SA_KEY=$(cat key.json | base64)\n   ```\n\n   有关如何存储机密的详细信息，请参阅“[在 GitHub Actions 中使用机密](/zh/actions/security-guides/using-secrets-in-github-actions)”。\n\n### 存储项目名称\n\n将项目的名称存储为名为 `GKE_PROJECT` 的机密。 有关如何存储机密的详细信息，请参阅“[在 GitHub Actions 中使用机密](/zh/actions/security-guides/using-secrets-in-github-actions)”。\n\n### （可选）配置 kustomize\n\nKustomize 是用于管理 YAML 规范的可选工具。 在创建 `kustomization` 文件之后， 下面的工作流可用于将结果中的图像和管道字段动态设置为 `kubectl`。 有关详细信息，请参阅 [Kustomize 用法](https://github.com/kubernetes-sigs/kustomize#usage)。\n\n### （可选）配置部署环境\n\n环境用于描述常规部署目标，例如 `production`、`staging` 或 `development`。 当 GitHub Actions 工作流部署到某个环境时，该环境将显示在存储库的主页上。 可以使用环境来要求审批作业以继续，限制可以触发工作流的分支，使用自定义部署保护规则控制部署，或限制对机密的访问权限。 有关创建环境的详细信息，请参阅“[管理部署环境](/zh/actions/deployment/targeting-different-environments/managing-environments-for-deployment)”。\n\n## 创建工作流程\n\n完成先决条件后，可以继续创建工作流程。\n\n下面的示例工作流程演示如何生成容器映像并推送到 GCR。 然后，它使用 Kubernetes 工具（如 `kubectl` 和 `kustomize`）将映像拉取入群集部署。\n\n在 `env` 密钥下，将值 `GKE_CLUSTER` 更改为群集的名称，将 `GKE_ZONE` 更改为群集区域，将 `DEPLOYMENT_NAME` 更改为部署的名称以及将 `IMAGE` 更改为映像的名称。\n\n如果配置了部署环境，请将 `environment` 的值更改为环境的名称。 如果未配置环境 ，或者如果工作流位于专用存储库中并且你未使用 GitHub Enterprise Cloud，请删除 `environment` 密钥。\n\n```yaml copy\n# 此工作流使用未经 GitHub 认证的操作。\n# 它们由第三方提供，并受\n# 单独的服务条款、隐私政策和支持\n# 文档。\n\n# GitHub 建议将操作固定到提交 SHA。\n# 若要获取较新版本，需要更新 SHA。\n# 还可以引用标记或分支，但该操作可能会更改而不发出警告。\n\nname: Build and Deploy to GKE\n\non:\n  push:\n    branches:\n      - main\n\nenv:\n  PROJECT_ID: ${{ secrets.GKE_PROJECT }}\n  GKE_CLUSTER: cluster-1    # Add your cluster name here.\n  GKE_ZONE: us-central1-c   # Add your cluster zone here.\n  DEPLOYMENT_NAME: gke-test # Add your deployment name here.\n  IMAGE: static-site\n\njobs:\n  setup-build-publish-deploy:\n    name: Setup, Build, Publish, and Deploy\n    runs-on: ubuntu-latest\n    environment: production\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v6\n\n    # Setup gcloud CLI\n    - uses: google-github-actions/setup-gcloud@1bee7de035d65ec5da40a31f8589e240eba8fde5\n      with:\n        service_account_key: ${{ secrets.GKE_SA_KEY }}\n        project_id: ${{ secrets.GKE_PROJECT }}\n\n    # Configure Docker to use the gcloud command-line tool as a credential\n    # helper for authentication\n    - run: |-\n        gcloud --quiet auth configure-docker\n\n    # Get the GKE credentials so we can deploy to the cluster\n    - uses: google-github-actions/get-gke-credentials@db150f2cc60d1716e61922b832eae71d2a45938f\n      with:\n        cluster_name: ${{ env.GKE_CLUSTER }}\n        location: ${{ env.GKE_ZONE }}\n        credentials: ${{ secrets.GKE_SA_KEY }}\n\n    # Build the Docker image\n    - name: Build\n      run: |-\n        docker build \\\n          --tag \"gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA\" \\\n          --build-arg GITHUB_SHA=\"$GITHUB_SHA\" \\\n          --build-arg GITHUB_REF=\"$GITHUB_REF\" \\\n          .\n\n    # Push the Docker image to Google Container Registry\n    - name: Publish\n      run: |-\n        docker push \"gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA\"\n\n    # Set up kustomize\n    - name: Set up Kustomize\n      run: |-\n        curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.1.0/kustomize_3.1.0_linux_amd64\n        chmod u+x ./kustomize\n\n    # Deploy the Docker image to the GKE cluster\n    - name: Deploy\n      run: |-\n        ./kustomize edit set image gcr.io/PROJECT_ID/IMAGE:TAG=gcr.io/$PROJECT_ID/$IMAGE:$GITHUB_SHA\n        ./kustomize build . | kubectl apply -f -\n        kubectl rollout status deployment/$DEPLOYMENT_NAME\n        kubectl get services -o wide\n```\n\n## 其他阅读材料\n\n有关这些示例中使用的工具的详细信息，请参阅以下文档：\n\n* 有关完整的工作流模板，请参阅[“生成并部署到 GKE”工作流](https://github.com/actions/starter-workflows/blob/main/deployments/google.yml)。\n* Kubernetes YAML 自定义引擎：[Kustomize](https://kustomize.io/)。\n* Google Kubernetes Engine 文档中的“[部署容器化 Web 应用](https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app)”。"}