本文分别从如下几个方面来分享一波 如何将自己的镜像使用 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 目录下
- 下载 需要的版本
- 解压(
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
) - 在解压目中找到
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 包
- 在 helm_demo 目录下 新建 docs 目录
mkdir docs
- 制作 helm 包
helm package my-helm-demo -d docs
- 进入 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
- 添加我们自己的 helm 仓库,并更新
helm repo add my-repo https://qingconglaixueit.github.io/helm_demo/ helm repo update
- 查看咱们的 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