“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。
在本教程中,您将使用Kubernetes将Spring Boot微服务架构部署到Google Cloud,特别是Google Kubernetes Engine(GKE)。 您还将使用Istio创建服务网格层并创建公共网关。 整个事情将使用Okta OAuth JWT身份验证进行保护。
那是一堆烂话。 我们将不在这里深入解释微服务。 简而言之,微服务是一种设计模式,可将较大的单片服务拆分为较小的独立“微”服务。 这些服务通过网络松散耦合。 这种体系结构的好处是,每个服务都变得可测试,可维护且可独立部署。 在互联网规模上,在像Amazon和Netflix这样的大型公司中,这种架构都很棒,因为它允许公司将小型团队的职责分配给可管理的,离散的功能单元。 而不是拥有成千上万的人监督巨大的整体代码块。 不利之处是复杂性和基础架构的高昂初始成本,这对于无法规模化的较小项目可能没有意义。
Kubernetes是用于部署容器化服务的平台。 您可以将其视为Docker容器的容器协调器(这是一种简化,但是可以使用)。 这将使我们能够编写YAML脚本,以自动将微服务架构部署到我们选择的平台GKE。 这是一个庞大的项目,需要深入研究。 看看他们的文档以了解更多信息。
Istio在Kubernetes的基础上又增加了一层功能,增加了一些出色的监视,安全性,访问控制和负载平衡功能。 查看他们的网站以获取更多信息。
微服务架构的最后一部分是Google Cloud和GKE 。 这是您将用于部署微服务的平台。 本教程中未介绍的另一个选项是Minikube。 Minikube在您的计算机上本地运行,可能对某些人有用。 我发现Google Kubernetes Engine更易于使用且性能更高。
我们假设您熟悉Spring Boot和Java。 如果不是这样,请查看教程末尾的一些链接以帮助您入门。
Spring Boot和Kubernetes的要求
HTTPie :从他们的网站安装HTTPie,以便我们可以轻松地从终端运行HTTP请求。
Docker :如果尚未安装Docker Desktop,请从其网站下载并安装。
kubectl :这是Kubernetes的命令行界面。 有关安装说明,请参见其网站 。
Google Cloud :您需要一个启用了计费功能的Google Cloud帐户。 有一个免费试用版,其中应包括足够的学分和时间,以帮助您完成本教程。 转到Google Cloud网站并注册。
developer.okta.com :我们在开发人员网站上提供免费的开发人员帐户。 请立即注册一个。 您将在本教程结束时使用它。
gcloud :这是Google Cloud CLI。 按照其网站上的说明进行安装。 。 完成此操作后,您需要通过运行以下命令来安装gcloud kubectl
组件:
gcloud components install kubectl
我是否提到微服务的初始复杂性成本很高?
使用Istio创建一个Google Kubernetes Engine项目
您现在应该拥有一个启用了结算功能的Google Cloud帐户。 同样,您实际上不需要花任何钱,但是如果不付款,您将无法访问免费试用版。
创建一个新项目。 将其命名为spring-boot-gke
(或任何您想使用的名称,但是您需要各种命令的项目ID)。 等待项目创建。
项目名称的结尾可能会带有一个ID号,例如spring-boot-gke-232934
。 您将需要几次该项目名称,因此请继续将其存储在shell变量中并记下它。
PROJECT_NAME=<your project name and ID>
项目准备就绪后,打开项目仪表板,打开导航菜单,然后单击Kubernetes Engine 。 单击启用帐单按钮(如果尚未启用帐单),然后选择一个帐单帐户。
单击创建集群 。
在左侧面板中,选择您的第一个集群 。
将集群命名为“ spring-boot-cluster”。
选择区域“ us-west1-a”。
单击集群配置面板底部的“ 高级选项”链接以显示高级选项。 向下滚动到底部,然后选中Enable Istio(beta)复选框。 这将自动在群集上安装Istio。
在底部,单击创建以创建集群。 喝咖啡或休息一下; 创建集群将需要几分钟。
同时,如果尚未安装,请继续运行以下命令来初始化gcloud
CLI:
gcloud init
在初始化过程中,可以将新项目设置为默认项目,并将项目区域设置为默认区域。
部署集群后,您需要使用以下命令将本地gcloud
和kubectl
CLI连接到该集群:
gcloud container clusters get-credentials {yourClusterName} --zone us-west1-a --project {yourProjectId}
如果您使用了其他项目名称,则需要更改命令以反映该名称。
注意:如果单击Google Cloud Platform仪表板右侧的“ 连接”按钮,您将看到正确的命令,可输入:
结果,您应该看到类似以下的内容:
- Fetching cluster endpoint and auth data.
- kubeconfig entry generated for spring-boot-cluster.
您还需要为自己赋予集群管理员权限:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value core/account)
现在,您需要检查并确保Istio服务已安装并正在运行。 有两种检查方法。 首先,在您的Google Cloud Platform Kubernetes Engine仪表板中,单击“ 服务”按钮。 您应该在spring-boot-cluster
看到Istio服务的列表。 它们的状态列下都应有绿色的“确定”。
在此期间,请注意类型为LoadBalancer
名为istio-ingressgateway
的服务。 这是群集的公共负载平衡器,该条目显示公共IP和开放端口。
另一种检查方法是使用kubectl
CLI。
要检查服务,请使用以下命令: kubectl get services --all-namespaces
。 必须使用--all-namespaces
才能显示istio-system
命名空间中的Istio服务。
- $ kubectl get services --all-namespaces
- NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- default kubernetes ClusterIP 10.31.240.1 <none> 443/TCP 5m
- istio-system istio-citadel ClusterIP 10.31.252.214 <none> 8060/TCP,9093/TCP 3m
- istio-system istio-egressgateway ClusterIP 10.31.247.186 <none> 80/TCP,443/TCP 3m
- istio-system istio-galley ClusterIP 10.31.249.131 <none> 443/TCP,9093/TCP 3m
- istio-system istio-ingressgateway LoadBalancer 10.31.244.186 35.185.213.229 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30675/TCP,8060