有使用 Helm 套件來管理 Kubernetes 應用服務的人都知道,應用服務是被封裝在 Helm Chart 之中。
Helm requirements 什麼用途
Helm Chart 基本用途就是單一應用服務的套件包概念,如同在使用 CentOS 中安裝單一套件概念依樣(yum install httpd),但如果有數個應用服務搭建成一套完整性系統,就需要多個 Chart,為此管理方便,便有了 requirements 相依性設計概念。
例如:我需要完整一套網站服務平台,需要「網站伺服器、快取服務、負載平衡服務、資料庫服務」,那就需要這些 chart:Nginx、PHP、Redis、HAProxy、MySQL 等等,
如果,你不想一個一個獨立安裝,則可以在主要的 chart 中建立 requirements.yaml 進行相依性管理,即可一次安裝上述服務套件。(此段敘述是我舉例。)
Istio Chart 範例
我從 Istio Chart 範例中呈現:Chart 結構、requirements.yaml 內容
Copy dependencies :
- name : gateways
version : 1.4.3
condition : gateways.enabled
- name : mixer
version : 1.4.3
condition : or mixer.policy.enabled mixer.telemetry.enabled
- name : pilot
version : 1.4.3
condition : pilot.enabled
- name : grafana
version : 1.4.3
condition : grafana.enabled
- name : prometheus
version : 1.4.3
condition : prometheus.enabled
- name : tracing
version : 1.4.3
condition : tracing.enabled
- name : galley
version : 1.4.3
condition : galley.enabled
- name : kiali
version : 1.4.3
condition : kiali.enabled
# 以上僅是截取部分內容
再來是 Istio values.yaml 內容:
Copy # Gateways Configuration, refer to the charts/gateways/values.yaml
# for detailed configuration
#
gateways :
enabled : true
#
# addon grafana configuration
#
grafana :
enabled : false
#
# addon prometheus configuration
#
prometheus :
enabled : true
#
# addon jaeger tracing configuration
#
tracing :
enabled : false
#
# addon kiali tracing configuration
#
kiali :
enabled : false
#
# galley configuration, refer to charts/galley/values.yaml
# for detailed configuration
#
galley :
enabled : true
# 以上僅是截取部分內容
上述的 values.yaml 明確擷取出 Chart 的關鍵資訊:enabled: true \ false
此部分影響著,該套件服務是否安裝。
Chart \ requirements \ values 三項相依關係
最近重新認識了 Helm requirements.yaml 資訊面向
實務心得1:
values.yaml 內容中的第一階層:gateways、grafana...galley
等等,是呼應到Chart name,也是等同 requirements.yaml 內容中的 dependencies.name
。
另外,如在 requirements 內容中定義了 alias
別名概念,則 values.yaml 內容中第一階層名稱 gateways
對應到 requirements.yaml 內容中的 dependencies.alias
。
Copy # values.yaml 內容
# Gateways Configuration, refer to the charts/gateways/values.yaml
# for detailed configuration
#
gateways :
enabled : true # 呼應 requirements.yaml condition
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# requirements.yaml 內容
dependencies :
- name : gateways
condition : gateways.enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 應用 alias 的 requirements.yaml 內容
dependencies :
- name : app-gateways
condition : gateways.enabled
alias : gateways
實務心得2:
來看下 Istio gateway chart 內容中的 templates/serviceaccount.yaml 設計
Copy {{- range $key , $spec := .Values }}
{{- if ne $key "enabled" }}
{{- if $spec.enabled }}
apiVersion : v1
kind : ServiceAccount
metadata :
name : {{ $key }} -service-account
namespace : {{ $spec.namespace | default $.Release.Namespace }}
labels :
app : {{ $spec.labels.app }}
# 以下省略
這裡使用兩個變數$key \ $spec
作為鍵組合 值,來呼應 values.gateways 裡頭定義了複數個元件服務:istio-ingressgateway \ istio-egressgateway
。
這時合理的 values 內容如下:
Copy gateways :
enabled : true
istio-ingressgateway :
enabled : true
istio-egressgateway :
enabled : true
我的實務錯誤省思
當時我為了設定參數externalTrafficPolicy
,故使用了以下的 values 內容
Copy gateways :
enabled : true
externalTrafficPolicy : Local
執行了指令:helm install istio.io/istio -f ./values.yaml --dry-run --debug
出現以下錯誤訊息:
Copy Error: INSTALL FAILED: render error in "istio/charts/gateways/templates/serviceaccount.yaml": template: istio/charts/gateways/templates/serviceaccount.yaml:3:12: executing "istio/charts/gateways/templates/serviceaccount.yaml" at <$spec.enabled>: can't evaluate field enabled in type interface {}
會出現錯誤的原因在於 values.yaml 內容中第三行externalTrafficPolicy: Local
在 gateways
作為第一階 values,externalTrafficPolicy
則被視為第二階 values,回顧上述 實務心得2 會發現,第二階代表著 $key,並且 helm 會解析 enabled 參數。
很明顯,會出錯的原因就是誤將第二階設定為 key-value 組合鍵,helm 解析失敗。
這次的錯誤,讓我重新認識了 helm values \ requirements \ chart 三方的關聯。
學習到 Istio 如何應用多個 chart 應用套件來部署 ISTIO 環境。