Helm Chart部署最简SpringBoot到K8S(AWS EKS版)

目标

这里假设,我们已经基本会使用k8s的kubectl命令进行部署了,也已经会自己打docker镜像推送到AWS ECR上面去了。而且,已经在云上准备好了AWS ECR镜像库和AWS EKS的k8s集群了。
这个前提上面,我们今天使用Helm Chart项目准备k8s的yaml配置文件来部署一个最简单的Springboot项目到AWS的k8s集群。

Helm项目结构

.
└── my-kubernetes-app├── configmaps├── crons├── deployments├── hpas├── pdbs├── podpriorities├── pvcs├── services├── statefulsets└── ...

上面这个是网上一位工友总结出来的Helm Chart目录结构。在这之前,还是先了解了解Helm是干什么的吧?Helm自身定位是给k8s的包管理器,但是,他的Helm Chart项目被我们现在这里用于管理生成k8s配置模板,来生成不同环境的k8s yaml配置文件。简单来说,Helm Chart就是一个根据模板生成配置文件的工具。
下面是我这次用的Helm目录结构:

./
├── Chart.yaml
├── templates
│   ├── configmaps
│   │   ├── demo.yaml
│   │   └── demo2.yaml
│   ├── ingress.yaml
│   ├── secrets
│   │   └── mysql.yaml
│   └── services
│       ├── demo.yaml
│       └── demo2.yaml
├── values-prod.yaml
├── values-uat.yaml
└── values.yaml

这里只有简单的secrets和services的简单文件夹划分。我这里只做java层面的拆分,数据库共用一个,嗯,我这里是属于伪微服务了。如果要进一步拆分的话,就像上面那位道友那样,把deployments从services里面统统拆出来。我这里是最简形态,比较原始的项目状态,后期,可以在这个基础上面加hpa。算了,精力有限,就先演化到这样吧!
这里我是先使用helm create命令,创建出一个超简单的helm项目的,具体命令如下:

helm create mychart

然后,在这个基础上面逐渐演化到上面那个secrets和services,ingress样子。

Chart.yaml

apiVersion: v2
name: my-demo
description: my-demo# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"

这里是Helm Chart基本信息。

values.yaml

ingress:security:groups: cloudfront-only
services:demo:name: demoport: 8080path: /api/demohealth:path: /actuator/healthport: 8081demo2:name: demo2port: 8080path: /api/demo2health:path: /actuator/healthport: 8081

这里设置了ingress的安全组,这个cloudfront-only安全组,主要设置alb主要接收来自cloudfront的流量。这里业务服务的名称,端口,前缀路径,以及健康检查的路径和端口。

values-uat.yaml

replicas: 1
spring:profiles:active: uat
mysql:config:name: mysqlHOST: xxxx-uat.xxxxx.us-east-1.rds.amazonaws.comDB_USERNAME: bXl1c2VybmFtZQ==DB_PASSWORD: bXlwYXNzd29yZA==
docker:services:demo:images: xxxxxxx.dkr.ecr.us-east-1.amazonaws.com/demo:latestname: demodemo2:images: xxxxxxx.dkr.ecr.us-east-1.amazonaws.com/demo2:latestname: demo2

这里主要是针对uat环境的设置,主要就是副本数,spring,mysql和docker镜像的配置。

templates/ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: {{ .Chart.Name }}-ingressnamespace: {{ .Release.Namespace }}annotations:alb.ingress.kubernetes.io/load-balancer-name: {{ .Chart.Name }}-ingressalb.ingress.kubernetes.io/security-groups: {{ .Values.ingress.security.groups }}alb.ingress.kubernetes.io/manage-backend-security-group-rules: "true"alb.ingress.kubernetes.io/scheme: internet-facingalb.ingress.kubernetes.io/target-type: ip
spec:ingressClassName: albrules:- http:paths:- backend:service:name: {{ .Values.services.demo.name }}port:number: {{ .Values.services.demo.port }}path: {{ .Values.services.demo.path }}pathType: Prefix

这里主要就是k8s的ingress配置,主要就是alb配置和具体服务的网关配置。

templates/secrets/mysql.yaml

apiVersion: v1
data:DB_USERNAME: {{ .Values.mysql.DB_USERNAME }}DB_PASSWORD: {{ .Values.mysql.DB_PASSWORD }}
kind: Secret
metadata:name: {{ .Values.mysql.config.name }}-secretnamespace: {{ .Release.Namespace }}

这里是mysql的secrets配置。

templates/services/demo.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: {{ .Values.services.demo.name }}name: {{ .Values.services.demo.name }}namespace: {{ .Release.Namespace }}
spec:replicas: {{ .Values.replicas }}selector:matchLabels:app: {{ .Values.services.demo.name }}template:metadata:labels:app: {{ .Values.services.demo.name }}spec:containers:- image: {{ .Values.docker.services.demo.images }}name: {{ .Values.docker.services.demo.name }}envFrom:- secretRef:name: {{ .Values.mysql.config.name }}-secret- configMapRef:name: {{ .Values.services.demo.name }}-configmap
#          resources:
#            requests:
#              memory: "2Gi"
#              cpu: "2"
#            limits:
#              memory: "2Gi"
#              cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: {{ .Values.services.demo.health.path }}port: {{ .Values.services.demo.health.port }}# 活力检查,不通过时重启容器livenessProbe:httpGet:path: {{ .Values.services.demo.health.path }}port: {{ .Values.services.demo.health.port }}
---
apiVersion: v1
kind: Service
metadata:labels:app: demoname: {{ .Values.services.demo.name }}namespace: {{ .Release.Namespace }}annotations:alb.ingress.kubernetes.io/healthcheck-path: {{ .Values.services.demo.health.path }}alb.ingress.kubernetes.io/healthcheck-port: '{{ .Values.services.demo.health.port }}'
spec:ports:- name: httpport: {{ .Values.services.demo.port }}targetPort: {{ .Values.services.demo.port }}selector:app: {{ .Values.services.demo.name }}type: ClusterIP

这里主要配置了demo服务的Deployment和Service配置。

templates/services/demo2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: {{ .Values.services.demo2.name }}name: {{ .Values.services.demo2.name }}namespace: {{ .Release.Namespace }}
spec:replicas: {{ .Values.replicas }}selector:matchLabels:app: {{ .Values.services.demo2.name }}template:metadata:labels:app: {{ .Values.services.demo2.name }}spec:containers:- image: {{ .Values.docker.services.demo2.images }}name: {{ .Values.docker.services.demo2.name }}envFrom:- secretRef:name: {{ .Values.mysql.config.name }}-secret- configMapRef:name: {{ .Values.services.demo2.name }}-configmap
#          resources:
#            requests:
#              memory: "2Gi"
#              cpu: "2"
#            limits:
#              memory: "2Gi"
#              cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: {{ .Values.services.demo2.health.path }}port: {{ .Values.services.demo2.health.port }}# 活力检查,不通过时重启容器livenessProbe:httpGet:path: {{ .Values.services.demo2.health.path }}port: {{ .Values.services.demo2.health.port }}
---
apiVersion: v1
kind: Service
metadata:labels:app: {{ .Values.services.demo2.name }}name: {{ .Values.services.demo2.name }}namespace: {{ .Release.Namespace }}annotations:alb.ingress.kubernetes.io/healthcheck-path: {{ .Values.services.demo2.health.path }}alb.ingress.kubernetes.io/healthcheck-port: '{{ .Values.services.demo2.health.port }}'
spec:ports:- name: httpport: {{ .Values.services.demo2.port }}targetPort: {{ .Values.services.demo2.port }}selector:app: {{ .Values.services.demo2.name }}type: ClusterIP

configmaps/demo.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Values.services.demo.name }}-configmapnamespace: {{ .Release.Namespace }}
data:SPRING_PROFILES_ACTIVE: {{ .Values.spring.profiles.active }}MYSQL_HOST: {{ .Values.mysql.HOST }}

configmaps/demo2.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Values.services.demo2.name }}-configmapnamespace: {{ .Release.Namespace }}
data:SPRING_PROFILES_ACTIVE: {{ .Values.spring.profiles.active }}MYSQL_HOST: {{ .Values.mysql.HOST }}

Helm部署

 helm install -f ./values-uat.yaml my-demo ./ -n my-demo --create-namespace

输出例子:

NAME: my-demo
LAST DEPLOYED: Thu Mar 14 15:19:53 2024
NAMESPACE: my-demo
STATUS: deployed
REVISION: 1
TEST SUITE: None

Helm检查部署

helm ls -n my-demo

结果如下:

NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
my-demo          my-demo         1               2024-03-14 15:19:53.658731 +0800 CST    deployed        my-demo-0.1.0 1.16.0

kubectl检查

# 检查ingress网关
kubectl get ingress -n my-demo
# 检查svc
kubectl get svc -n my-demo
# 检查deploy
kubectl get deploy -n my-demo
# 检查pods
kubectl get pods -n my-demo

页面检查

这里不涉及cloudfront与alb的配置,这里我们直接通过cloudfront检查我们部署的效果,具体效果如下:
页面检查

总结

这里主要介绍Helm Chart项目来编写k8s配置文件的项目。哎!现在运维都有要写这么多代码了。
源代码:https://github.com/fxtxz2/helm-chart-demo

参考

  • Developer’s Guide to Writing a Good Helm Chart

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问了 Gemini 1.5 Pro 五个问题,找到了初遇ChatGPT的感觉

一个月前(2月15日),Sora和 Gemini 1.5 同时推出,这个故事很多人都听过了,Google 被冠以 AI 界汪峰的名头。 人们纷纷震惊于 Sora 的强大,讨论 Sora 是不是世界模型。而 Gemini 1.5 的第一个模型 Gemini 1.…

redis发布订阅与stream类型

发布订阅 redis发布订阅(pub/sub)是一种消息通信模式;发送者(pub)发送消息,订阅者(sub)接收消息。redis客户端可以订阅任意数量的频道。 基础命令: 语法 redis publish命令基本语法如下: redis 127.0.0.1:6379> PUBLISH ch…

unity学习(61)——hierarchy和scene的全新认识+模型+皮肤+动画controller

刚刚开始,但又结束的感觉? 1.对hierarchy和scene中的内容有了全新的认识 一定要清楚自己写过几个scene;每个scene之间如何跳转;build setting是add当前的scene。 2.此时的相机需要与模型同级,不能在把模型放在相机下…

STM32输入捕获模式测频率

STM32频率的测量:高频适合使用的方法是测频法,低频适合使用的是测周法,(其中使用测频法测量频率比较稳定,使用测周法测量频率的方式没有这么稳定,因为测周法只会通过一次的测量就能得出结果所以测试出来的频…

WPF监控平台(科技大屏)[一]

跟着B站的视频敲了一个略微复杂的WPF界面,链接如下.在这里我详细的写一份博客进行设计总结. 系统介绍和配置及主窗口设计_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Wy421Y7QD?p1&vd_source4796b18a2e4c1ec8a310391a5644b6da 成果展示 实现过程 总体来说,我的…

Python程序设计基础——代码习题

1 __name__属性 import demodef main():if __name__ __main__:print(这个程序被直接运行。)elif __name__demo:print(这个程序作为模块被使用。) main()3.3 编写程序,生成包含1000个0~100之间的随机整数,并统计每个元素出现的次数。 import randomx[r…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞(2024年3月发布)

漏洞简介 某赛通电子文档安全管理系统 DecryptApplication 接口处任意文件读取漏洞,未经身份验证的攻击者利用此漏洞获取系统内部敏感文件信息,导致系统处于极不安全的状态。 漏洞等级高危影响版本*漏洞类型任意文件读取影响范围>1W 产品简介 …

Orbit 使用指南 03 | 与刚体交互 | Isaac Sim | Omniverse

如是我闻: “在之前的指南中,我们讨论了独立脚本( standalone script)的基本工作原理以及如何在模拟器中生成不同的对象(prims)。在指南03中,我们将展示如何创建并与刚体进行交互。为此&#xf…

Jmeter+ant,ant安装与配置

1.ant含义 ant:Ant翻译过来是蚂蚁的意思,在我们做接口测试的时候,是可以用来做JMeter接口测试生成测试报告的工具 2.ant下载 下载地址:Apache Ant - Ant Manual Distributions download中选择ant 下载安装最新版zip文件 3.…

解决分布式事务,Seata真香!

年IT寒冬,大厂都裁员或者准备裁员,作为开猿节流主要目标之一,我们更应该时刻保持竞争力。为了抱团取暖,林老师开通了《知识星球》,并邀请我阿里、快手、腾讯等的朋友加入,分享八股文、项目经验、管理经验等…

4、设计模式之建造者模式(Builder)

一、什么是建造者模式 建造者模式是一种创建型设计模式,也叫生成器模式。 定义:封装一个复杂对象构造过程,并允许按步骤构造。 解释:就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单对象组合起来…

Linux字符设备驱动开发一

linux字符设备驱动 0 驱动介绍1 字符设备驱动1.1 字符设备相关概念和结构体1.2 实现简单的字符设备模块1.3 创建字符设备1.4 总结 应用程序调用文件系统的API(open、close、read、write) -> 文件系统根据访问的设备类型,调用对应设备的驱动API -> 驱动对硬件进…

面试经典150题——随机链表的复制

​前两天断更了两天有点事情🤗 1. 题目描述 2. 题目分析与解析 2.1 思路一 开始还是没什么思路,没思路那就先把题目解决不管方法的好坏。如果不考虑复杂度,该怎么解决? 可以有这样的一种思路: 首先复制链表的所有节…

记OnlyOffice的两个大坑

开发版,容器部署,试用许可已安装。 word,ppt,excel均能正常浏览。 自带的下载菜单按钮能用。 但config里自定义的downloadAs方法却不一而足。 word能正常下载,excel和ppt都不行。 仔细比对调试了代码。发现app.js…

fetch,前端 面试题

Fetch Fetch API 是近年来被提及将要取代XHR的技术新标准,是一个 HTML5 的 API。 基于promise的设计,返回的是Promise对象 fetch()采用模块化设计,API 分散在多个对象上(Response 对象、Request 对象、Headers 对象)…

Java双非大二找实习记录

先说结论:2.22→3.6线上线下面了七家,最后oc两家小公司,接了其中一个。 本人bg: 真名不经传双非一本,无绩点无竞赛无奖项无实习,23年12月开始学java。若非要说一点相关的经历,就是有java基础&…

新手向-从VNCTF2024的一道题学习QEMU Escape

[F] 说在前面 本文的草稿是边打边学边写出来的,文章思路会与一个“刚打完用户态 pwn 题就去打 QEMU Escape ”的人的思路相似,在分析结束以后我又在部分比较模糊的地方加入了一些补充,因此阅读起来可能会相对轻松(当然也不排除这是…

Hadoop大数据应用:NFS网关 连接 HDFS集群

目录 一、实验 1.环境 2.NFS网关 连接 HDFS集群 3. NFS客户端挂载HDFS文件系统 二、问题 1.关闭服务报错 2.rsync 同步报错 3. mount挂载有哪些参数 一、实验 1.环境 (1)主机 表1 主机 主机架构软件版本IP备注hadoop NameNode (…

Ubuntu 20.04 系统如何优雅地安装NCL?

一、什么是NCL? NCAR Command Language(NCL)是由美国大气研究中心(NCAR)推出的一款用于科学数据计算和可视化的免费软件。 它有着非常强大的文件输入和输出功能,可读写netCDF-3、netCDF-4 classic、HDF4、b…

【遍历方法】浅析Java中字符串、数组、集合的遍历

目录 前言 字符串篇 1.1 使用 for 循环和 charAt 方法 1.2 使用增强 for 循环(forEach 循环) 1.3 使用 Java 8 的 Stream API 最终效果 数组篇 2.1 使用普通 for 循环 2.2 使用增强型 for 循环( forEach 循环) 2.3 使用 Arrays.asList 和 forE…