【Kubernetes专项】K8s 包工具- Helm 入门到企业实战

Kubernetes 包工具- Helm 入门到企业实战

20.1 Helm概述

20.1.1 基本介绍

官网:https://helm.sh/

官方chart站点:https://github.com/vmware-tanzu/kubeapps/

Helm中的一些概念:

  1. helm:命令行客户端工具,主要用于Kubernetes应用中的chart的创建、打包、发布和管理。
  2. Chart:helm程序包,一系列用于描述k8s资源相关文件的集合,比方说我们部署nginx,需要deployment的yaml,需要service的yaml,这两个清单文件就是一个helm程序包,在k8s中把这些yaml清单文件叫做chart图表。
  • Helm 是 Kubernetes 应用的包管理工具,主要用来管理 Charts,类似 Linux 系统的 yum。
  • Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。
  • 对于应用发布者而言
  • 通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
  • 对于使用者而言
  • 使用 Helm 后可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序
20.1.2 K8s版本支持的各个helm版本对照表:

https://helm.sh/zh/docs/topics/version_skew/

20.1.3 helm常用操作
命令 描述
create 创建一个 chart 并指定名字
dependency 管理 chart 依赖
get 下载一个 release。可用子命令:all、hooks、manifest、notes、values
history 获取 release 历史
install 安装一个 chart
list 列出 release
package 将 chart 目录打包到 chart 存档文件中
pull 从远程仓库中下载 chart 并解压到本地 # helm pull stable/mysql -- untar
repo 添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、 list、remove、update
rollback 从之前版本回滚
search 根据关键字搜索 chart。可用子命令:hub、repo
show 查看 chart 详细信息。可用子命令:all、chart、readme、values
status 显示已命名版本的状态
template 本地呈现模板
uninstall 卸载一个 release
upgrade 更新一个 release
version 查看 helm 客户端版本

20.2 部署Helm 4.00

开源地址:https://github.com/helm/helm/releases/tag/v4.0.0

20.2.1 安装helm软件
bash 复制代码
[root@k8s-master1 ~]# wget https://get.helm.sh/helm-v4.0.0-linux-amd64.tar.gz

[root@k8s-master1 ~]# tar zxf helm-v4.0.0-linux-amd64.tar.gz

[root@k8s-master1 ~]# cp linux-amd64/helm /bin

[root@k8s-master1 ~]# helm version
version.BuildInfo{Version:"v4.0.0", GitCommit:"99cd1964357c793351be481d55abbe21c6b2f4ec", GitTreeState:"clean", GoVersion:"go1.25.3", KubeClientVersion:"v1.34"}
20.2.2 添加/删除chart仓库地址
bash 复制代码
[root@k8s-master1 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

[root@k8s-master1 ~]# helm repo add  microsoft http://mirror.azure.cn/kubernetes/charts/

helm repo remove xxx
20.2.3 查看仓库列表
bash 复制代码
[root@k8s-master1 ~]# helm repo list
NAME            URL
aliyun          https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
microsoft       http://mirror.azure.cn/kubernetes/charts/
20.2.4 查看仓库存储helm清单
bash 复制代码
[root@k8s-master1 ~]# helm search repo aliyun
20.2.5 更新chart仓库
bash 复制代码
[root@k8s-master1 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "microsoft" chart repository
Update Complete. ⎈Happy Helming!⎈

20.3 Helm基本使用

20.3.1 搜索并下载chart
bash 复制代码
[root@k8s-master1 ~]# helm search repo aliyun | grep memcached
aliyun/mcrouter                 0.1.0           0.36.0
aliyun/memcached                2.0.1                 

# 查看chart信息
[root@k8s-master1 ~]# helm show chart aliyun/memcached
apiVersion: v1
description: Free & open source, high-performance, distributed memory object caching
  system.
home: http://memcached.org/
icon: https://upload.wikimedia.org/wikipedia/en/thumb/2/27/Memcached.svg/1024px-Memcached.svg.png
keywords:
- memcached
- cache
maintainers:
- email: gtaylor@gc-taylor.com
  name: Greg Taylor
name: memcached
sources:
- https://github.com/docker-library/memcached
version: 2.0.1
bash 复制代码
[root@k8s-master1 ~]# helm pull aliyun/memcached

[root@k8s-master1 ~]# tar zxf memcached-2.0.1.tgz
[root@k8s-master1 ~]# cd memcached/
[root@k8s-master1 memcached]# ls
Chart.yaml  README.md  templates  values.yaml

1.Chart.yaml: chart的基本信息,包括版本名字之类
2.templates: 存放k8s的部署资源模板,通过渲染变量得到部署文件
3.values.yaml:存放全局变量,templates下的文件可以调用

[root@k8s-master1 memcached]# cd templates/
[root@k8s-master1 templates]# ls
_helpers.tpl  NOTES.txt  pdb.yaml  statefulset.yaml  svc.yaml
1._helpers.tpl      存放能够复用的模板
2.NOTES.txt         为用户提供一个关于chart部署后使用说明的文件
20.3.2 部署chart
20.3.2.1 helm部署memcached服务
bash 复制代码
[root@k8s-node1 ~]# docker pull library/memcached:1.4.36
[root@k8s-node1 ~]# docker save -o memcached-1.4.36.tar.gz memcached:1.4.36

[root@k8s-node1 ~]# ctr -n k8s.io images import memcached-1.4.36.tar.gz
unpacking docker.io/library/memcached:1.4.36


# 也可以直接这样
[root@k8s-master1 ~]# ctr -n k8s.io image pull docker.io/library/memcached:1.4.36-alpine
bash 复制代码
[root@k8s-master1 ~]# cd memcached/
[root@k8s-master1 memcached]# rm -rf templates/pdb.yaml

# 修改一些东西(apiversion,selector,affinity)
[root@k8s-master1 memcached]# vim templates/statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ template "memcached.fullname" . }}
  labels:
    app: {{ template "memcached.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
spec:
  selector:
    matchLabels:
        app: {{ template "memcached.fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
  serviceName: {{ template "memcached.fullname" . }}
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "memcached.fullname" . }}
        chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
        release: "{{ .Release.Name }}"
        heritage: "{{ .Release.Service }}"
    spec:
      containers:
      - name: {{ template "memcached.fullname" . }}
        image: {{ .Values.image }}
        imagePullPolicy: {{ default "" .Values.imagePullPolicy | quote }}
        command:
        - memcached
        - -m {{ .Values.memcached.maxItemMemory  }}
        {{- if .Values.memcached.extendedOptions }}
        - -o
        - {{ .Values.memcached.extendedOptions }}
        {{- end }}
        {{- if .Values.memcached.verbosity }}
        - -{{ .Values.memcached.verbosity }}
        {{- end }}
        ports:
        - name: memcache
          containerPort: 11211
        livenessProbe:
          tcpSocket:
            port: memcache
          initialDelaySeconds: 30
          timeoutSeconds: 5
        readinessProbe:
          tcpSocket:
            port: memcache
          initialDelaySeconds: 5
          timeoutSeconds: 1
        resources:
{{ toYaml .Values.resources | indent 10 }}
bash 复制代码
[root@k8s-master1 memcached]# helm install memcached ./
bash 复制代码
[root@k8s-master1 memcached]# kubectl get pods
NAME                    READY   STATUS      RESTARTS   AGE
memcached-memcached-0   1/1     Running     0          10m
memcached-memcached-1   1/1     Running     0          10m
memcached-memcached-2   1/1     Running     0          10m
20.3.3 release相关操作
bash 复制代码
[root@k8s-master1 ~]# helm list
[root@k8s-master1 ~]# helm delete memcached

# 删除release会把release下对应的资源也删除

[root@k8s-master1 ~]# kubectl get pods

20.4 自定义Chart模版

20.4.1 自定义Chart
bash 复制代码
[root@k8s-master1 ~]# helm create myapp

[root@k8s-master1 ~]# cd myapp/
[root@k8s-master1 myapp]# ls
charts  Chart.yaml  templates  values.yaml

[root@k8s-master1 myapp]# yum install -y tree
[root@k8s-master1 myapp]# tree ./
./
├── charts
├── Chart.yaml	# 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates	# 模板目录,保留创建k8s的资源清单文件
│   ├── deployment.yaml	# deployment资源的go模板文件
│   ├── _helpers.tpl	# 模板助手文件,定义的值可在模板中使用
│   ├── hpa.yaml		# 水平pod自动扩缩容go模板文件
│   ├── httproute.yaml
│   ├── ingress.yaml	# 七层代理
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml		# 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件
20.4.2 部署release
bash 复制代码
[root@k8s-node1 ~]# crictl pull nginx:latest

[root@k8s-master1 myapp]# helm install nginx ./

[root@k8s-master1 ~]# kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
nginx-myapp-7c4fd57446-glhq2   1/1     Running   0          10m
[root@k8s-master1 ~]# kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   4h32m
nginx-myapp   ClusterIP   10.104.207.50   <none>        80/TCP    11m
20.4.2.2 upgrade升级release及版本回滚rollback
bash 复制代码
[root@k8s-master1 ~]# kubectl get svc
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   4h32m
nginx-myapp   ClusterIP   10.104.207.50   <none>        80/TCP    11m


[root@k8s-master1 ~]# helm upgrade --set service.type="NodePort" nginx myapp

[root@k8s-master1 ~]# kubectl get svc
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP
nginx-myapp   NodePort    10.104.207.50   <none>        80:31380/TCP


[root@k8s-master1 ~]# helm history nginx

[root@k8s-master1 ~]# helm rollback nginx 1
[root@k8s-master1 ~]# helm history nginx
20.4.2.3 打包Chart
bash 复制代码
[root@k8s-master1 ~]# helm package /root/myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
[root@k8s-master1 ~]# ll myapp-0.1.0.tgz
-rw-r--r-- 1 root root 4938 Mar 18 21:16 myapp-0.1.0.tgz
相关推荐
无言听风雨丶37 分钟前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
分布式存储与RustFS2 小时前
JuiceFS 接 RustFS 当数据后端:把对象存储挂成本地文件系统
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
孔令飞4 小时前
很多人想学AI Infra,今天推荐一个 AI Agent / AI Infra 学习路线
云原生·go·ai编程
晨陌y4 小时前
Flare自托管导航页教程:Docker部署、多用户、API与公网访问
运维·docker·容器
无言听风雨丶4 小时前
Kubernetes GitOps 持续交付实战:用 Argo CD 让 Git 成为集群事实源
git·elasticsearch·kubernetes
Z21-X5 小时前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云
分布式存储与RustFS5 小时前
K8s 集群备份落到自建对象存储:Velero 接 RustFS 配置指南
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
无言听风雨丶14 小时前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao15 小时前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉16 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver