Skip to content

Helm 的介绍与使用

官网地址:https://helm.sh/zh/docs/

概念介绍

helm

  • Helm 是 Kubernetes 的包管理器
  • Helm 使得 Kubernetes 集群中安装应用和资源变得异常简单
  • Helm 帮助您管理 Kubernetes 应用—— Helm Chart,即使是最复杂的 Kubernetes 应用程序,都可以帮助您定义,安装和升级

chart

  • Helm 使用的包格式称为 chart,是一个描述Kubernetes相关资源的文件集合,有特定的文件目录结构
  • 涵盖了将 Kubernetes 资源安装到 Kubernetes 集群所需要的足够多的信息

release

  • 运行在 Kubernetes 集群中的 chart 的实例
  • chart 安装之后,Helm 库会创建一个 release 来跟踪这个安装
  • release 是一个与特定配置相结合的 chart 的运行实例

仓库

  • 用于存放、共享 chart 的地方

基于 OCI 注册中心的 Helm 仓库

  • 基于 OCI 注册中心是另一种存储和共享 chart 包的方式
  • 与 Helm Chart 仓库在使用命令上有较大区别,对 oci:// 协议的支持仅适用 helm 的部分命令
  • 使用基于OCI的注册中心
  • 基本上所有云厂商的容器镜像服务均支持 OCI

OCI Chart 使用指南

以阿里云容器镜像仓库 OCI 使用为例(亲测腾讯云使用方式一样):

login 登录

bash
helm registry login -u $user xxx-img-registry-vpc.cn-beijing.cr.aliyuncs.com -p "$passwd"

push 推送

bash
helm push redis-18.6.2.tgz oci://xxx-img-registry-vpc.cn-beijing.cr.aliyuncs.com/op
  • 将本地的 redis-18.6.2.tgz 文件推送到 OCI 注册中心

pull 拉取

bash
helm pull oci://xxx-img-registry-vpc.cn-beijing.cr.aliyuncs.com/op/redis
helm pull oci://xxx-img-registry-vpc.cn-beijing.cr.aliyuncs.com/op/redis --version 18.6.2
helm pull oci://xxx-img-registry-vpc.cn-beijing.cr.aliyuncs.com/op/redis --untar
  • --version 指定版本
  • --untar 直接解压

python 调用 helm 命令

python
import json
import subprocess

from sanic import Sanic


class Helm():
    """python 调用 helm 客户端命令
    因官方并未提供 python sdk,所以使用的是 python 调用 helm 客户端命令实现
    大部分获取信息的命令均提供了输出为 json 格式,可方便使用
    https://helm.sh/zh/docs/helm/helm/
    """
    def __init__(self, cloud, env='test'):
        """
        cloud: aliyun/tencent/aws
        env: test/prod
        """
        self.app = Sanic.get_app()
        key_server = f'k8s_server_{cloud}_{env}'.upper()
        key_token = f'k8s_token_{cloud}_{env}'.upper()
        self.api_server = self.app.config[key_server]
        self.api_token = self.app.config[key_token]

    def run(self, cmd):
        base_cmd = 'helm' \
            ' --kube-insecure-skip-tls-verify' \
            f' --kube-apiserver {self.api_server}' \
            f' --kube-token "{self.api_token}"'
        cmd = f'{base_cmd} {cmd}'
        res = subprocess.run(
            cmd, capture_output=True, shell=True,
            check=True, encoding='utf-8')
        output = res.stdout
        if '-o json' in cmd:
            output = json.loads(output)
            print(json.dumps(output, indent=4, ensure_ascii=False))
        else:
            print(output)
        return output

    def get_all_releases(self, namespace=None):
        """获取所有 release,即所有的已安装的 chart 实例
        https://helm.sh/zh/docs/helm/helm_list/
        """
        if namespace is None:
            cmd = 'ls -A'
        else:
            cmd = f'ls -n {namespace}'
        cmd += ' -o json'
        res = self.run(cmd)
        return res

    def get_release_history(self, namespace, release):
        """获取 release 的历史修订版本
        https://helm.sh/zh/docs/helm/helm_history/
        """
        cmd = f'history {release} -n {namespace} -o json'
        res = self.run(cmd)
        return res
  • 官方并未提供 python sdk, 所以使用 subprocess 库来调用 helm 命令
  • helm 绝大部分命令均支持输出 json yaml 格式,极大避免了数据格式的处理
  • Helm 命令行