..

Helm入门指南

我一直都觉得学习k8s后,不需要急于接触helm。当你有需要将一个服务部署到多个环境的时候、或者是需要频繁修改一个服务的部署的时候,你才需要helm。

这里不做过多的helm知识总结,官方的文档体系已经挺完备了。这里只分享下我认为更好的入门helm的方式

更好的入门方式

我觉得helm除了要学习其生命周期与几个常用的命令之外,日常经常要面对的就是Go语言的基本模板语法与SPrig模板语库。如果你本来就很熟悉Go语言、及其SPrig库,那么你跟着官网的文档走,大概没有太大问题。但是如果你不熟悉,就要一下子面对一堆陌生的模板语法。除了模板语法之外,helm初始化出来的Chart或者别人写好的Chart都有点"太全面"了。作为初学的模板,干扰太多。

所以我的建议是,从空的Chart开始手写Chart。你可以把先前k8s里的Deployment实践拿出来,改成一个Chart。让我们来操作下:

# 新建个chart -- myredis
$ helm create myredis

# 清空这个chart的内容。注意:下面有rm -r命令,小心操作!
$ cd myredis
$ rm -r ./charts
$ rm -r ./templates
$ echo '' > values.yaml
$ tree 
.
├── Chart.yaml   # Chart.yaml的内容很少,也暂时不重要,所以不理会
└── values.yaml  # values.yaml是空的

0 directories, 2 files

这样,我们就得到一个空的chart了。即便是空的chart,也是合法的chart,不信安装试试:

$ helm install myredis .
NAME: myredis
LAST DEPLOYED: Sun Nov 19 17:55:25 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

$ helm ls
NAME   	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART         	APP VERSION
myredis	default  	1       	2023-11-19 17:55:25.544696 +0800 CST	deployed	my-redis-0.1.0	1.16.0     

# 当然,因为是空的chart,所以不会真的创建出什么pod
$ kubectl get pods
No resources found in default namespace.

让我们把k8s官方的Guestbook实践例子中的leader-redis部署起来。

# 把删除的templates目录加回来
$ mkdir templates

# 直接下载k8s官方的yaml文件,分别命名为deployment.yaml与service.yaml,放在templates目录。
# 如果wget下载不了,就手动去Guestbook教程里去复制吧!
$ wget https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/guestbook/redis-leader-deployment.yaml -O templates/deployment.yaml
$ wget https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/guestbook/redis-leader-service.yaml -O templates/service.yaml

# 加完之后的结构如下:
$ tree .
.
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

1 directory, 4 files

# 然后升级下刚才安装的myredis这个release,在查看对应的一些资源是否创建出来了
$ helm upgrade myredis .
Release "myredis" has been upgraded. Happy Helming!
NAME: myredis
LAST DEPLOYED: Sun Nov 19 18:06:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

$ kubectl get pods
NAME                            READY   STATUS              RESTARTS   AGE
redis-leader-5596fc7b68-mgjx9   0/1     ContainerCreating   0          9s

$ kubectl get services
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.96.0.1      <none>        443/TCP    31h
redis-leader   ClusterIP   10.100.238.1   <none>        6379/TCP   12s

按这个结构去写,跟裸写k8s yaml没什么区别。然后你可以慢慢加入一些变量、慢慢使用helm的模板语言,随着需要与学习的深入,引入更多元素。

这样入门的好处是,可以让你抓住helm这个工具的本质意义:生成k8s yaml模板以及管理这些模板的版本。

希望这种入门方式对你有用。