部署springboot项目到GKE(Google Kubernetes Engine)

GKE是 Google Cloud Platform 提供的托管 Kubernetes 服务,允许用户在 Google 的基础设施上部署、管理和扩展容器。本文介绍如何部署一个简单的springboot项目到GKE.

本文使用podman.

如果你用的是docker, 只需要把本文中所有命令中的podman替换成docker即可

  1. 非Helm部署方式
    准备工作: 在springboot项目路径下,新增3个文件:deployment.yaml,service.yaml,Dockerfile:
    结构如下:
    在这里插入图片描述
    deployment.yaml, 注意文件里的image地址,由后续podman push image gcr.io后得到
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
        - name: springboot-app
          image: gcr.io/xxxx/yyyy/springboot-app@sha256:3725a57f9cd0b6fb63eb91e49c2305a6b684abd129f3f075838a80b54472455c
          ports:
            - containerPort: 8080

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: springboot-app-service
spec:
  type: LoadBalancer
  selector:
    app: springboot-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Dockerfile

# 使用Amazon Corretto 17作为构建环境
FROM amazoncorretto:17 as build
WORKDIR /workspace/app

# 复制Maven Wrapper和其他构建文件
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

# 使用Maven Wrapper进行构建,跳过测试
RUN ./mvnw install -DskipTests

# 使用Amazon Corretto 17作为生产环境
FROM amazoncorretto:17
VOLUME /tmp
ARG JAR_FILE=/workspace/app/target/*.jar
COPY --from=build ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

podman build -t gcr.io/xxxx/yyyy/springboot-app:v1 .
podman push gcr.io/xxxx/yyyy/springboot-app:v1
会生成如下路径
在这里插入图片描述

kubectl apply -f deployment.yaml -n infra --使用这个命令之前,先修改一下image的地址。
kubectl apply -f service.yaml -n infra
ok啦,此时你应该可以访问你的应用了。

  1. Helm部署方式

a. helm create spacex-chart -n infra
生成的chart目录结构如下:
在这里插入图片描述

关于values的优先级:
命令行参数或自定义 values.yaml > 集群中存储的值 > Chart 的默认 values.yaml
可以用这个命令查看生成的k8s组件是否符合你的预期。

helm template spacex-chart ./spacex-chart
--values=./spacex-chart/values.yaml > generated_boot.yaml

b. 修改一些文件,修改过的文件如下: 另外还移除了service-account等一些不必要的文件
values.yaml

# Default values for spacex-chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: gcr.io/ebay-mag/kubein/springboot-app
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "v1.1"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

service:
  type: LoadBalancer
  port: 80
  targetPort: 8080

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 2
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "spacex-chart.fullname" . }}
  labels:
    {{- include "spacex-chart.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "spacex-chart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "spacex-chart.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ include "spacex-chart.fullname" . }}
  labels:
    {{- include "spacex-chart.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.targetPort }}
      protocol: TCP
      name: http
  selector:
    {{- include "spacex-chart.selectorLabels" . | nindent 4 }}

c. 安装 helm install boot-chart-release-001 spacex-chart -n infra
命令解释 helm install [release-name] [chart-name] -n infra,此时我们用helm ls可以查看安装chart后的一些对应关系
在这里插入图片描述
ok, 此时应用已经部署到GKE中了,你可以通过ip访问你的应用了。Happy Helming!

安装完后,如果发现需要修改values.yaml里面的值.在修改完values.yaml文件后,用如下命令更新。
helm upgrade boot-chart-release-001 spacex-chart -f spacex-chart/values.yaml -n infra
查看更新后的值
helm get values boot-chart-release-001 -n infra

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/225881.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工作中的疑难杂症(编译ninja failed with: exit status 137)

问题:先来看报错提示 起初出现这个问题我就搜索了一下,大家都说。 此问题是因为asop/build/soong/java/config/config.go文件内定义了pctx.StaticVariable("JavacHeapSize", "2048M"),javaheap的大小与ubuntu18系统的内…

网络通信的流程,浏览器地址?

1.没有交换机的通信 在一个机房内,有两台电脑相互需要通信 假设现在有三台电脑: 随着电脑的增加,线的数量也在增加,因此显得很臃肿,次数交换机诞生,很好的解决了这一方面, 交换机不需要进行多条线的连接: 通过给设备分配,ip地址来实现局域网…

C语言内存函数讲解

目录 文章目录 内存函数针对的数据类型不确定可能是整型数据,字符数据,结构体数据...... memcpy的使用和模拟实现 memcpy的使用 memcpy打印字符数据 memcpy打印整型数据 memcpy的模拟实现 模拟实现的memcpy打印重叠情境 memmove的使用和模拟实现 memm…

【HarmonyOS开发】DevEco Studio安装及其配置

目录 前言下载工具准备开始安装配置开始新建一个项目 前言 DevEco Studio是一款用于开发HarmonyOS应用的集成开发环境,在安装DevEco Studio的时候,可能会在安装或者配置的时候出现各种各样的小问题,在此做下记录。 下载工具准备 官网下载地…

详解线段树

前段时间写过一篇关于树状数组的博客树状数组,今天我们要介绍的是线段树,线段树比树状数组中的应用场景更加的广泛。这些问题也是在leetcode 11月的每日一题频繁遇到的问题,实际上线段树就和红黑树 、堆一样是一类模板,但是标准库…

cocos creator “TypeError: Cannot set property ‘string‘ of null

背景: 学习cocos creator时遇到"TypeError: Cannot set property string of null" 错误。具体代码如下:property({ type: Label })public stepsLabel: Label | null null;update(deltaTime: number) {this.stepsLabel.string Math.floor(…

uniapp实战 —— 猜你喜欢(含滚动触底分页加载)

效果预览 组件封装 src\components\SUI_Guess.vue <script setup lang"ts"> import { ref, onMounted } from vue import type { GuessItem } from /types/index import { getGuessListAPI } from /apis/index import type { PageParams } from /types/global…

Vue实现注册页面的用户交互

&#x1f4d1;前言 本文主要是【Vue】——Vue实现注册页面的用户交互的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每…

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统&#xff08;SOPC&#xff09;的设计 在进行系统设计时&#xff0c;倘若系统非常复杂&#xff0c;采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式&#xff0c;工作量无疑是巨大的&#xff0c;这时调用 MicroBlaze 软核…

春风十里不如你——掌握Spring Boot的常用关键注解

引言 在Java的世界里&#xff0c;Spring Boot以其简化的配置和开箱即用的特性&#xff0c;成为了构建现代微服务和企业级应用的首选框架。Spring Boot的注解是这一切的核心。在本文中&#xff0c;我们将深入探讨最常用的Spring Boot注解&#xff0c;帮助你轻松驾驭Spring Boot…

simulink merge模块使用案例分析

作用&#xff1a;汇总多个信号分支&#xff0c;但最终可根据用户设定条件选择某路分支输出 Enabled Subsystem3 Enabled Subsystem2 分析&#xff1a;可以看到&#xff0c;在1s时刻输出 Enabled Subsystem2的1&#xff0c;在2s时刻输出 Enabled Subsystem3的2。 为方便理解&a…

私域最全养号攻略---微信

微信号的使用规则&#xff1a; 注册新微信、微信实名认证、主动添加好友、面对面建群、被动添加好友、进群限制、朋友圈限制、好友上限 微信权重加分规则&#xff1a; 基础信息是否完整、注册时间、微信使用行为、 微信权重扣分规则&#xff1a; 使用的环境是否正常、部分行为会…

GAN:WGAN

论文&#xff1a;https://arxiv.org/pdf/1701.07875.pdf 发表&#xff1a;2017 WGAN 算法流程 从GAN 到 WGAN 的转变 相比于原始 GAN&#xff0c;WGAN 只需要修改以下几点&#xff0c;就能使得训练更稳定&#xff0c;生成质量更高&#xff1a; 1. 此时的判别器相当于做回归…

JavaSE语法之五:数组的定义与使用(超详解!!!)

文章目录 一、数组的概念1. 什么是数组2. 数组的创建及初始化3. 数组的使用3.1 数组中元素的访问3.2 遍历数组 二、数组是引用类型1. 初始JVM的内存分布2. 基本类型变量与引用变量的区别3. 引用变量4. 认识null 三、数组的应用场景1. 保存数据2. 作为函数的参数2.1 参数传基本类…

2023年淘宝年终好价节精选红包怎么领取?

2023年淘宝年终好价节精选红包怎么领取? 2023年淘宝双十二改名为了年终好价节&#xff0c;活动力度也提升了&#xff0c;不仅有官方立减和跨店满减&#xff0c;还有精选红包可领。那么&#xff0c;2023年淘宝年终好价节精选红包怎么领取?下面小编就给大家介绍下&#xff0c;赶…

教程篇(7.2) 01. 介绍和初始访问 ❀ FortiAnalyzer分析师 ❀ Fortinet 网络安全专家 NSE5

在本课中&#xff0c;你将了解FortiAnalyzer的关键功能和概念&#xff0c;以及如何最初访问FortiAnalyzer。 FortiAnalyzer将日志记录、分析和报告集成到一个系统中&#xff0c;因此你可以快速识别和响应。 在本课中&#xff0c;你将探索上图显示的主题。 通过展示FortiAnalyze…

种下一棵栀子花

女孩说自己是男孩当年伸手就可触及的栀子花.男孩沉默了,明白了当初失去了什么. 时光倒流,13年前的一个夏天夜晚,男孩与女孩同在沪城,女孩分享了自己的照片给男孩.男孩站在窗前,那晚的夜空很美丽,仿佛托着那个白衣裳女孩的纯真的梦,来到了自己的身边. 女孩说彼此间只是少了一个深…

Linux---日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志管理简介 工作当中的日志&#xff0c;特指硬件和软件的日志&#xff0c;管理员可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。日志管理包括管理系统日志、应…

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…

如何通过内网穿透实现无公网IP也能远程访问内网的宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…