如何部署到 GKE

我们也将相同的代码部署到 GKE(Google Kubernetes Engine)。您可以在以下链接找到逐步指导: GitHub Hands-On Steps

Google 资源的部署

完整的部署过程在 setup-gke.sh 脚本中进行,您需要在 Cloud Shell 中执行该脚本。该脚本创建一个 GKE 集群,并且指定一个节点。出于测试目的,只有一个节点是足够的:

gcloud container clusters create $GKE_CLUSTER --num-nodes=1

此外,脚本还会创建一个用于 Docker 容器的制品库,并为部署创建一个服务账户。

在 Kubernetes 中,有一个概念叫做 pods,它们包含容器并通过部署文件(如 Deployment.yaml)进行部署。部署文件定义了容器,并将其与镜像绑定:

spec:
  containers:
    - name: $GKE_APP_NAME
      image: $GKE_REGION-docker.pkg.dev/$GKE_PROJECT/$GKE_PROJECT/$GKE_APP_NAME:$GITHUB_SHA
      ports:
        - containerPort: 80
      env:
        - name: PORT
          value: "80"

在此文件中使用了环境变量,您可以使用 envsubst 替换变量值,然后通过 kubectl apply 命令应用:

envsubst < Deployment.yml | kubectl apply -f -

服务 用于暴露 pods —— 在这种情况下,是将其暴露到互联网。服务通过类似的方式进行部署,使用 Service.yml 文件:

spec:
  type: LoadBalancer
  selector:
    app: $GKE_APP_NAME
  ports:
    - port: 80
      targetPort: 80

部署服务可能需要一些时间,您可能需要多次执行以下命令:

$ kubectl get service

如果返回外部 IP 地址,您就可以使用该地址来测试您的部署(见图 9.5)。

image 2024 12 27 13 45 41 613
Figure 1. 图 9.5 – 获取 GKE LoadBalancer 的外部 IP

服务账户的凭证存储在 key.json 文件中。您需要将其编码并保存为 GitHub 上的加密密钥。您可以使用以下命令将凭证编码为 Base64 格式:

$ cat key.json | base64

该脚本已完成此操作,因此您只需复制输出并将其粘贴到 GitHub 的加密密钥中,命名为 GKE_SA_KEY

使用 GitHub Actions 部署容器

在 GitHub Actions 工作流中的部署过程非常直接。认证和 gcloud CLI 的设置通过 setup-gcloud 操作完成:

- uses: google-github-actions/setup-gcloud@v0.2.0
  with:
    service_account_key: ${{ secrets.GKE_SA_KEY }}
    project_id: ${{ secrets.GKE_PROJECT }}
    export_default_credentials: true

工作流接下来会构建并将容器推送到注册表。它使用 gcloud 进行 Docker 注册表的认证:

gcloud auth configure-docker \
$GKE_REGION-docker.pkg.dev \
--quiet

要将新镜像部署到 GKE,我们通过 get-gke-credentials 操作进行认证:

- uses: google-github-actions/get-gke-credentials@v0.2.1
  with:
    cluster_name: ${{ env.GKE_CLUSTER }}
    location: ${{ env.GKE_ZONE }}
    credentials: ${{ secrets.GKE_SA_KEY }}

接下来,我们只需替换部署文件中的变量,并将其传递给 kubectl apply 命令:

envsubst < Service.yml | kubectl apply -f -
envsubst < Deployment.yml | kubectl apply -f -

至此,按照动手实验的步骤,您应该能够成功完成 GKE 部署!

Kubernetes 部署

Kubernetes 部署可能非常复杂;然而,这超出了本书的范围。您可以使用不同的部署策略,例如:重建(Recreate)滚动更新(Rolling Updates,亦称为 Ramped Updates)蓝绿部署(Blue/Green Deployments)金丝雀部署(Canary Deployments)A/B 测试。一个好的起点是官方文档,您可以在以下链接找到:[Kubernetes Workloads Controllers](Kubernetes Deployment Strategies(https://github.com/ContainerSolutions/k8s-deployment-strategies)。

在处理 Kubernetes 时,还有许多其他工具可以使用。例如,Helm([https://helm.sh/](https://helm.sh/))是 Kubernetes 的包管理器,而 Kustomize([https://kustomize.io/](https://kustomize.io/))是一个可以帮助您管理多个配置的工具。