当爪哇见gke时
#java #kubernetes #gcp #cloudcomputing

介绍

这篇文章是我们系列的第三个也是最后一篇,“当Java见面...”。在前两个帖子中,我们学会了如何在当地环境中与docker一起部署Java应用程序,然后与Kubernetes一起部署。

在本文中,我们将学习如何在GKE上部署我们的Java应用程序,这是用于在Google Cloud Platform上部署和管理集装应用程序的托管服务。

什么是GKE?

GKE代表Google Kubernetes Engine,这是用于在Google Cloud Platform上部署和管理集装应用程序的托管服务。这是一个完全管理的平台,可让您轻松地运行和管理云中的容器化应用程序。

正如我们在先前帖子中所解释的那样,Kubernetes是一个开源容器编排系统,可让您部署,扩展和管理容器化的应用程序。 GKE提供了一个完全管理的Kubernetes环境,该环境可在Google Cloud Platform上优化用于运行容器化的应用程序。使用GKE,您可以在Google管理基础架构时专注于应用程序开发。

gke提供诸如自动缩放,负载平衡和自动升级之类的功能,以确保您的应用程序始终可用并顺利运行。它还与其他Google Cloud平台服务(例如云存储,云SQL和云构建)集成在一起,从而易于构建和部署现代云本地应用程序。

总而言之,GKE是使用Kubernetes在Google Cloud Platform上部署和管理集装应用程序的功能强大且完全管理的平台。

环境配置

在我们可以创建GKE群集并部署我们的应用程序之前,需要执行以下步骤:

开始之前,请确保您已经拥有GCP帐户,如果不是GCP帐户,则可以创建GCP免费层帐户,这对本教程就足够了。

安装GCLOUD CLI

Google Cloud(Gcloud)CLI是一种工具,我们可以用来与命令行的各种Google Cloud Platform服务进行交互,例如Google Compute Engine,Google Kubernetes Engine和Google Cloud Storage。

例如,您可以使用GCLOUD CLI来创建和管理以下内容:

  • 计算引擎虚拟机实例和其他资源
  • 云SQL实例
  • Google Kubernetes引擎簇
  • DataProc群集和作业
  • 云DNS托管区域和记录集
  • 云部署管理器部署

gcloud还提供了用于管理Google Cloud平台服务的其他工具和命令,包括身份验证和授权,配置管理以及资源管理。

以下安装是在 64位Ubuntu 20.04.1 LTS 上完成的。您的环境可能有所不同,您可以在此链接中找到其他平台的安装类型:https://cloud.google.com/sdk/docs/install

  1. 首先下载gcloud存档并提取
    的内容 文件:

    curl -O 
    https://dl.google.com/dl/cloudsdk/channels/rapid/downloads
    /google-cloud-cli-429.0.0-linux-x86_64.tar.gz
    
    tar -xf google-cloud-cli-429.0.0-linux-x86_64.tar.gz
    
    
  2. 从文件夹的根部运行安装脚本
    提取以使用以下命令:

    ./google-cloud-sdk/install.sh
    
  3. 安装完成后,运行gcloud init命令:

    gcloud init
    

    gcloud init执行以下设置步骤:

    • 授权GCLOUD CLI使用您的用户帐户 访问Google Cloud的凭据,或者让您选择一个 帐户如果您以前已授权访问
    • 设置Gcloud CLI配置并设置一个基础集 属性,包括步骤的活动帐户 上面是当前项目,如果适用,则默认 计算引擎区域和区域

    gcloud启动完成时,它将在
    中打印属性 终端的主动配置::

    gcloud init    
    [compute]
    region = us-east1
    zone = us-east1-b
    [core]
    account = user@google.com
    disable_usage_reporting = False
    project = example-project```
    
    

现在,我们准备创建专门针对玩家应用程序的项目。

在GCP中创建一个新项目

  1. 创建一个新项目运行此命令:

    gcloud projects create players-app --name="players-app project" --labels=type=tuto
    
  2. 完成后,通过运行此命令来激活新项目配置:

    gcloud config configurations create playersapp --account your-gcp-account --project players-app
    gcloud config configurations activate playersapp
    

    此命令将创建一种新的配置并使其活跃。如果要查看配置列表,请运行此命令:

    gcloud config configurations list
    
  3. 设置项目的默认区域和区域。这样,您就无需在创建GKE群集和其他资源时键入这些信息:

    gcloud compute project-info add-metadata --metadata google-compute-default-region=europe-west1,google-compute-default-zone=europe-west1-b
    

    如果您想进行检查,则应查看键 Google-Compute-Default-drigion Google-Compute-Default-exone ,并在上面输入该区域执行此命令后:

    gcloud compute project-info describe --project players-app
    
  4. 我们几乎在那里,以避免在创建GKE群集时输入错误消息,我们需要通过运行此命令来激活某些GCP服务:

    gcloud services enable compute.googleapis.com container.googleapis.com
    

玩GKE!

创建GKE群集

现在一切都准备就绪,我们可以创建一个GKE群集,我们将通过执行此命令来称呼玩家-GKE:

gcloud container clusters create players-gke --release-channel None

我们可以在GCP Web控制台中检查我们的GKE群集现在正在启动并运行:

Image description

那样简单!现在,我们有一个Kubernetes群集准备托管我们的应用程序!

安装Kubectl工具

要与我们的群集互动,我们需要使用kubectl。在您的外壳终端运行此命令:

gcloud components install kubectl

验证 kubectl 已安装运行:

kubectl version

运行此命令以更新 kubectl 配置:

gcloud container clusters get-credentials players-gke \
    --region=northamerica-northeast2

通过键入此命令:
来验证您的配置是否正确完成

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   40m
kube-node-lease   Active   40m
kube-public       Active   40m
kube-system       Active   40m

好吧,让我们在新创建的群集上部署我们的应用程序!

在GKE上部署玩家应用程序

就像我们在previous post中的本地kubernetes群集上所做的那样,我们将使用kubectl appl来部署我们的应用程序,使用两个yaml文件,您可以在此GitHub repo中找到,一个用于Springboot应用程序,另一个用于该应用程序Postgres数据库:

$ kubectl apply -f postgres.yaml 
deployment.apps/playersdb created
service/playersdb created
$ kubectl apply -f deployment.yaml 
deployment.apps/players created
service/players created

现在我们的工作负载已部署,我们可以在云控制台中看到:

Image description

我们还可以看到已创建的服务:

Image description

测试我们的应用程序

要测试我们的应用程序,我们需要对通过节点端口暴露的播放器应用进行REST API调用。

首先,我们需要查看服务,输出显示一个nodeport值:

$ kubectl get service players --output yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"creationTimestamp":null,"labels":{"app":"players"},"name":"players","namespace":"default"},"spec":{"ports":[{"port":8080,"protocol":"TCP","targetPort":8080}],"selector":{"app":"players"},"type":"NodePort"},"status":{"loadBalancer":{}}}
  creationTimestamp: "2023-05-08T03:12:39Z"
  labels:
    app: players
  name: players
  namespace: default
  resourceVersion: "27799"
  uid: a719a733-f2d9-4a42-9a97-f49af11d62fb
spec:
  clusterIP: 10.72.9.232
  clusterIPs:
  - 10.72.9.232
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 31538
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: players
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

我们可以在上面看到NodePort值是 31538 。我们创建一个防火墙规则以允许您的节点端口上的TCP流量:

gcloud compute firewall-rules create test-node-port --allow tcp:31538

我们需要ALO来找到我们一个节点之一的外部IP地址:

$ kubectl get nodes --output wide
NAME                                         STATUS   ROLES    AGE   VERSION            INTERNAL-IP   EXTERNAL-IP      OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gke-players-gke-default-pool-5fe50b35-6l48   Ready    <none>   65m   v1.25.7-gke.1000   10.188.0.9    34.130.171.114   Container-Optimized OS from Google   5.15.65+         containerd://1.6.18
gke-players-gke-default-pool-5fe50b35-j7dw   Ready    <none>   65m   v1.25.7-gke.1000   10.188.0.8    34.130.43.212    Container-Optimized OS from Google   5.15.65+         containerd://1.6.18
gke-players-gke-default-pool-5fe50b35-jn77   Ready    <none>   65m   v1.25.7-gke.1000   10.188.0.7    34.130.245.5     Container-Optimized OS from Google   5.15.65+         containerd://1.6.18

最后,我们可以通过使用URL中的外部节点IPS发送API调用来开始测试我们的服务:

$ curl -i --location --request GET '34.130.43.212:31538/api/player/v1/test'
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 14
Date: Mon, 08 May 2023 03:40:52 GMT

This is a test

太好了!我们可以看到我们的应用程序正在响应,现在我们可以添加另一个API调用以添加播放器并获取他们的列表:

$ curl -i --location --request POST 'http://34.130.171.114:31538/api/player/v1/add' \
--header 'Content-Type: application/json' \
--data-raw '{
    "firstName": "Riyad",
    "lastName": "Mahrez",
    "team": "Manchester City",
    "position": "RW"
}'

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 08 May 2023 03:43:54 GMT

{"id":1,"firstName":"Riyad","lastName":"Mahrez","team":"Manchester City","position":"RW"}

$ curl -i --location --request POST 'http://34.130.171.114:31538/api/player/v1/add' \
--header 'Content-Type: application/json' \
--data-raw '{
    "firstName": "Ismail",
    "lastName": "Bennacer",
    "team": "AC Milan",
    "position": "CM"
}'

{"id":2,"firstName":"Ismail","lastName":"Bennacer","team":"AC Milan","position":"CM"}

$ curl -i --location --request GET 'http://34.130.245.5:31538/api/player/v1/list'

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Mon, 08 May 2023 03:47:42 GMT

[{"id":1,"firstName":"Riyad","lastName":"Mahrez","team":"Manchester City","position":"RW"},{"id":2,"firstName":"Ismail","lastName":"Bennacer","team":"AC Milan","position":"CM"}]

恭喜!您已经完成了有关使用Docker,Local Kubernetes群集和公共云Kubernetes群集在各种环境中的实用指南的结尾,并将其部署在各种环境中。通过遵循这一系列帖子中概述的步骤,您现在应该对容器化过程以及如何将应用程序部署到Kubernetes群集有牢固的了解。

我们希望本指南对您的掌握集装箱和Kubernetes部署有所帮助。请记住,这只是一个开始,在这个不断发展的领域中,总有更多的学习和探索。

感谢您的阅读和快乐的容器!