Helm 的介绍与使用
概念介绍
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 命令行