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: 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

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

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

相关文章

java-ssm-jsp基于java的餐厅点餐系统的设计与实现

java-ssm-jsp基于java的餐厅点餐系统的设计与实现 获取源码——》公主号:计算机专业毕设大全

嵌入式方向还有希望吗?

我刚开始学习,也不知道我定位的是单片机工程师,嵌入式工程师职位的。 我只知道电子工程师,这个职位其实偏硬件,很多岗位需求是硬件设计,PCB设计,还要懂焊接、各种仪器仪表使用,还有些需要懂单片…

centos7磁盘管理,lvm挂载、扩容

一、centos7 磁盘挂载 默认盘符格式 centos7 默认文件格式xfscentos6 默认文件格式ext4centos5 默认文件格式ext3 1、/dev/vdb和/dev/mapper/lvm-data对比 1)/dev/vdb /dev/vdb通常表示一个裸的块存储设备,比如一个硬盘或者虚拟机中的一个虚拟硬盘。…

vscode-server的搭建方法

一、配置服务器端口支持 1、开放端口: 2、关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service二、配置code-server到服务器上** 1、下载code-server-4.22.0-linux-amd64.tar.gz到本地(可下载最新的版本)&a…

2024.3.14 C++

思维导图 封装类 用其成员函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;加法&#xff09;&#xff0c;并封装一个全局函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;减法&#xff09;。 #include <iostream>using nam…

[LeetCode][LCR169]招式拆解 II——巧妙利用字母的固定顺序实现查找复杂度为O(1)的哈希表

题目 LCR 169. 招式拆解 II 某套连招动作记作仅由小写字母组成的序列 arr&#xff0c;其中 arr[i] 第 i 个招式的名字。请返回第一个只出现一次的招式名称&#xff0c;如不存在请返回空格。 示例 1&#xff1a; 输入&#xff1a;arr "abbccdeff" 输出&#xff1a;a…

【学习心得】Python好库推荐——websocket-client

websocket-client 是一个在 Python 中广泛使用的库&#xff0c;用于创建 WebSocket 客户端并实现与 WebSocket 服务器的双向通信。更多的关于websocket协议介绍&#xff0c;可以看看我之前写的文章哦&#xff01; 【学习心得】websocket协议简介并与http协议对比http://t.csdn…

一文了解Spring的SPI机制

文章目录 一文了解Spring的SPI机制Java SPIServiceLoader Spring SPISpringboot利用Spring SPI开发starter 一文了解Spring的SPI机制 Java SPI SPI 全称 Service Provider Interface &#xff0c;是 Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用…

Webpack学习记录

记录学习笔记&#xff0c;欢迎指正 1.大型项目为什么需要打包 1.1 使用打包工具原因 编译或转译文件&#xff1a; 项目中可能用到ES6语法&#xff0c;可能有浏览器不支持。需要打包工具将代码编译输出为ES5语法的代码。项目中可能使用Sass&#xff0c;Less等预处理器&#xff…

【微服务】nacos注册中心

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在…

Python collections模块

collections 模块是Python标准库中提供的一个模块&#xff0c;用于提供一些额外的数据容器和工具&#xff0c;扩展了内置的数据类型。它包含了一些有用的类和函数&#xff0c;用于处理各种数据结构和算法问题。下面是 collections 模块中常用的几个类的详细介绍&#xff1a; 1.…

【数学】【位运算】LeetCoce810. 黑板异或游戏

作者推荐 视频算法专题 本文涉及知识点 数学 位运算 LeetCoce810. 黑板异或游戏 黑板上写着一个非负整数数组 nums[i] 。 Alice 和 Bob 轮流从黑板上擦掉一个数字&#xff0c;Alice 先手。如果擦除一个数字后&#xff0c;剩余的所有数字按位异或运算得出的结果等于 0 的话…

代码随想录day19(1)二叉树:完全二叉树节点个数(leetcode222)

题目要求&#xff1a;求一个完全二叉树的节点个数 思路&#xff1a;首先完全二叉树可以用普通二叉树的方法来求&#xff0c;但是需要遍历所有的节点。 但是对于完全二叉树来说&#xff0c;只有最底层右侧的节点可能没满&#xff0c;其余每层节点都达到了最大值。所以我们可以…

浏览器同源策略及跨域问题

同源策略&#xff1a;同源策略是一个重要的安全策略&#xff0c;它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介。 同源策略的作用&#xff1a;保护浏览器中网站的安全&#xff0c;限制ajax只…

YOLO v8:目标检测的最新王者

本文来自公众号“AI大道理” —————— Yolov8是Yolo系列模型的最新王者&#xff0c;各种指标全面超越现有目标检测模型。 Yolov8借鉴了Yolov5、Yolov6、YoloX等模型的设计优点&#xff0c;全面改进了Yolov5模型结构&#xff0c;同时保持了Yolov5工程化简洁易用的优势。 …

为什么要用scrapy爬虫库?而不是纯python进行爬虫?

为什么要用scrapy爬虫库&#xff1f;而不是纯python进行爬虫&#xff1f; Scrapy的优点Scrapy节省的工作使用纯Python编写爬虫的不足 Scrapy是一个使用Python编写的开源和协作的web爬虫框架&#xff0c;它被设计用于爬取网页数据并从中提取结构化数据。Scrapy的强大之处在于其广…

IBFKJ-299 8AI/AO,DI/DO开关量模拟量同时数据采集

产品特点&#xff1a; ● DC12-30V宽压供电&#xff1b; ● RS485通讯光电隔离&#xff0c;输入光耦隔离&#xff0c;继电器输出触点隔离&#xff1b; ●通讯接口支持RS232、RS485&#xff1b; ●支持标准Modbus RTU/TCP/ASCII协议 ●具有闪开、闪断功能&#xff0c;可以在…

C#操作像素替换图片中的指定颜色

待处理的图片&#xff0c;其特征是包含有限数量颜色&#xff0c;不同的颜色相互交叉使用&#xff0c;相同颜色并未完全连贯&#xff0c;需要将图片中的指定颜色替换为另一颜色。虽然很多图片处理工具都支持类似操作&#xff0c;最后还是自己动手编写简单的处理程序。   程序的…

8-图像放大

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Maginify(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE l…

当word表格复制到excel出现分行问题的解决小技巧

在word文档中将^p&#xff08;回车符号&#xff09;替换成其他&#xff0c;比如 全选复制粘贴到excel中后分行问题已经解决&#xff0c;将换回原本的回车即可&#xff0c;ctrshiftj&#xff08;回车&#xff09;