在之前的文章中,我们为使用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集群中部署应用程序:
现在,我们已经成功创建了一个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