【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
相关推荐
观无3 小时前
微服务下的跨域问题
微服务·云原生·架构
Chuncheng's blog4 小时前
K8S二进制部署exec unable to upgrade connection: Unauthorized异常解决方案
云原生·容器·kubernetes
FJW0208144 小时前
HAProxy+Keepalived实现Kubernetes高可用集群部署
云原生·容器·kubernetes
正经教主4 小时前
【docker基础】第二课:安装、配置与基础命令
docker·容器·eureka
倔强的胖蚂蚁4 小时前
云原生服务器存储规划与磁盘选型实施
运维·服务器·云原生
观无4 小时前
微服务架构核心技术知识全景总结
微服务·云原生·架构
@土豆5 小时前
【混合云组网实战】Docker部署内网互通服务,实现本地网段访问公有云VPC私网
运维·docker·容器
merlin-mm5 小时前
volcano 原理分析
容器·kubernetes
正经教主6 小时前
【docker基础】第三课:镜像管理与Dockerfile基础
运维·docker·容器