在之前的文章中,我们为使用Docker和Spring Boot的订单管理系统构建了一些微服务(订单服务,产品服务,客户服务)。 我们使用Netflix库来管理,发现和平衡微服务。

管理这些微服务及其多个容器可能会有些棘手; 特别是在可伸缩性,可观察性,安全性,监视和管理资源方面。 因此,我们将使用Kubernetes进行容器编排。 单击此处以了解有关Kubernetes的更多信息。

为了入门,我们可以在笔记本电脑中使用本地Kube集群,也可以使用AWS / Azure / GCP之类的云提供商。

本地Kube集群: 我们可以使用Minikube或Docker for Desktop来设置本地kube集群。 请遵循它们各自的文档,将其安装在笔记本电脑/计算机上。 在本教程中,我们将在Mac上使用Docker for Desktop,因此,如果使用的是Docker,请遵循此文档进行设置。

使用Amazon Elastic Kubernetes服务(EKS) : 您还可以在EKS上设置集群以部署应用程序,因为您将需要在AWS上使用一个帐户( https://aws.amazon.com/ )。 登录到AWS后,转到EKS并创建一个集群。 阅读此文档以设置集群。

Kubectl: KubeCtl是一个命令行界面,用于针对Kubernetes集群运行命令。 如果您使用的是Docker for Desktop,则已经包含并配置了Docker以连接到本地Kubernetes服务器,否则请使用此文档在笔记本电脑上设置KubeCtl。

为了让kubectl找到并访问Kubernetes集群,它需要一个kubeconfig文件。 默认情况下,kubectl配置位于:

~/.kube /config .

通过获取集群状态来检查kubectl是否已正确配置:

kubectl cluster-info

要在EKS中管理集群,请使用此文档来设置kubeconfig。

在Kube集群中部署应用程序:

k8s 替代 springcloud k8s docker springcloud_java

现在,我们已经成功创建了一个kube集群,并配置了kubectl来管理和部署到该集群中,我们准备将应用程序部署到该集群中。

在之前的博客中,我们创建了3个在Docker容器中运行的微服务。 我们可以使用任何这些微服务的映像来部署到kube集群中。 如果我们使用本地kube集群(用于桌面的Docker或MiniKube),则可以使用本地docker映像部署到集群。 (要使本地映像正常工作,我们需要在我们的部署定义中将一个名为“ imagePullPolicy”的属性设置为“ Never”。)

对于EKS,我们需要将映像保存在注册表中,我们现在可以使用docker hub public repo,因此我们不必担心通过注册表进行身份验证。 如果必须使用ECR(Amazon Elastic Container Registry),则需要为运行集群中节点的实例授予ECR拉权限,为简单起见,我们暂时不介绍该部分。

建立本地形象

为了在本地kube集群中部署应用程序,我们将在笔记本电脑中创建其docker映像。

因此,如果您拥有先前博客中使用的任何服务的源代码,我们将使用它们。 –转到productService的根文件夹,然后运行docker build命令:

docker build -t productservice .

这将创建带有标签“ productservice”的本地图像。 通过运行该图像来测试该图像是否工作正常。

docker run -p 8001:8001 productservice:latest

此服务需要访问本地Postgres数据库服务器,因此无法启动。 为简单起见,让我们快速更改应用程序并使用内存数据库(H2)。 对build.gradle进行以下更改:(用H2替换postgres depenendcy)

dependencies { 
     implementation( 'org.springframework.boot:spring-boot-starter-data-jpa' ) 
     implementation( 'org.springframework.boot:spring-boot-starter-web' ) 
     implementation( 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' ) 
     runtime( "com.h2database:h2:1.3.176" ) 
     compileOnly 'org.projectlombok:lombok:1.18.4' 
     testImplementation( 'org.springframework.boot:spring-boot-starter-test' )  }

并替换spring数据源以在application.properties中使用H2:

spring.datasource.url=jdbc:h2:mem:testdb  spring.datasource.driverClassName=org.h2.Driver  spring.datasource.username=sa  spring.datasource.password=  spring.h2.console.enabled= false

完成这两项更改后,该应用程序将可以很好地启动和运行。 这次重建图像(确保您清除了旧标签)并运行它。 使用以前的博客来测试端点。 (创建和获取产品@ / products)

创建deployment.yaml 要将映像部署到kube,我们需要一个部署定义(如果只想安装Pod,则需要一个Pod定义)。

apiVersion: apps /v1  kind: Deployment  metadata: 
   name: product-service-deployment  spec: 
   selector: 
     matchLabels: 
       app: product-service 
   replicas: 1 
   template: 
     metadata: 
       labels: 
         app: product-service 
     spec: 
       containers: 
       - name: product-app 
         image: productservice:latest 
         imagePullPolicy: Never 
         ports: 
         - containerPort: 8001

确保使用在“名称”中创建的本地图像的标签。

将以上文件另存为product-service-deployment.yaml,并从保存文件的位置运行以下命令。

kubectl apply -f product-service-deployment.yaml

这将在运行容器内的应用程序的集群中创建一个Pod。 现在,此应用程序正在kube集群中的pod内运行,并已分配了IP地址,该IP地址只能从集群内部访问。 我们可以使用此IP地址从群集内部访问此容器,但是由于容器是易变的(可以按比例放大和缩小,重新创建和销毁),我们将需要一个接口或服务来通过“服务名称”进行访问重新创建广告连播时,该设置不会更改。 该“服务”还将充当负载平衡器,用于将请求分发到Pod。

创建一个Kubernetes服务: 现在,我们将在Kubernetes中创建一个可用于访问Pod的服务。 在此处阅读有关Kubernetes服务的更多信息。 对于此博客,我们将创建“ ClusterIP”类型的服务,该服务可从群集访问。 在名称为product-service.yaml的同一根文件夹中创建一个文件,其内容如下:

apiVersion: v1  kind: Service  metadata: 
   name: product-service  spec: 
   selector: 
     app: product-service 
   ports: 
   - port: 8001 
     targetPort: 8001

要创建此服务,请运行以下命令:

kubectl apply -f product-service.yaml

运行kubectl get services命令以查看服务是否成功创建:

kubectl get svc

您应该在其中看到带有分配的ClusterIP的服务“ product-service”。

从笔记本电脑访问该服务。 要从我们的笔记本电脑访问此服务,我们将使用称为“ kube端口转发”的命令,运行以下命令:

kubectl port-forward svc /product-service 8001:8001

现在,我们可以使用http:// localhost:8001 / products访问该服务。

您可以通过创建一些产品并检索它们来测试产品服务,如上一个博客所述。

因此,现在我们的应用程序在本地kube集群中运行。 在下一系列博客中,我们将使用外部数据库将更多的应用程序部署到集群中,并具有功能齐全的微服务应用程序。 我们还将学习内部服务如何相互通信以及如何使用Ingress Controller将其暴露给外部世界。

翻译自: https://www.javacodegeeks.com/2019/11/spring-boot-microservices-docker-and-kubernetes-workshop-part3.html