Helm是什么隙疚?
The package manager for Kubernetes
helm之于k8s就類(lèi)似于yum之于centos、apt之于ubuntu磕道、brew之于Mac的這種關(guān)系供屉,簡(jiǎn)而言之,helm就是k8s的包管理工具溺蕉。
為什么會(huì)有Helm
我們知道k8s有各種各樣的資源伶丐,比如Deployment、Pod疯特、Service等等哗魂,這些資源最終可以構(gòu)成了一個(gè)應(yīng)用,比如在k8s里面業(yè)務(wù)通常需要三個(gè)資源
-
Deployment
服務(wù)描述漓雅,比如:
Pod副本數(shù)據(jù)录别、服務(wù)鏡像朽色,資源限制等等
-
Service
將一組同一特性的Pod抽象聚合為一個(gè)服務(wù)
-
Ingress
將應(yīng)用從k8s里面暴露出來(lái)
...
當(dāng)然還可能需要定義其它資源比如ConfigMap等,每一種資源的定義都可以用一個(gè)YAML文件來(lái)描述组题,所以想要在k8s里面部署一個(gè)常規(guī)業(yè)務(wù)葫男,你可能需要根據(jù)k8s的描述規(guī)則編寫(xiě)以上三種資源(當(dāng)然也可以合并在一個(gè)文件里頭)
- deployment.yaml
- service.yaml
- ingress.yaml
然后部署的時(shí)候逐一執(zhí)行
kubectl apply deployment.yaml
...
隨著業(yè)務(wù)的增加這樣做的負(fù)擔(dān)比較明顯,而且容易出錯(cuò)崔列,資源的編寫(xiě)也沒(méi)有一定的規(guī)范梢褐,其實(shí)對(duì)于一個(gè)業(yè)務(wù)服務(wù)來(lái)講,它需要哪些資源從一開(kāi)始就應(yīng)該是確定赵讯,比如fun-server需要Deployment利职、Service、Ingress這三種資源瘦癌,那么這三種資源就描述了fun-server部署到k8s里面的形態(tài),即這三個(gè)資源組合定義了k8s中的應(yīng)用:fun-server跷敬。于是Helm應(yīng)運(yùn)而生讯私,它定義了一個(gè)k8s應(yīng)用的組成以及簡(jiǎn)化了應(yīng)用的編寫(xiě),并且定義了一套規(guī)范西傀。
Helm的應(yīng)用
我們來(lái)嘗試一下斤寇,用Helm創(chuàng)建一個(gè)應(yīng)用
? ~ helm create fun-server
Creating fun-server
看看有哪些文件
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
└── values.yaml
哇,這樣我就不必從頭編寫(xiě)一個(gè)k8s應(yīng)用的資源了拥褂,畢竟它很多娘锁,很多,這個(gè)初始化可省了不少事饺鹃,我們來(lái)看看里面有什么莫秆?
一個(gè)名詞chart
是描述k8s應(yīng)用的資源集合,也被稱(chēng)為helm打包的格式悔详,嗯镊屎,一個(gè)名詞而已,helm與chart通常是一起出現(xiàn)的
Chart.yaml
apiVersion: v2
name: fun-server
description: A Helm chart for Kubernetes
...
很顯然茄螃,有我們的包的版本號(hào)缝驳、包名、描述以及其它归苍,重要的是templates文件夾用狱,先來(lái)看一下deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "fun-server.fullname" . }}
labels:
{{- include "fun-server.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
...
我們看到在{{
與}}
是需要模板渲染的,而這些值我猜在values.yaml
里面
# Default values for fun-server.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
...
果然如此拼弃,聰明如我, charts
文件夾是空的夏伊,它是用來(lái)存在應(yīng)用依賴(lài)的,我們來(lái)看一個(gè)樣例elastic-stack
.
├── Chart.yaml
├── OWNERS
├── README.md
├── charts
│ ├── elasticsearch
│ ├── elasticsearch-curator
│ ├── elasticsearch-exporter
│ ├── filebeat
│ ├── fluent-bit
│ ├── fluentd
│ ├── fluentd-elasticsearch
│ ├── kibana
│ ├── logstash
│ └── nginx-ldapauth-proxy
├── requirements.lock
├── requirements.yaml
├── templates
│ ├── NOTES.txt
│ └── _helpers.tpl
└── values.yaml
比如我需要搭建一個(gè)ELK日志平臺(tái)肴敛,可能需要elasticsearch
署海、kibana
吗购、logstash
等組件,這太有意思了砸狞,helm能描述一個(gè)依賴(lài)應(yīng)用組捻勉,可以理解為先安裝應(yīng)用依賴(lài),不存在就創(chuàng)建刀森,依賴(lài)存在再部署應(yīng)用本身踱启,這比健康檢查還好的地方在于getOrCreate
的能力,
這太有想像力研底,這意味著埠偿,如果應(yīng)用資源描述得當(dāng),比如我有100個(gè)應(yīng)用榜晦,存在著層級(jí)依賴(lài)冠蒋,最終通過(guò)root
的應(yīng)用包的安裝即可完成整個(gè)應(yīng)用的安裝,so cool!
比如我要在k8s集群里面部署ELK
, 本來(lái)我需要分別安裝elasticsearch
乾胶、kibana
抖剿、logstash
等組件, 然后再配置整合,不過(guò)現(xiàn)在一條命令就能搞定
helm install stable/elastic-stack --generate-name
so easy!
以上示例中我使用的是helm的v3
版本识窿,只是揭開(kāi)了helm功能的冰山一角斩郎,就使用體驗(yàn)而言,helm是kubectl基本的功能封裝加強(qiáng)版本喻频,畢竟kubectl只是腳手架而已缩宜,so now, enjoy helm。
Refer: