kubernetes系列:(三)、helm的安裝和使用


一、helm簡介

kubernetes : 解決了容器維護的難題,通過yaml編寫,比如deployment,job,statefulset、configmap等等,通過控制循環,讓容器鏡像便於管理,集群維護難度大減(google 15年 生產負載經驗,每周維護數十億容器)

管理應用過程中,維護一系列yaml文件,學習成本有點高。

所以Helm來了,Helm 定義了一套 Chart 格式來描述一個應用。打個比方,一個安卓程序打包成 APK 格式,就可以安裝到任意一台運行安卓系統的手機上。如果我們把 kubernetes 比做安卓系統,kubernetes 應用比做安卓程序,那么 Chart 就可以比做 APK。這也意味着,kubernetes 應用只要打包成 Chart,就可以通過 Helm 部署到任意一個 kubernetes 集群上。

Helm 社區已經維護了一個官方 Helm Hub,我們可以直接使用別人已經做好的 Helm Chart,如下圖,通過helm能更簡單的管理比較復雜的應用程序。

 

所以對於我們來說:

面向java編程:java文件

面向docker編程:dockerfile

面向kubernetes編程:yaml

面向helm編程:chart

 

二、helm部署

helm現在最新版本是Helm v3.0.0-alpha.2 ,是大版本更新,不需要安裝服務端組件 Tiller。

1. 下載

 github下載release版本:博主下載的是amd64  具體可以通過  lsb_release -a     查看系統版本

2. 安裝

# 解壓文件
tar -zxvf helm-v3.0.0-alpha.2-linux-amd64.tar.gz

# 拷貝 helm 指令放到bin目錄下
cp linux-amd64/helm  /usr/local/bin/

# 驗證
helm help

3. 初始化

helm init

4. 常用命令介紹

# 查找
helm search nginx 

# 安裝
helm install 

 

三、試做一個hello-world

1. 創建my-hello-world的chart

# 在文件夾下,執行命令
helm create my-hello-world

對應文件夾下下出現my-hello-world子目錄,就是helm自動生成的空chart,這個chart里的名稱是my-hello-world

需要注意的是,Chart里面的my-hello-world名稱需要和生成的Chart文件夾名稱一致。如果修改my-hello-world,則需要做一致的修改。

在根目錄下的Chart.yaml文件內,聲明了當前Chart的名稱、版本等基本信息,這些信息會在該Chart被放入倉庫后,供用戶瀏覽檢索。

# 進入文件夾
[root@cbov10-sso55-113 kubernetes]# cd my-hello-world/
[root@cbov10-sso55-113 my-hello-world]# ll
total 8
drwxr-x--- 2 root root    6 Aug 21 15:52 charts
-rw-r----- 1 root root  912 Aug 21 15:52 Chart.yaml
drwxr-x--- 2 root root  106 Aug 21 15:52 templates
-rw-r----- 1 root root 1067 Aug 21 15:52 values.yaml

templates目錄下,存kubernetes相關的yaml文件,如下:deployment.yaml,service.yaml

[root@cbov10-sso55-113 my-hello-world]# cd templates/
[root@cbov10-sso55-113 templates]# ll
total 20
-rw-r----- 1 root root 1357 Aug 21 15:52 deployment.yaml
-rw-r----- 1 root root 1457 Aug 21 15:52 _helpers.tpl
-rw-r----- 1 root root  910 Aug 21 15:52 ingress.yaml
-rw-r----- 1 root root 1320 Aug 21 15:52 NOTES.txt
-rw-r----- 1 root root  430 Aug 21 15:52 service.yaml

2.Chart說明和配置

Helm Chart對於應用的打包,不僅僅是將Deployment和Service以及其它資源整合在一起。我們看到deployment.yaml和service.yaml文件被放在templates/文件夾下,相較於原生的Kubernetes配置,多了很多渲染所用的可注入字段。比如在deployment.yaml的spec.replicas 中,使用的是  .Values.replicaCount  而不是Kubernetes本身的靜態數值。這個用來控制應用在Kubernetes上應該有多少運行副本的字段,在不同的應用部署環境下可以有不同的數值,而這個數值便是由注入的 Values 提供。

在根目錄下我們看到有一個values.yaml文件,這個文件提供了應用在安裝時的默認參數。在默認的Values中,我們看到 replicaCount: 1說明該應用在默認部署的狀態下只有一個副本。

為了使用我們要部署應用的鏡像,我們看到deployment.yaml里在  spec.template.spec.containers  里,imageimagePullPolicy都使用了Values中的值。其中image字段由  .Values.image.repository  和  .Chart.AppVersion  組成。看到這里,同學們應該就知道我們需要變更的字段了,一個是位於values.yaml內的    image.repository  ,另一個是位於Chart.yaml里的    AppVersion 。我們將它們與我們需要部署應用的docker鏡像匹配起來。

這里我們把values.yaml里的  image.repository  設置成somefive/hello-world,把Chart.yaml里的  AppVersion  設置成1.0.0即可。

類似的,我們可以查看service.yaml內我們要部署的服務,其中的主要配置也在values.yaml中。默認生成的服務將80端口暴露在Kubernetes集群內部。我們暫時不需要對這一部分進行修改。

由於部署的hello-world服務會從環境變量中讀取USERNAME環境變量,我們將這個配置加入deployment.yaml。相關部分如下:

- name: {{ .Chart.Name }}
  image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
  imagePullPolicy: {{ .Values.image.pullPolicy }}
  env:
    - name: USERNAME
      value: {{ .Values.Username }}

現在我們的deployment.yaml模版會從values.yaml中加載Username字段,因此相應的,我們也在values.yaml中添加Username: AppHub

 3.打包使用

 完成上述配置后,我們可以使用

helm lint --strict my-hello-world

進行格式檢查。顯示

1 chart(s) linted, 0 chart(s) failed
    [INFO] Chart.yaml: icon is recommended

表示正常

接下來,我們運行

helm package my-hello-world

指令對我們的Chart文件夾進行打包。現在我們就得到了 my-hello-world-0.1.0.tgz 的Chart包。到這一步我們的Chart便已經完成了。

 之后,運行

helm install my-hello-world-chart-test my-hello-world-0.1.0.tgz

來將本地的chart安裝到my-hello-world-chart-test的Release中。運行 kubectl get pods 我們可以看到要部署的pod已經處於運行狀態

NAME                                         READY   STATUS    RESTARTS   AGE
my-hello-world-chart-test-65d6c7b4b6-ptk4x   1/1     Running   0          4m3s

運行

  kubectl port-forward my-hello-world-chart-test-65d6c7b4b6-ptk4x 8080:80

后,就可以直接在本地運行

curl localhost:8080

看到 Hello AppHub 了!

 4.進階使用

上述提到values.yaml只是Helm install參數的默認設置,我們可以在安裝Chart的過程中使用自己的參數覆蓋。比如我們可以運行

helm install my-hello-world-chart-test2 my-hello-world-0.1.0.tgz --set Username="Cloud Native"

來安裝一個新Chart。同樣運行

kubectl port-forward

進行端口映射,這時可以得到  Hello Cloud Native。用 kubectl get pod -owide 命令也可以,如下圖

我們注意到在安裝Chart指令運行后,屏幕的輸出會出現

NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l "app=my-hello-world,release=my-hello-world-chart-test2" -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

這里的注釋是由Chart中的  templates/NOTES.txt,提供的。我們注意到原始的NOTES中,所寫的

"app={{ template "my-hello-world.name" . }},release={{ .Release.Name }}"

和我們的deployment.yaml中所寫的配置不太一樣。我們可以把它改成

"app.kubernetes.io/name={{ template "my-hello-world.name" . }},app.kubernetes.io/instance={{ .Release.Name }}"

,將values.yaml中的version更新成0.1.1。然后重新打包Chart(運行helm package)。得到新的my-hello-world-0.1.1.tgz之后,重新安裝Chart(運行

helm install my-hello-world-chart-test3 my-hello-world-0.1.1.tgz --set Username="New Chart"

),就能看到更新過后的NOTES了。

NAME: my-hello-world-chart-test3
LAST DEPLOYED: 2019-07-10 14:02:55.321468411 +0800 CST m=+0.091032750
NAMESPACE: default
STATUS: deployed

NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=my-hello-world,app.kubernetes.io/instance=my-hello-world-chart-test3" -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

5.其他

Helm Chart還有諸如dependency等其他功能,更加詳細的資料可以參考Helm官方文檔的相關章節

 

參考

1.阿里雲 helm chart 創作指南

2.helm官網(3.0版本的doc)

【倒計時 6 天!雲原生應用大賽火熱報名中】9月2日前,使用任意語言開發一個可以被容器化、運行在 K8s 上的應用,並把該應用做成 Helm Charts 格式提交即可參賽!蘋果 Airpods,Cherry鍵盤、天貓精靈等豐厚禮品等你拿!

還來得及,加油。

 

感謝您的觀看和支持。

如有疏漏請及時聯系。感謝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM