只需五步,将Spring Boot服务迁移到Kubernetes

只需五步,将Spring Boot服务迁移到Kubernetes

作者:学研妹 2023-09-21 22:50:15

开源

云原生 如果预算有限,想以低成本获得弹性Beanstalk的所有好处,可以使用Kubernetes,并且它是开源的!

当许多Java开发人员使用Spring框架来快速创建Web服务,但是其在生产环境中运行可能是个比较大的挑战,因为有很多运行方式和云提供商。当然您可以使用像AWS Elastic Beanstalk这样的服务来保持其运行,实现自动缩放、零停机部署、无需部署新版本的基础设施经验等等。但是,这些服务对于预算较低的人来说会花费很多钱,同时失去对服务基础设施的控制。

如果预算有限,想以低成本获得弹性Beanstalk的所有好处,可以使用Kubernetes,并且它是开源的!

1. 生成Docker镜像

Kubernetes是一个容器编排平台,它可以自动化地部署、扩展和管理容器化应用程序。Kubernetes的工作原理是这样的:您可以从应用程序创建Docker镜像,并“告诉”Kubernetes启动您创建的一个或多个镜像实例。然后,Kubernetes会自动将这些实例分配给可用的节点,并确保它们始终处于运行状态。如果有节点失败或需要扩展应用程序,则Kubernetes会自动重新分配实例,以确保应用程序始终处于可用状态。因此,我们的第一步是从Spring Boot服务创建一个镜像。

以下一个Dockerfile示例:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
MAINTAINER Samuel Birocchi <[email protected]>
ADD target/*.jar app.jar
COPY newrelic newrelic

ENV JAVA_OPTS=""
ENV SPRING_PROFILE="default"
ENV MONGO_PASSWORD=""

ENTRYPOINT exec java $JAVA_OPTS \
 -javaagent:newrelic/newrelic.jar \
 -Djava.security.egd=file:/dev/./urandom \
 -Dspring.profiles.active=$SPRING_PROFILE \
 -Dmongo.password=$MONGO_PASSWORD \
 -jar app.jar

有了这个和docker build插件,我们可以运行gradle clean buildDocker(或使用maven docker插件)来构建docker镜像。请注意,它将创建一个带有gradle.properties或build.gradle上配置的版本标签的映像。

2. 创建部署和Pods

现在要将创建好的镜像放在Kubernetes上,我们需要将其上传到注册表中。我们可以上传到公共docker注册表,但是该映像将对每个人都可用!由于我们的服务是私有的,因此我们需要上传到私有注册表。幸运的是,Gcloud为您的帐户提供了私有注册表。

这样一来,就可以最终将服务放在Kubernetes集群上了!由于正在使用Gcloud,因此使用GKE创建集群非常容易,请按照本教程进行操作。创建集群后,配置命令行连接它后,需要为应用程序创建部署(或复制控制器)以实现可扩展性。使用以下配置作为初始配置:

apiVersion: apps/v1beta1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: spring-boot-deployment
spec:
  selector:
    matchLabels:
      app: spring-boot-app
  replicas: 3 # tells deployment to run 3 pods matching the template
  template: # create pods using pod definition in this template
    metadata:
      labels:
        app: spring-boot-app
    spec:
      containers:
      - name: spring-boot-app
        image: #your image name here
        ports:
        - containerPort: 8080
          name: server
        - containerPort: 8081
          name: management

考虑到在最后一步中配置了Kubernetes命令行界面(kubectl),因此我们可以使用kubectl apply -f Deployment.yml为Kubernetes集群创建一个新的部署,并使用此配置。过一段时间后,您可以使用kubectl get deployment spring-boot-deployment检查部署的状态,并使用kubectl get pods spring-boot-app检查pod的状态。如果要检查pod的日志,则可以使用kubectl log命令。

3. 使用服务公开我们的Pods

现在,我们的Pod正在运行,需要创建一个服务来将Pod公开。使用下配置创建服务:

apiVersion: v1
kind: Service
metadata:
  name: spring-boot-service
spec:
  ports:
  - port: 8080
    targetPort: 8080
    name: http
  - port: 8081
    targetPort: 8081
    name: management
  selector:
    app: spring-boot-app
  type: NodePort

正如所看到的,服务配置非常简单。但是,此配置未公开。我们可以将服务类型设置为LoadBalancer,因为gcloud会自动为我们的服务创建真正的负载均衡器和外部IP。实际上尝试使用此配置我们无法正确设置TLS和HTTPS,我们希望服务仅通过HTTPS协议访问。但是该怎么做呢?

4. 使用Ingress进行路由

可以找到Kubernetes Ingress来使用。它是一个较新的功能,但非常有效。它几乎像一个类型为LoadBalancer的服务,但您可以设置自定义路由规则。下面是Ingress配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: spring-boot-ingress
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: your-tls-secret
  backend:
    serviceName: spring-boot-service
    servicePort: 8080

正如所看到的,我们将入口设置为仅允许使用kubernetes.io/ingress.allow-http:”false”进行HTTPS连接。但是,您会发现此文件中有TLS配置。我们需要首先创建一个Secret,其中包含用于Ingress访问的ssl证书数据。使用下文配置即可完成此操作。

5. Secrets

apiVersion: v1
data:
  tls.crt: #base64 hash of your cert
  tls.key: #base64 hash of your key
kind: Secret
metadata:
  name: your-tls-secret
  namespace: default
type: Opaque

应用所有配置后,我们可以使用 kubectl get ingress spring-boot-ingress 命令检查应用程序的外部 IP。通过 HTTPS 访问,我们的 Spring Boot 应用程序就运行在 Kubernetes 集群上了!

重要!Kubernetes服务对默认pod端口和端点“/”执行健康检查。如果您没有映射该端点或者它受到保护,则需要加入livenessProbe和readinessProbe配置。

建议在部署到生产之前使用minikube测试这些设置,以便您熟悉Kubernetes环境。

要部署新版本,请使用kubectl set image deployment/spring-boot-deployment spring-boot-app=your-new-image或仅使用kubectl edit deployment spring-boot-deployment编辑配置。使用第二个命令,您可以同时更新图像和Pod的数量。如果您只想扩展应用程序,请运行kubectl scale deployment spring-boot-deployment –replicas=10或创建自动缩放配置。

更新部署会导致Kubernetes滚动更新,无需停机,因为它会处理所有内容,您只需坐下来放松即可。将基础架构更改为GKE后,可以减少关注应用程序的健康状况,更多地关注开发。Kubernetes非常易于与CI工具(如Jenkins、GitLab CI、BitBucket Pipelines等)一起使用。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/244790.html<

(0)
运维的头像运维
上一篇2025-04-25 21:35
下一篇 2025-04-25 21:36

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注