介绍
这篇文章是我们系列的第三个也是最后一篇,“当Java见面...”。在前两个帖子中,我们学会了如何在当地环境中与docker一起部署Java应用程序,然后与Kubernetes一起部署。
在本文中,我们将学习如何在GKE上部署我们的Java应用程序,这是用于在Google Cloud Platform上部署和管理集装应用程序的托管服务。
p>
什么是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
-
首先下载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
-
从文件夹的根部运行安装脚本
提取以使用以下命令:
./google-cloud-sdk/install.sh
-
安装完成后,运行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中创建一个新项目
-
创建一个新项目运行此命令:
gcloud projects create players-app --name="players-app project" --labels=type=tuto
-
完成后,通过运行此命令来激活新项目配置:
gcloud config configurations create playersapp --account your-gcp-account --project players-app gcloud config configurations activate playersapp
此命令将创建一种新的配置并使其活跃。如果要查看配置列表,请运行此命令:
gcloud config configurations list
-
设置项目的默认区域和区域。这样,您就无需在创建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
-
我们几乎在那里,以避免在创建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群集现在正在启动并运行:
那样简单!现在,我们有一个Kubernetes群集准备托管我们的应用程序!
p>
安装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
现在我们的工作负载已部署,我们可以在云控制台中看到:
我们还可以看到已创建的服务:
测试我们的应用程序
要测试我们的应用程序,我们需要对通过节点端口暴露的播放器应用进行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部署有所帮助。请记住,这只是一个开始,在这个不断发展的领域中,总有更多的学习和探索。
感谢您的阅读和快乐的容器!