云原生之旅 - 5)Kubernetes时代的包管理工具 Helm
前言
上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应用。大家都知道 Kubernetes上的应用对象,都是由特定的资源描述组成,然后保存至一个个YAML文件,通过 kubectl apply –f 部署,但是这种手动的方式面临很多问题,容易出错,代码冗余,缺少版本控制等。所以我们需要一些工具来帮助我们更快的达到部署以及管理应用的目的。目前很流行的工具主要是 Helm 和 Kustomize(下一篇会介绍),本篇主要介绍 Helm。
Helm是一个 Kubernetes 的包管理工具,就像Linux下的包管理器,如 yum/apt 等,可以很方便的将之前打包好的yaml文件部署到 kubernetes 上。Helm有几个重要概念:
helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合Release:基于Chart的部署实体,一个 Chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象Repository:主要就是用来存放和共享 Chart 使用,相当于是 GitHub,不过这里主要是供 Kubernetes 使用。
关键词: Helm入门,Helm实践,使用Terraform 安装Helm Charts,自制Helm Charts,自定义Helm Chart,编写自己的Helm Charts
安装
参考官方文档,我这里是MacOS `brew install helm` 就行了。
使用Helm命令安装Chart
我们以安装bitnami 的Nginx为例子
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo list
helm search repo nginx
helm install mywebserver bitnami/nginx
安装到一个已存在的Namespace
helm install mywebserver bitnami/nginx -n demo
安装到一个新的Namespace
helm install mywebserver bitnami/nginx -n demo --create-namespace
安装某特定版本
helm install mywebserver bitnami/nginx --version 13.2.8
查看
helm list
helm list -n demo
修改参数安装,如下是把service type 改为ClusterIP,默认为LB类型
helm install my-nginx bitnami/nginx --set service.type="ClusterIP"
## 更多参数可参考文档
也可通过values.yaml修改参数
helm inspect values bitnami/nginx > values.yaml vim values.yaml helm install mywebserver bitnami/nginx -f values.yaml NAME: mywebserver
LAST DEPLOYED: Tue Oct 4 10:23:16 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 13.2.9
APP VERSION: 1.23.1
如果想把Chart从repository下载到本地安装
pull到本地并解压 然后install from local
helm pull bitnami/nginx --untar helm install mywebserver2 ./nginx
Clean up
helm uninstall mywebserver helm repo remove bitnami
### 本文首发于博客园 https://www.cnblogs.com/wade-xu/p/16839834.html
使用 Terraform Helm Provider 安装 Helm Chart
还没有Terraform入门的,请移步本人前面的文档。例 云原生之旅 - 3)基础设施即代码 Terraform 快速入门
Terraform 代码示例如下

terraform {
backend "gcs" {
bucket = "global-sre-dev-terraform"
prefix = "helm/state"
}
}
backend.tf

terraform {
required_version = ">= 1.2.9"
required_providers {
helm = {
source = "hashicorp/helm"
version = "2.7.0"
}
}
}
data "google_project" "this" {
project_id = "global-sre-dev"
}
data "google_client_config" "this" {}
data "google_container_cluster" "this" {
name = "sre-mgmt"
location = "us-west1"
project = data.google_project.this.project_id
}
provider "helm" {
kubernetes {
host = "https://${data.google_container_cluster.this.private_cluster_config[0].public_endpoint}"
token = data.google_client_config.this.access_token
cluster_ca_certificate = base64decode(data.google_container_cluster.this.master_auth[0].cluster_ca_certificate)
}
experiments {
manifest = true
}
}
provider.tf

resource "helm_release" "my-nginx" {
name = "my-nginx-release"
repository = "https://charts.bitnami.com/bitnami"
chart = "nginx"
set {
name = "service.type"
value = "ClusterIP"
}
set {
name = "replicaCount"
value = "2"
}
}
nginx.tf
然后执行terraform 命令安装Nginx helm chart
terraform init terraform plan terraform apply
Reference: Terraform Helm Provider
自己制作 Helm Chart
helm create mychart
list 能看到目录结构如下
- Chart.yaml
- values.yaml
- templates
- charts
charts 目录可以放一些依赖的chart包,属于高阶用法,目前置空就行了。values.yaml文件为模版变量默认值。
现在,做一个最简单的Helm Charts 创建 namespace
templates 目录下仅需一个文件 namespace.yaml
---
{{ range $i, $ns := .Values.namespaces -}}
apiVersion: v1
kind: Namespace
metadata:
name: {{ $ns.name }}
annotations:
helm.sh/resource-policy: keep
{{- if hasKey $ns "extraAnnotations" }}
{{- toYaml $ns.extraAnnotations | nindent 4 }}
{{- end }}
---
{{- end }}
Chart.yaml
apiVersion: v2
description: Helm chart for maintaining user namespaces
name: user-namespaces
version: 1.1.0
values.yaml 放一个默认值来测试下
namespaces:
- name: wade-test
owner: "wade@demo.com"
extraAnnotations:
abc: def
测试
helm template user-namespaces

现在就可以local直接安装了,命令上面已经介绍过。
我们现在选择打包并且publish 到一个bucket 作为repository来共享给别人使用。也可以通过github作为repository,有类似solution,不再赘述。
我这里的例子是gcs bucket 作为私有 helm repository
helm package user-namespaces
此命令会生成一个tgz 包: `user-namespaces-1.1.0.tgz`
然后借助一款工具 helm-gcs which is a helm plugin that allows you to manage private helm repositories on Google Cloud Storage aka buckets.
helm gcs init gs://package/charts/infra/ helm repo add my-repo gs://package/charts/infra/ helm gcs push user-namespaces-1.1.0.tgz my-repo
你会看到此bucket下面会有两个文件
% gsutil ls gs://package/charts/infra/
gs://package/charts/infra/index.yaml
gs://package/charts/infra/user-namespaces-1.1.0.tgz
使用 Terraform Helm Provider 安装此Chart 代码示例:
locals {
namespaces:
- name: ${local.my_namespace}
owner: wadexu
EOT
}
resource "helm_release" "my_namespace" {
after terraform init and apply the resource

你的第一个自定义 Helm Chart 通过Terraform 安装成功了。
Helm list result:

`kubectl gs ns` you will see this new namespace just created
% kubectl get ns
NAME STATUS AGE
wade-demo Active 75s
总结
通过此文章的学习,您将了解到Helm的基本命令,以及Terrraform 安装 Helm 的方式,以便于后续自动化整个安装应用来Provisioning Kubernetes Clusters的流程。另外还了解到如何制作自己的第一个Helm Chart。
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。
云原生之旅 - 5)Kubernetes时代的包管理工具 Helm的更多相关文章
- kubernetes包管理工具Helm安装
helm官方建议使用tls,首先生成证书. openssl genrsa -out ca.key.pem openssl req -key ca.key.pem -new -x509 -days -s ...
- Kubernetes的包管理工具Helm的安装和使用
1.源码安装 [root@master ~]# wget https://storage.googleapis.com/kubernetes-helm/helm-v2.14.0-linux-amd64 ...
- 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize
前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...
- 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress
前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...
- 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis
前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...
- 使用 Helm 包管理工具简化 Kubernetes 应用部署
当在 Kubernetes 中已经部署很多应用时,后续需要对每个应用的 yaml 文件进行维护操作,这个过程会变的很繁琐,我们可以使用 Helm 来简化这些工作.Helm 是 Kubernetes 的 ...
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...
- 云原生之旅 - 8)云原生时代的网关 Ingress Nginx
前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...
- 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents
前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...
随机推荐
- Linux 01 概述
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 简介 Linux ...
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- ASP.NET CORE在docker中的健康检查(healthcheck)
在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错误的发生,同时,合理 ...
- 【JavaWeb】学习路径1-背景
JavaWeb系列也是一个非常庞大的系列,主要分为五个部分讲解: HTML JSP和Servlet CSS的讲解 JavaScrip的讲解 jQuery框架的讲解 学习完上述内容后,就能够基本了解一个 ...
- 高颜值,类似Fliqlo的翻页时钟-BdTab新标签页插件组件
起因: 很多用户在使用BdTab插件时,反馈说希望添加一个时钟的功能, 而BdTab又是组件模块化的插件,于是在空余时间就用html+js+css写了一款高颜值的分页时钟 源码如下: 需要其他网页组件 ...
- ESP8266 NONOS SDK学习
一.概况 1.存储 ESP8266 带有 160 KB 的 RAM,其中 64 KB 为 iRAM,96 KB 为 dRAM.iRAM 进一步 分成两块:32 KB iRAM 块运行标有 IRAM_A ...
- Spring集成测试
Spring 集成测试 需要再类的头部加入 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath ...
- 通过VS下载的NuGet包,如何修改其下载存放路径?
一.了解NuGet包的默认存放路径 我们通过NuGet包管理器下载的引用包,默认是存放在C盘的,存储路径一般是: C:\Users\{系统用户名}\.nuget\packages 我们都知道,C盘的存 ...
- Erda 开源的迷失和反思
前言 Erda 是我从2018年初加入上家公司直到今年初离开的四年时间里一直在做的一个云原生 PaaS 平台.在开源之前,Erda 在公司内部的名字代号是 D ,在21年初改名为现在的 Erda 进行 ...
- Html飞机大战(十七): 优化移动端
好家伙,继续优化, 好家伙,我把我的飞机大战发给我的小伙伴们玩 期待着略微的赞赏之词,然后他们用手机打开我的给他们的网址 然后点一下飞机就炸了. 游戏体验零分 (鼠标点击在移动端依旧可以生效) 好 ...