FuFu KK8s
  • K~K8s index
  • Kubernetes 的基礎世界
  • Why container is not Docker
  • Startup Local Kubernetes via Minikube
  • K8s Master node Component 介紹
  • NameSpace、Deployments 概念說明
  • 常見的 kubectl 指令
  • 回顧第一次部署,淺談 Pod、Deployment
  • 回顧第一次部署,淺談 Service
  • 今日來介紹 Pod 靜態文件~ Manifest
  • Pod 的健康檢查方式
  • Pod 的健康檢查方式 Part-2
  • Pod 的資源請求、上限
  • Pod 資料,如何持久化存放、讀取
  • Pod 副本管理~ 描述 ReplicaSet 控制器
  • Pod 副本管理~ 實作篇
  • 淺談 DaemonSet,及相對 ReplicaSet 的差異
  • 來說說 Label
  • 從 Label 再回頭談 Service
  • Service 續集之 Cluster IP、Kube-proxy、LoadBalancer
  • 從 Service 發現 K8s 網路層全貌
  • Container Data Persistent
  • 發現、初談 StatefulSet
  • 再談 StatefulSet
  • 認識 ConfigMap
  • 第一次使用 Play with Kubernetes
  • 手工 Installing kubeadm
  • 手工 Installing CRI-O、kubeadm init
  • 繼上篇,排查 kubelet、kubeadm init 問題
  • Installing a pod network add-on
  • K8s add Nodes(join)
  • 驗證自建的 K8s
  • 筆記
    • kubectl get 筆記
    • kubectl 部署筆記
    • kubectl describe nodes
  • 實務記憶篇
    • 整理下記憶
    • 有哪些 Kubernetes 雲端服務
    • 如何從本機連線至 GKE Pod
    • GCP Memorystore 服務介紹
    • 如何連線至 GCP Memorystore
    • GCP Cloud SQL 服務介紹
    • 如何連線至 Cloud SQL
    • 關於 GCP VPC 網路
    • HELM 工具用途
    • 臨時題目:查修 prometheus
    • 繼續離題:繼續查修Prometheus
    • 臨時題目:限定 Pod 訪問外網時,固定 public ip
    • K8s 監控數據來源 Prometheus
    • 監控要告警啊 AlertManager
    • 監控要有圖表啊 Grafana
    • Grafana收集Kubernetes系統資訊
    • 系統 Log 資料
    • 系統 Log 資料收集至 EFK
    • 關於 EFK 角色
    • 系統 Log 資料 - fluent-bit 串接
    • 開放網站對外存取
    • 網站提供 https 安全連線服務 - 憑證管理
    • 網站提供 https 安全連線服務 - 憑證與Ingress整合
    • 網站提供 https 安全連線服務 - Istio 範例
    • 需要額外的 非http 連線
    • Istio 初略介紹
    • Istio 整合 Certmanager DNS01
    • 番外篇:Istio 如何限制訪問來源
    • 番外篇:如何擴充 PV PVC storage size
    • 番外篇:如何利用 Binlog 還原資料庫
  • Helm 實務學習心得
    • Helm requirements 見解
    • 同環境,一次部署多個相同App
  • Python
    • 11-1 Firebase 資料庫簡介
Powered by GitBook
On this page
  • Helm requirements 什麼用途
  • Istio Chart 範例
  • Chart \ requirements \ values 三項相依關係
  • 最近重新認識了 Helm requirements.yaml 資訊面向
  1. Helm 實務學習心得

Helm requirements 見解

Previous番外篇:如何利用 Binlog 還原資料庫Next同環境,一次部署多個相同App

Last updated 5 years ago

有使用 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 內容

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 內容:

# 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。

# 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 設計

{{- 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 內容如下:

gateways:
  enabled: true
  istio-ingressgateway:
    enabled: true
  istio-egressgateway:
    enabled: true

我的實務錯誤省思

當時我為了設定參數externalTrafficPolicy,故使用了以下的 values 內容

gateways:
  enabled: true
  externalTrafficPolicy: Local

執行了指令:helm install istio.io/istio -f ./values.yaml --dry-run --debug 出現以下錯誤訊息:

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 環境。