技術工作坊系列——認識Helm
還在煩惱怎麼管理日益複雜的Kubernetes YAML檔嗎?Helm或許是你尋尋覓覓許久的解決方案
技術工作坊系列文章希望幫助工程師降低學習新技術的成本,我們用最基本的知識讓您有足夠的資訊判斷該不該跳坑學習新技術?我明白你學習新技術的心情:
IT產業日新月異,當我們被接踵而來的新技術淹沒時,變得戒慎恐懼,明白生命該浪費在美好的事物上,卻也擔心過於保守而錯過發現美好的可能性,該如何是好?無論你對新技術的出現是興奮還是厭倦,你都不得不跨出一步,才能知道他對你是否有幫助,我們希望幫你把這一步走完,也走得輕鬆。*每篇文章都會選定一個主題,盡可能限縮需要學習的知識,讓您用最少的時間掌握關鍵知識。
*在深入正文前,請務必閱讀服用須知,以免浪費您寶貴的時間。
服用須知
- 本文實作教學採用Mac OS實作(其他作業系統的操作大同小異),若你是極為需要其他作業系統教學的讀者請轉向。
- 學習Helm前,你應該要具備kubernetes的基礎知識與實作經驗。
為什麼要使用Helm?
Helm旨在幫助開發人員管理Kubernetes應用程式,當你發現你使用的Yaml檔越來越複雜,需要一套工具幫你管理版本、安裝、升級或樣板化時,導入Helm會讓你事半功倍。
Helm如何幫助我們管理Kubernetes應用程式?
在開發人員的電腦上安裝一個Helm Client,在Kubernetes Cluster上安裝一個稱為Tiller的Server,Helm Client會將描述Kubernetes應用程式的YAML檔打包成一個稱為Chart的資源,Tiller只要接收Helm Client的觸發,就會根據Chart來安裝新版的Kubernetes應用程式。
該如何安裝Helm?
你需要在Client端(開發人員的電腦上)與Server端(Kubernetes Cluster)都安裝好Helm。
Step1.在Client端,打開Helm Realese頁面下載二進制檔
Step2.將二進制檔放入作業系統的執行目錄:Mac OS的執行目錄為/usr/local/bin/
Step3.確認安裝版本:helm version

Step4.初始化helm:helm init #此指令會在server端安裝teller,並且在本地端建立必要的設定:

helm init會訪問kubernetes cluster中的apiserver,所以請確保kubectl能正常使用。
我沒有Kubernetes Cluster環境怎麼辦?如果你想在幾分鐘內快速建立一個Cluster,可以參考:https://medium.com/@jamesshieh0510/%E5%88%A9%E7%94%A8gcp%E5%BB%BA%E7%AB%8Bkubernetes-cluster-83c89ec10ee7利用GCP建立Cluster後,安裝gcloud工具可以讓你在自己的電腦上訪問GCP:https://medium.com/@jamesshieh0510/%E5%9C%A8mac%E4%B8%8A%E5%AE%89%E8%A3%9Dgcp-cloud-sdk-1ad7f5fb4275
Step5.檢查安裝結果: kubectl get pod -n kube-system -l app=helm

Step6.建立訪問Helm的ServiceAccount:
touch ./rbac-for-helm.yaml
cat <<EOF | sudo tee ./rbac-for-helm.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
EOF
kubectl create -f ./rbac-for-helm.yaml
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'如何使用Helm?
建立一個helm chart:helm create hello-helm

此指令會建立一個chart,我們可以看到一個chart的目錄結構,我們會以這個chart當作Template去改寫我們的 kubernetes應用程式。
如果你覺得helm值得深入了解,想知道目錄結構中的各個檔案該如何使用,可以參考這篇:https://helm.sh/docs/developing_charts/#charts
這裏我們不做任何修改,直接利用helm install指令將chart佈署到Kubernetes Cluster上:

查看佈署結果,請執行以下指令:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=hello-helm,app.kubernetes.io/instance=eloping-ibex" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80打開瀏覽器,輸入網址:127.0.0.1:8080

使用Helm的益處
藉由簡單的實作練習,我們可以發現Helm可以快速的建立好YAML樣板,預設的樣板已經包含nginx,所以我們可以直接看到佈署畫面,除此之外,官方也有一個helm hub平台提供各式各樣的Chart,幫我們省下撰寫YAML檔的時間。
Helm也提供很方便的工具,整合cluster與開發人員間的工作,像是部署yaml、測試等等。
Reference:
- Chart的結構與詳細說明:https://helm.sh/docs/developing_charts/#charts
- Helm的操作指令:https://helm.sh/docs/helm/

