【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
相关推荐
阿里云云原生9 小时前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生12 小时前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事3 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生4 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程
探索云原生5 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美5 天前
从edge-trigger到level-trigger,谈谈 Kubernetes controller 的开发范式
云原生
阿里云云原生5 天前
深度解构:当 Append-only 的 SLS 遇上 Update/Delete,是如何实现设计权衡的?
云原生