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

news2024/9/27 12:08:09

目标

这里假设,我们已经基本会使用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: demo
    port: 8080
    path: /api/demo
    health:
      path: /actuator/health
      port: 8081
  demo2:
    name: demo2
    port: 8080
    path: /api/demo2
    health:
      path: /actuator/health
      port: 8081

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

values-uat.yaml

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

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

templates/ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .Chart.Name }}-ingress
  namespace: {{ .Release.Namespace }}
  annotations:
    alb.ingress.kubernetes.io/load-balancer-name: {{ .Chart.Name }}-ingress
    alb.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-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
  - 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 }}-secret
  namespace: {{ .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: demo
  name: {{ .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: http
      port: {{ .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: http
      port: {{ .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 }}-configmap
  namespace: {{ .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 }}-configmap
  namespace: {{ .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.coloradmin.cn/o/1517225.html

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

相关文章

【镜像转存】利用交互式学习平台killercoda转存K8S镜像至Docker私人仓库

文章目录 1. 镜像转存需求2. 注册并登陆 killercoda URL3. 打开playground4. 在线拉取K8S镜像并打上标签5. 推送K8S镜像到Docker私有仓库6. 登陆Docker私有仓库查看 1. 镜像转存需求 因K8S镜像在不开代理的情况下,拉取超时、下载缓慢,导致镜像拉取不下来…

解决无法登录到 ArcGIS Server Administrator

目录 问题复现原因分析解决办法 问题复现 今天在访问arcgisserver后台准备设置arcgis api for js请求路径时,登录之后出现500错误。Services Directoryhttp://xxx.xxx.xxx.xxx:6080/arcgis/admin/system/handlers/rest/servicesdirectory 原因分析 我实在两台虚拟机…

HM v.16.22 顺序读源码day3---TEncTop.cpp

文章目录 TEncTop.cpp引言Void TEncTop::encode执行流程实现细节Class TEncTopVoid TEncTop::xGetNewPicBuffer ( TComPic*& rpcPic, Int ppsId ) TEncTop.cpp 引言 TEncTop类是第二层编码类,也是执行实际编码计算工作的最顶层编码类。 Void TEncTop::encode是…

Logstash 详细介绍、安装与使用

目录 1. Logstash 概述2. 工作原理3. 安装和配置1. 安装(两种方法)2. 测试运行3. 配置输入和输出 4. 使用 Grok 过滤器插件解析 Web 日志5. 使用 Geoip 过滤器插件增强数据6. 配置接收 Beats 的输入 1. Logstash 概述 Logstash 是一个具有实时管道功能的…

Rust 深度学习库 Burn

一、概述 Burn 它是一个新的综合动态深度学习框架,使用 Rust 构建的,以极高的灵活性、计算效率和可移植性作为其主要目标。 Rust Burn 是一个以灵活性、高性能和易用性为核心设计原则工具,主打就是灵活性 、高性能 及易用性。 二、Rust B…

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年,Welsh和Powell算法引入了…

bootstrap企业网站前端模板

介绍 企业网站前端模板 软件架构 前端所用技术html/css/js/jquery 前端框架bootstrap 安装教程 浏览器本地路径访问发布到服务器比如(tomcat/nginx等)云服务器/虚拟机 网站效果图 网站预览 点击预览 源码地址 https://gitee.com/taisan/company…

最新的yolov9,目标检测使用教程

1.克隆仓库,仓库地址: https://github.com/WongKinYiu/yolov9/tree/main 百度盘地址:https://pan.baidu.com/s/15v7XJIMDFG3XHJXfFs6ZDA 密码:1234 除了这两个模型,另外三个模型有问题...,下载ce模型即可 …

Jmeter+ant,ant安装与配置

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

微服务分布式基于Springcloud的拍卖管理系统597wx

越来越多的用户利用互联网获得信息,但各种信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得信息,因此,设计一种安全高效的拍卖管理系统极为重要。 为设计一个安全便捷,并且使用户更好获取拍卖管理系统&#xff…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压,将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

SpringBoot(自定义转换器+处理Json+内容协商)

文章目录 1.自定义转换器1.代码实例1.save.html2.编写两个bean1.Car.java2.Monster.java 3.WebConfig.java 配置类来自定义转换器4.测试 2.注意事项和细节1.debug查看转换器总数1.打断点2.执行到断点后,选左边的1923.可以看出,加上自定义的转换器一共125…

决策树 | 分裂算法:ID3,C4.5,CART

这里写目录标题 一. ID3算法1. 信息增益2. ID3算法特点 二. C4.5算法1. 信息增益率2. C4.5算法特点 三. CART算法1. Gini系数公式2. CART算法特点3. CART回归树的分裂评价指标 小节 在决策树算法逻辑篇中,我们讲解了决策树的构建方式,下面我们来聊一聊决…

边缘计算全面概述

什么是边缘计算? 边缘计算是一种分布式计算概念,将智能集成到边缘设备(边缘节点)中,使数据能够在数据采集源附近实时处理和分析。由于边缘计算在网络边缘本地处理数据,而不是在云端或集中式数据中心&#…

脑电信号处理的学习记录

【脑电信号处理与特征提取】https://www.bilibili.com/video/BV1Sg411775g?p6&vd_source77fb52274de00164fa71d28e4ce52cc5 滤波:对特定频率进行有效提取,并对提取部分进行特定的处理(增益、衰减、滤除)。 低通滤波&#x…

电商场景下 ES 搜索引擎的稳定性治理实践

继上文在完成了第一阶段 ES 搜索引擎的搭建后,已经能够实现对千万级别的商品索引的读写请求的支持。目前,单机房读流量在 500~1000 QPS 之间,写流量在 500 QPS 左右。 但随着业务的发展,问题也逐渐开始暴露&#xff0…

Python Web开发记录 Day9:Django part3 用户管理

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、数据库准备2、用户列表3、新建用户4、编辑用…

Linux之shell变量

华子目录 什么是变量?变量的名称示例 变量的类型变量的定义示例 自定义变量查看变量(自定义变量和全局变量) 环境变量定义环境变量(全局变量)法一法二法三env,printenv,export注意 C语言与shell…

计算机网络(001-1)

计算机网络-方老师 总时长 24:45:00 共50个视频,6个模块 此文章包含1.1到1.4的内容 简介 1.1计算机网络的作用 三网融合(三网合一) 模拟信号就是连续信号 数字信号是离散信号 1.2互联网概述 以前2兆带宽就要98 现在几百兆带宽也就几百块 …

Ajax学习笔记(一):原生AJAX、HTTP协议、AJAX案例准备工作、发送AJAX请求、AJAX 请求状态

目录 一、原生AJAX 1.1AJAX 简介 1.2 XML 简介 1.3 AJAX的特点 二、HTTP协议 三、AJAX案例准备工作 四、发送AJAX请求 1.发送GET请求 2.发送POST请求 3.JSON响应 IE缓存问题: 五、AJAX 请求状态 一、原生AJAX 1.1AJAX 简介 AJAX 全称为 Asynchronous …