Helm命令最佳使用技巧

helm官方文檔

hi, bro, 最好的永遠(yuǎn)是官方文檔: https://helm.sh/zh/docs/

就是它上面的東西太多了寞冯,我知道你看得費(fèi)力,所以我給你總結(jié)了下面的常用命令

helm添加倉庫

helm repo add elastic https://helm.elastic.co
helm repo add gitlab https://charts.gitlab.io
helm repo add harbor https://helm.goharbor.io
helm repo add traefik https://traefik.github.io/charts

//添加國內(nèi)倉庫
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
helm repo list

搜索chart

  1. helm search repo traefik/traefik
  2. helm search repo nginx

安裝或者查看出錯(cuò)時(shí)

出現(xiàn)報(bào)錯(cuò) Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080

需要指定kubernetes api server地址,可以通過

helm --kube-apiserver address

安裝chart

  1. helm repo update
  2. helm install bitnami/mysql --generate-name

在 Helm 3 中睦番,必須主動(dòng)指定release名稱余黎,或者增加 --generate-name 的參數(shù)使Helm自動(dòng)生成

查看安裝的chart

  1. helm list(helm ls)

卸載chart

  1. helm uninstall mysql-xxx

安裝traefik

  1. 安裝traefik,并指定對(duì)應(yīng)參數(shù)
    helm install --set deployment.kind=DaemonSet --set namespaceOverride=traefik --set service.enabled=false traefik traefik/traefik

  2. 端口轉(zhuǎn)發(fā)慢洋,像訪問本地服務(wù)一樣訪問traefik
    kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" -n traefik --output=name) 9000:9000 -n traefik

  3. 更新服務(wù)
    helm upgrade --set deployment.kind=DaemonSet --set namespaceOverride=traefik --set service.enabled=false traefik traefik/traefik

  4. 配合Azure使用
    helm install --set deployment.kind=DaemonSet --set namespaceOverride=traefik --set service.annotations."service.beta.kubernetes.io/azure-load-balancer-internal"=true traefik traefik/traefik

安裝時(shí)報(bào)錯(cuò)內(nèi)存不足

0/2 nodes are available: 2 Insufficient memory. preemption: 0/2 nodes are available: 2 No preemption victims found for incoming pod

這是因?yàn)槲覀兊腸hart在安裝的時(shí)候,k8s集群內(nèi)存不足斤寇。

可以通過下面的命令查看node的內(nèi)存狀況

kubectl describe node 

可以在安裝的時(shí)候調(diào)整服務(wù)所需的內(nèi)存,CPU等名斟,也可以給集群加機(jī)器添加內(nèi)存。

查看chart信息

+. 查看基本信息: helm show chart traefik/traefik
+. 查看所有信息: helm show all traefik/traefik

查看chart的可配置選項(xiàng)

  1. helm show values traefik/traefik

然后枣察,你可以使用 YAML 格式的文件覆蓋上述任意配置項(xiàng),并在安裝過程中使用該文件

  1. echo '{web.port: 8080}' > values.yml
  2. helm install -f values.yml traefik/traefik --generate-name

還可以直接使用 --set web.port=8080 指定,優(yōu)先級(jí)比-f(--values)高

創(chuàng)建并安裝自己的charts

  1. helm create think-manifesto
  2. heml package think-manifesto
  3. helm install think-manifesto 上一步打包好的tgz包

debug chart而不安裝

helm install --debug --dry-run goodly-guppy ./mychart

這樣不會(huì)安裝應(yīng)用(chart)到你的kubenetes集群中,只會(huì)渲染模板內(nèi)容到控制臺(tái)

如果想看渲染出錯(cuò)的內(nèi)容,可以加上另外參數(shù)

helm install --dry-run --disable-openapi-validation moldy-jaguar ./mychart

調(diào)試

  • helm lint 是驗(yàn)證chart是否遵循最佳實(shí)踐的首選工具序目。
  • helm template --debug 在本地測(cè)試渲染chart模板臂痕。
  • helm install --dry-run --debug:我們已經(jīng)看到過這個(gè)技巧了,這是讓服務(wù)器渲染模板的好方法猿涨,然后返回生成的清單文件握童。
  • helm get manifest: 這是查看安裝在服務(wù)器上的模板的好方法。

helm template --dry-run --debug --disable-openapi-validation thinkpro-test .\think-manifesto\

helm內(nèi)置對(duì)象

https://helm.sh/zh/docs/chart_template_guide/builtin_objects/

Release

Release對(duì)象描述了版本發(fā)布本身叛赚。包含了以下對(duì)象:

  1. Release.Name: release名稱
  2. Release.Namespace: 版本中包含的命名空間(如果manifest沒有覆蓋的話)

Values

Values對(duì)象是從values.yaml文件和用戶提供的文件傳進(jìn)模板的澡绩。默認(rèn)為空

Chart

Chart.yaml文件內(nèi)容。 Chart.yaml里的所有數(shù)據(jù)在這里都可以可訪問的俺附。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 會(huì)打印出 mychart-0.1.0

常用函數(shù)

模板中頻繁使用的一個(gè)函數(shù)是default: default DEFAULT_VALUE GIVEN_VALUE肥卡。 這個(gè)函數(shù)允許你在模板中指定一個(gè)默認(rèn)值,以防這個(gè)值被忽略. 當(dāng)然還可以使用管道符配合使用,比如

drink: {{ .Values.favorite.drink | default "tea" | quote }}

刪除空白

{{- (包括添加的橫杠和空格)表示向左刪除空白事镣, 而 -}}表示右邊的空格應(yīng)該被去掉步鉴。 一定注意空格就是換行

要確保-和其他命令之間有一個(gè)空格。 {{- 3 }} 表示“刪除左邊空格并打印3”璃哟,而{{-3 }}表示“打印-3”氛琢。

模板的使用

我們一般會(huì)在_helpers.tpl中寫我們的模板代碼

聲明一個(gè)模板

{{- define "mychart.labels" }}
  labels:
    generator: helm
    date: {{ now | htmlDate }}
{{- end }}

使用模板

我們可以使用 template templateName 來引用我們的模板

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  {{- template "mychart.labels" }}

如果我們?cè)谀0?/p>

{- define "mychart.labels" }}
  labels:
    generator: helm
    date: {{ now | htmlDate }}
    chart: {{ .Chart.Name }}
    version: {{ .Chart.Version }}
{{- end }}

中使用 .Chart,會(huì)發(fā)現(xiàn)渲染出錯(cuò)(--disable-openapi-validation 可以查看渲染的內(nèi)容),這是因?yàn)闆]有內(nèi)容傳入到模板中(可以認(rèn)為默認(rèn)范圍是在模板),所以無法使用 . 訪問任何內(nèi)容. 需要傳遞一個(gè)范圍給模板

{{- template "mychart.labels" . }}

注意這個(gè)在template調(diào)用末尾傳入的.,我們可以簡(jiǎn)單傳入.Values或.Values.favorite或其他需要的范圍随闪。但一定要是頂層范圍阳似。

由于template是一個(gè)行為,不是方法铐伴,無法將 template調(diào)用的輸出傳給其他方法撮奏,數(shù)據(jù)只是簡(jiǎn)單地按行插入。

為了處理這個(gè)問題盛杰,Helm提供了一個(gè) include 的可選項(xiàng)挽荡,可以將模板內(nèi)容導(dǎo)入當(dāng)前管道,然后傳遞給管道中的其他方法即供。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  labels:
{{ include "mychart.app" . | indent 4 }}

相較于使用template定拟,在helm中使用include被認(rèn)為是更好的方式 只是為了更好地處理YAML文檔的輸出格式

使用技巧

配置更新后 Pod 自動(dòng)重啟

利用 k8s 的 Deployment 更改后的自動(dòng)更新,我們可以用來更新應(yīng)用配置逗嫡,簡(jiǎn)單說就是更新 Secrets 或 ConfigMaps 后青自,計(jì)算它的最新 hash 值,然后將這個(gè) hash 值 patch 到相應(yīng)的 Deployment 中驱证。

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

這樣延窜,假如這個(gè)配置有問題,比如造成應(yīng)用崩潰了抹锄,k8s 也會(huì)認(rèn)為新的 ReplicaSet 失敗了逆瑞,不會(huì)將流量導(dǎo)過去荠藤,從而不繼續(xù)滾動(dòng)更新,避免了了由配置更新導(dǎo)致的應(yīng)用崩潰問題获高。

Image pull credentials

有些時(shí)候哈肖,Docker 鏡像可能需要用戶名與密碼去 registry 拉取,那么念秧,你就需要專門為此創(chuàng)建一個(gè)模板了淤井。
比如 value 是:

imageCredentials:
  registry: quay.io
  username: someone
  password: sillyness

而模板就是:

{{- define "imagePullSecret" }}
{{- printf "{"auths": {"%s": {"auth": "%s"}}}" .Values.imageCredentials.registry (printf "%s:%s" .Values.imageCredentials.username .Values.imageCredentials.password | b64enc) | b64enc }}
{{- end }}

當(dāng)然,需要注意多個(gè) Deployment 共享一個(gè) Chart 的情況摊趾,這時(shí)候可能會(huì)出現(xiàn) secrets 沖突的情況币狠,可考慮單為此單獨(dú)創(chuàng)建一個(gè) Config Chart,然后作為 App Chart 的依賴砾层。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漩绵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梢为,更是在濱河造成了極大的恐慌渐行,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸董,死亡現(xiàn)場(chǎng)離奇詭異祟印,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粟害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蕴忆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悲幅,你說我怎么就攤上這事套鹅。” “怎么了汰具?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵卓鹿,是天一觀的道長。 經(jīng)常有香客問我留荔,道長吟孙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任聚蝶,我火速辦了婚禮杰妓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碘勉。我一直安慰自己巷挥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布验靡。 她就那樣靜靜地躺著倍宾,像睡著了一般雏节。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凿宾,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天矾屯,我揣著相機(jī)與錄音,去河邊找鬼初厚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛孙技,可吹牛的內(nèi)容都是我干的产禾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼牵啦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亚情!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哈雏,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤楞件,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后裳瘪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體土浸,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年彭羹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黄伊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡派殷,死狀恐怖还最,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毡惜,我是刑警寧澤拓轻,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站经伙,受9級(jí)特大地震影響扶叉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橱乱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一辜梳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泳叠,春花似錦作瞄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乌庶。三九已至,卻和暖如春契耿,著一層夾襖步出監(jiān)牢的瞬間瞒大,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工搪桂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透敌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓踢械,卻偏偏與公主長得像酗电,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子内列,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容