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.mzph.cn/news/752350.shtml

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

相关文章

数据结构试卷第九套

1.时间复杂度 2.树,森林,二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线;去线,只保留当前根节点与第一个叶子节点的连线,删除它与其他节点之间的连线;然后根据左孩子右兄弟进行调整&#xf…

个人网站制作 Part 11 添加用户权限管理 | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加用户权限管理🔨使用Passport.js🔧步骤 1: 修改Passport本地策略 🔨修改用户模型🔧步骤 2: 修改用户模型 &#x1f528…

医学数据分析中缺失值的处理方法

医学数据分析中缺失值的处理方法 (为了更好的展示,在和鲸社区使用代码进行展示) 医学数据分析中,缺失值是不可避免的问题。缺失值的存在会影响数据的完整性和准确性,进而影响分析结果的可靠性。因此,在进…

中创ET4410台式电桥固件升级工具(修复了列表扫描的BUG)

中创ET4410台式LCR数字电桥固件升级工具和最新版固件(修复了列表扫描的BUG) 中创ET4410 台式LCR数字电桥 简单开箱测评:https://blog.zeruns.tech/archives/763.html 之前买的中创ET4410台式LCR数字电桥固件有BUG(胜利的VC4090C…

FREERTOS中断配置和临界段

本文基础内容参考的是正点原子的FREERTOS课程。 这是基于HAL库的 正点原子手把手教你学FreeRTOS实时系统 这是基于标准库的 正点原子FreeRTOS手把手教学-基于STM32 回顾STM32的中断 什么是中断? 中断优先级分组设置 Freertos中断分组 Freertos就是用的最后一种&…

redis学习-redis介绍

目录 1.redis介绍 2.redis常用命令(可以在官网的命令中查看redis的所有命令) 2.1终端命令 2.2 redis通用命令 2.3五大基本类型的命令以及特殊情况分析 (导航) 3.事务 4. redis实现消息订阅 5. redis的两种持久化策略 …

KubeSphere集群安装-nfs分布式文件共享-对接Harbor-对接阿里云镜像仓库-遇到踩坑记录

KubeSphere安装和使用集群版 官网:https://www.kubesphere.io/zh/ 使用 KubeKey 内置 HAproxy 创建高可用集群:https://www.kubesphere.io/zh/docs/v3.3/installing-on-linux/high-availability-configurations/internal-ha-configuration/ 特别注意 安装前注意必须把当前使…

AG32 MCU以太网应用实例demo

一. 前言 AGM32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设,以及兼容的引脚和功能。AG32F407系列产品具有卓越的品质,稳定性和卓越的价格价值。 AG32产品线支持其所有接口外设尽可能接近主流兼容性,并提供丰富的参考设计…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20&#xff05;&#xff08;就是电池没有报废&#xff09;且电脑接好电源&#xff0c;千万别断电&#xff0c;电脑会变成砖头的 解决办法 更新bios即可解决&#xff0c;去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊

传统机器学习 基于TF_IDF的文本聚类实现

简介 使用sklearn基于TF_IDF算法&#xff0c;实现把文本变成向量。再使用sklearn的kmeans聚类算法进行文本聚类。 个人观点&#xff1a;这是比较古老的技术了&#xff0c;文本转向量的效果不如如今的 text2vec 文本转向量好。 而且sklearn 不支持GPU加速&#xff0c;处理大量…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

备战蓝桥杯Day26 - 二叉搜索树查询和删除操作

一、查询 递归查询 寻找的值比根节点大&#xff0c;遍历右子树&#xff1b; 寻找的值比根节点小&#xff0c;遍历左子树。 def qurey(self, node, val):if not node: # 没有节点&#xff0c;返回空return Noneif node.data < val:return self.qurey(node.rchild, val)el…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

C++第六弹---类与对象(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、类的6个默认成员函数 2、构造函数 2.1、概念 2.2、特性 3、析构函数 3.1、概念 3.2、特性 3.3、调用顺序 总结 1、类的6个默认成员函数…

QT UI窗口常见操作

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget) {ui->setupUi(this);// 设置主窗口背景颜色QPalette plt;plt.setColor(QPalette::Window,QColor(180,220,130));this->setPalette(plt);// 禁止窗口最大化按钮setWindowFlags(windowF…

Spring Boot Starter: 快速简明地创建Spring应用

Spring Boot Starter是Spring Boot的核心功能之一&#xff0c;它帮助开发人员快速简明地创建、配置和运行Spring应用。在本文中&#xff0c;我们将详细介绍Spring Boot Starter以及如何使用它创建一个Spring Boot应用。 文章目录 什么是Spring Boot Starter?为何使用Spring B…

DevOps 环境预测测试中的机器学习

在当今快节奏的技术世界中&#xff0c;DevOps 已成为软件开发不可或缺的一部分。它强调协作、自动化、持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;&#xff0c;以提高软件部署的速度和质量。预测测试是这一领域的关键组成部分&#xff0c;其中机器…

Transformer的前世今生 day02(神经网络语言模型

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 以下为预备概念 感知机 线性模型可以用下图来表示&#xff1a;输入经过线性层得到输出 线性层 / 全连接层 / 稠密层&#xff1a;假…

爬虫的去重

去重基本原理 爬虫中什么业务需要使用去重 防止发出重复的请求防止存储重复的数据 在爬取网页数据时&#xff0c;避免对同一URL发起重复的请求&#xff0c;这样可以减少不必要的网络流量和服务器压力&#xff0c;提高爬虫的效率&#xff0c;在将爬取到的数据存储到数据库或其…