如何将自己的镜像使用 helm 部署

news2024/11/27 4:17:26

本文分别从如下几个方面来分享一波 如何将自己的镜像使用 helm 部署

  • 简单介绍一下 helm
  • 使用自己写 yaml 文件的方式在 k8s 中部署应用
  • 使用 helm 的方式在 k8s 中部署应用

简单介绍一下 helm

Helm 是 Kubernetes 的包管理器,在云原生领域用于应用打包和分发

Helm Chart 包含了 Docker 镜像以及其在 k8s 中的基础设施配置,例如 service,deployment 等等,helm 可以把 k8s 的应用进行完成封装,发布给任意一个其他的 k8s 环境使用

可以查看 helm 文档地址:https://helm.sh/zh/docs/

使用自己写 yaml 文件的方式在 k8s 中部署应用

接下来便开始咱们的实战演练了,我们需要有如下工具

  • 基本的 k8s集群 环境,也可以是 minikube
  • 基本的 docker 环境和知识
  • 基本的 git 环境和知识
  • Helm 工具

一般情况下,咱们刚开始会用 k8s 的时候,咱们会去单独的编写 deployment, service 对应的 yaml 文件,然后再一一部署,如果咱们的应用使用到了卷,配置文件等,咱们编写的 yaml 只会更多,并且不利于分享和传播。

例如咱们在部署一个 应用名为 my-helm-demo 的时候,我们会这样做

1、编写源码,并输出可以执行程序

咱们编写一个 web 服务端,提供一个 v1 版本的查询接口,咱们使用 gin 简单实现一下

先来看看我们的完整的项目整体结构

先来编码实现 web 服务器

  • helm_demo/my_demo/main.go

使用上述源码文件,咱们编译可以生成可执行程序,咱们将它命名为 my_demo_svr ,并且将它放到 helm_demo 目录下

2、制作镜像

这个时候我们来开始制作镜像,在 helm_demo 下编写启动脚本 start.sh 和 Dockerfile

  • helm_demo/start.sh
#!/bin/bash
./my_demo_svr
  • helm_demo/Dockerfile
FROM centos
ADD my_demo_svr /
ADD start.sh /
ENTRYPOINT ["sh", "start.sh"]

制作 docker 镜像,对于 docker 相关的细节就不赘述了,docker 仓库可以查看 https://hub.docker.com/repositories

关于 docker 的基本知识点,可以查看我的 docker 系列历史文章

docker build -t xiaomotong888/my-helm-demo:v1 .
docker push xiaomotong888/my-helm-demo:v1

3、编写 deployment 和 service 的 yaml 文件

开始在 helm_demo 目录下编写基本的 deployment 和 service 相关 yaml 文件

  • my_helm_demo-deploy.yaml

咱们 deploy 中的镜像使用上面我们制作的:xiaomotong888/my-helm-demo:v1

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-helm-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-helm-demo
  template:
    metadata:
      name: my-helm-demo
      labels:
        app: my-helm-demo
    spec:
      containers:
      - image: xiaomotong888/my-helm-demo:v1
        name: my-helm-demo
  • my_helm_demo-service.yaml

此处 service 咱们使用 NodePort 的方式来暴露服务的端口 31889,咱们自身容器的端口是 8989

apiVersion: v1
kind: Service
metadata:
  name: my-helm-demo-service
spec:
  ports:
  - port: 8989
    targetPort: 8989
    nodePort: 31889
    protocol: TCP
  selector:
    app: my-helm-demo
  type: NodePort

4、部署

kubectl create -f my_helm_demo-deploy.yaml
kubectl create -f my_helm_demo-service.yaml

5、查看效果

查看 po

查看 svc

在 k8s 外部请求咱们的 web 接口,效果如下,可以正常在 k8s 环境外部请求 k8s 暴露的端口 31889

前面有说到,咱们使用上述的方式,不便于以后的查找和分享,那么接下来,咱们可以使用 helm 的方式来玩

在使用 helm 前,我们将刚才部署的 deploy 和 service 先清除掉

kubectl delete -f my_helm_demo-service.yaml
kubectl delete -f my_helm_demo-deploy.yaml

使用 helm 的方式在 k8s 中部署应用

对于咱们使用 helm 的时候,咱们可以这样来玩,使用 helm 工具可以很方便的查找和分享咱们完整的部署包

1、安装 helm

按照 helm ,咱们可以直接使用官网的步骤,下载压缩包,解压之后将可执行程序 helm 放到咱们的系统 bin 目录下

  1. 下载 需要的版本
  1. 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  1. 在解压目中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)

2、创建 Helm Chart,并修改镜像和具体的端口

在咱们的 helm_demo 目录下创建 Helm Chart

helm create my-helm-demo

执行命令后,helm 工具在我们的 helm_demo 目录下生产了如下文件:

我们可以看到,有很多关于 k8s 的 yaml 文件,实际上我们现在只需要去修改 values.yaml 中关于镜像和端口的配置

关于镜像的配置,修改成咱们的镜像版本

image:
  repository: xiaomotong888/my-helm-demo
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
tag: "v1"

同理,修改端口

service:
  type: NodePort
  port: 8989
  nodePort: 31889

最后找到 helm_demo/my-helm-demo/templates/service.yaml 补充一下 service 的端口的配置

此处可以解释一下 {{ .Values.service.nodePort }} 的含义:

表示会引用 values.yaml 文件的 service 下面的 nodePort 对应的值,也就是上一步咱们补充的端口信息 31889

3、本地部署 helm 包,验证效果

这个时候,简单的本地 helm 包咱们就弄好了,现在来部署本地的 helm 包

helm_demo 目录下执行命令进行部署

helm install my-helm-demo my-helm-demo

部署之后,我们可以查看 helm 列表,查看 pod ,查看 svc 来检查一下

  • helm list
  • kubectl get po
  • kubectl get svc

同样的,使用 postman 请求接口,也是没问题的

4、将部署包推到 github 仓库中,做成 helm 仓库,便于后续查询和分享

接下来,咱们就来看看如何弄一个自己的 helm 仓库,以及版本升级和迭代

在当前这个仓库中(helm_demo),我们先将上述涉及到的文件推到 github 上,然后去设置咱们的 github Pages

此处的 branch 咱们记得设置成 ,master 分支的 /docs 目录

开始制作 helm 包

  1. 在 helm_demo 目录下 新建 docs 目录
mkdir docs
  1. 制作 helm 包
helm package my-helm-demo -d docs
  1. 进入 docs 目录,并生成访问的 index.yaml 文件
cd docs
helm repo index .

这个时候,咱们可以看到 docs 目录下出现了 2 个文件

[root@VM-20-15-centos helm_demo]# tree docs/
docs/
├── index.yaml
├── my-helm-demo-0.1.0.tgz

此时将整个 helm_demo 项目本地的文件提交到远程仓库,我们可以在远程仓库上看到咱们的 helm 包

5、部署应用

在使用 helm 仓库部署之前,咱么先将刚才使用本地 helm 部署的应用先卸载掉

helm uninstall my-helm-demo
  1. 添加我们自己的 helm 仓库,并更新
helm repo add my-repo https://qingconglaixueit.github.io/helm_demo/
helm repo update
  1. 查看咱们的 my-repo 仓库,并安装应用
helm search repo my-repo
helm install my-helm-demo my-repo/my-helm-demo

可以重复上述部署本地 helm 包之后的检查操作,检查 pod,检查 svc,检查端口等信息

6、修改咱们的源码,生成 v2 版本的部署包

此时,咱们修改源码,增加 v2 版本的查询接口

上述 helm_demo/main.go 调整成如下内容:

这个时候,编译生成可执行程序,步骤和上述步骤完全一致

得到最新的镜像为:xiaomotong888/my-helm-demo:v2

再使用上述的方式制作最新的 helm 包(修改版本记得修改 helm_demo/my-helm-demo/Chart.yaml 的 version 值为 0.2.0),并推到 github 上,此时我们可以看到 github 上已经有 2 个版本的包了

7、升级最新部署包

此时我们执行命令来升级咱们的最新版本的包

helm repo update my-repo
helm search repo my-repo

仓库中最新的 helm 包已经更新成 0.2.0 版本了,我们可以来进行一波升级

helm upgrade --install my-helm-demo my-repo/my-helm-demo

8、查看效果

升级之后,我们还是同样的去检查 pod,svc,端口等,我们可以看到咱们 pod 的版本已经变成最新的了

使用 postman 请求版本 2 的接口,我们可以查看一下效果

如上涉及的 helm 包,你也可以自己拉取自行使用哦,看到这里相信,你学会了吧

本文源码可以查看地址:https://github.com/qingconglaixueit/helm_demo

当然对于 helm 的其他使用及技巧,直接参考官网文档即可:https://helm.sh/zh/docs/

至此,本篇内容结束

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

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

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

相关文章

12. 微积分 - 梯度积分

Hi,大家好。我是茶桁。 上一节课,我们讲了方向导数,并且在最后留了个小尾巴,是什么呢?就是梯度。 我们再来回看一下但是的这个式子: [ f x f y

信息系统项目管理师(第四版)教材精读思维导图-第八章项目整合管理

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 目录 8.1 管理基础 8.2 管理过程 8.3 制定项…

LRU算法 vs Redis近似LRU算法

LRU(Least Recently Use)算法,是用来判断一批数据中,最近最少使用算法。它底层数据结构由Hash和链表结合实现,使用Hash是为了保障查询效率为O(1),使用链表保障删除元素效率为O(1)。 LRU算法是用来判断最近最少使用到元素&#xf…

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)

文章目录 前言A - Dijkstra Algorithm0x00 算法题目0x01 算法思路0x02 代码实现 B - 最长路0x00 算法题目0x01 算法思路0x02 代码实现 C - 二分图最大匹配0x00 算法题目0x01 算法思路0x02 代码实现 D - 搭配飞行员0x00 算法题目0x01 算法思路0x02 代码实现 E - The Perfect Sta…

企业架构LNMP学习笔记11

Nginx配置文件的介绍: #nginx子进程启动用户 #user nobody; #子进程数量 一般调整为cpu核数或者倍数 worker_processes 1; #错误日志定义 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#进程pid 存储文件…

ISO/IEC/ITU标准如何快速查找(三十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

C++中的语法知识虚继承和虚基类

多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。 多继承时很容易产生命名冲突,即使我们很小心地将所有类…

UDP和TCP协议报文格式详解

在初识网络原理(初识网络原理_蜡笔小心眼子!的博客-CSDN博客)这篇博客中,我们简单的了解了一下TCP/IP五层网络模型,这篇博客将详细的学习一下五层网络模型中传输层的两个著名协议:UDP和TCP 目录 一, 传输层的作用 二, UDP 1,UDP协议的特点 2,UDP报文格式 三, TC…

【数据结构】如何设计循环队列?图文解析(LeetCode)

LeetCode链接:622. 设计循环队列 - 力扣(LeetCode) 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元…

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念 在学习ElasticSearch之前,先简单了解下ES流行度,使用背景,以及相关概念等。本文是ElasticSearch第二讲,ElasticSearch的基础概念。 文章目录 ElasticSearch第二讲…

【GoldenDict】win11牛津高阶英汉双解词典安装使用方法

【词典资源】 1(本文章使用的版本)牛津高阶(第10版 英汉双解) V11.8: https://pan.baidu.com/s/11272Cldde_2UttQkWS2MlQ 提取码:0p3j 2(另一版本)第十版 v13.2: ht…

信息系统项目管理师(第四版)教材精读思维导图-第九章项目范围管理

请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 目录 9.1 管理基础 9.2 管理过程 9.3 规划范…

【Linux】线程安全-信号量

文章目录 信号量原理信号量保证同步和互斥的原理探究信号量相关函数初始化信号量函数等待信号量函数释放信号量函数销毁信号量函数 信号量实现生产者消费者模型 信号量原理 信号量的原理:资源计数器 PCB等待队列 函数接口 资源计数器:对共享资源的计…

Python之单调栈

单调栈 了解单调栈先要了解栈。栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈&…

用JAVA(springboot) 开发的彩票模拟系统

闲暇时间,自己写了一个模拟彩票系统,里面研究了开奖算法,下单算法,彩票的各种计算规则。需要源码的私信,研究为主,切勿商务用途。

2022年06月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;有多少种二叉树 输入n(1<n<13)&#xff0c;求n个结点的二叉树有多少种形态 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 整数n 输出 答案 样例输入 3 样例输出 5 这个问题可以使用…

外部中断(EXTI) - 按键控制LED

一、外部中断/事件控制器(EXTI)结构图 1、结构图分析 外部中断主要由外部中断/事件控制器(External interrupt/event controller, EXTI)控制&#xff0c;它管理了外部中断或者事件的使能与否、触发方式等功能。 &#xff08; 外部中断/事件控制器(EXTI)结构图 &#xff09; …

记录错误:Access denied for user ‘root‘@‘localhost‘ (using password:No) 解决方案

他说我没输入密码&#xff0c;但是我输入了啊&#xff1f;&#xff1f;于是&#xff0c;我试了试这儿&#xff0c;password 一改就好了。。。 他原来是是我打的很快&#xff0c;快速生成的。。。。

ESP32之LEDC(PWM信号的输出)

一、PWM信号简介 PWM&#xff1a;脉冲宽度调制&#xff0c;简称脉宽调制频率(f)&#xff1a;一秒钟PWM有多少个周期(单位Hz)周期(T)&#xff1a;一个周期的时间占空比(duty)&#xff1a;在一个脉冲周期内&#xff0c;高电平的时间与整个周期时间的比例脉宽时间&#xff1a;一个…

React 中的 ref 如何操作 dom节点,使输入框获取焦点

聚焦文字输入框 .focus() 获取焦点 当用户点击按钮时&#xff0c;handleClick 函数会被调用&#xff0c;从而将焦点聚焦到文本输入框上。 // 焦文字输入框 import { useRef } from "react";const FocusForm () > {const inputRef useRef<any>(null);func…