kubernetes1.9之helm

helm簡介

很多人都使用過Ubuntu下的ap-get或者CentOS下的yum, 這兩者都是Linux系統下的包管理工具。採用apt-get/yum,應用開發者可以管理應用包之間的依賴關係,發佈應用;用戶則可以以簡單的方式查找、安裝、升級、卸載應用程序。

我們可以將Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 開發的一個用於kubernetes的包管理器。每個包稱爲一個Chart,一個Chart是一個目錄(一般情況下會將目錄進行打包壓縮,形成name-version.tgz格式的單一文件,方便傳輸和存儲)。

對於應用發佈者而言,可以通過Helm打包應用,管理應用依賴關係,管理應用版本併發布應用到軟件倉庫。

對於使用者而言,使用Helm後不用需要了解Kubernetes的Yaml語法並編寫應用部署文件,可以通過Helm下載並在kubernetes上安裝需要的應用。

除此以外,Helm還提供了kubernetes上的軟件部署,刪除,升級,回滾應用的強大功能。

Helm 組件及相關術語

Helm

Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程序 Chart 的創建、打包、發佈以及創建和管理本地和遠程的 Chart 倉庫。

Tiller

Tiller 是 Helm 的服務端,部署在 Kubernetes 集羣中。Tiller 用於接收 Helm 的請求,並根據 Chart 生成 Kubernetes 的部署文件( Helm 稱爲 Release ),然後提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。

Chart

Helm 的軟件包,採用 TAR 格式。類似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件。

Repoistory

Helm 的軟件倉庫,Repository 本質上是一個 Web 服務器,該服務器保存了一系列的 Chart 軟件包以供用戶下載,並且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 可以同時管理多個不同的 Repository。

Release

使用 helm install 命令在 Kubernetes 集羣中部署的 Chart 稱爲 Release。

注:需要注意的是:Helm 中提到的 Release 和我們通常概念中的版本有所不同,這裏的 Release 可以理解爲 Helm 使用
Chart 包部署的一個應用實例。

Helm工作原理

在這裏插入圖片描述

Chart Install 過程:
  1. Helm從指定的目錄或者tgz文件中解析出Chart結構信息
  2. Helm將指定的Chart結構和Values信息通過gRPC傳遞給Tiller
  3. Tiller根據Chart和Values生成一個Release
  4. Tiller將Release發送給Kubernetes用於生成Release
Chart Update過程:
  1. Helm從指定的目錄或者tgz文件中解析出Chart結構信息
  2. Helm將要更新的Release的名稱和Chart結構,Values信息傳遞給Tiller
  3. Tiller生成Release並更新指定名稱的Release的History
  4. Tiller將Release發送給Kubernetes用於更新Release
Chart Rollback過程:
  1. Helm將要回滾的Release的名稱傳遞給Tiller
  2. Tiller根據Release的名稱查找History
  3. Tiller從History中獲取上一個Release
  4. Tiller將上一個Release發送給Kubernetes用於替換當前Release

helm部署

Helm 客戶端安裝
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
tar xf helm-v2.12.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
Helm 服務端安裝Tiller

rbac配置文件

$ cat tiller-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
   
$ kubectl apply -f tiller-rbac.yaml

由於 Helm 默認會去 storage.googleapis.com 拉取鏡像,如果你當前執行的機器不能訪問該域名的話可以使用以下命令來安裝:

$ helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
$ helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
$ helm repo update
# 創建服務端
$ helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.2  --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
 
# 這步沒執行!創建TLS認證服務端,參考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
#$ helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.2 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

在 Kubernetes 中安裝 Tiller 服務,因爲官方的鏡像因爲某些原因無法拉取,使用-i指定自己的鏡像,可選鏡像:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1(阿里雲),該鏡像的版本與helm客戶端的版本相同,使用helm version可查看helm客戶端版本。

如果在用helm init安裝tiller server時一直部署不成功,檢查deployment,根據描述解決問題。

檢測tiller服務端

$ kubectl get service -n kube-system | grep tiller
tiller-deploy          ClusterIP   10.254.125.10    <none>        44134/TCP                24m

$ helm version --debug
Client: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}
[debug] Created tunnel using local port: '25838'

[debug] SERVER: "127.0.0.1:25838"

$ helm version --host 10.254.125.10:44134              
Client: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}

$ export HELM_HOST=10.254.125.10:44134
$ echo export HELM_HOST=10.254.125.10:44134 >>/etc/profile 
$ helm version
Client: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}

安裝成功!!

使用helm

helm默認使用的charts源地址是https://kubernetes-charts.storage.googleapis.com,需要替換爲阿里的helm源

helm repo list
NAME    URL                                                  
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local   http://127.0.0.1:8879/charts
# helm源已經變成國內的了,下面這兩步是移除默認源的,不需要執行
helm repo remove stable
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
# 添加incubator源,這個源是開發版的安裝包,用起來可能不穩定
helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
#列出charts倉庫中所有可用的應用
helm search
helm search mysql
helm inspect stable/mysql
# 用helm安裝軟件包,-name:指定release名字
helm install --name mysql1 stable/mysql
helm list # 查看安裝的軟件包
helm delete mysql1

helm常用命令

release管理:
    install
    delete
    upgrade/rollback
    list
    history:查看release歷史版本
    status:獲取release狀態信息
chart管理:
    create:創建一個chart,生成基礎chart示例性文件,供我們修改用
    fetch:下載倉庫中的一個char到本地
    get
    inspect
    package
    verify
 
# helm把安裝包下載到當前用戶的家目錄下
ll /root/.helm/cache/archive/
# 修改chart裏面的values.yaml實現定製,values.yaml文件中##是註釋,#是可開啓的參數
helm install --name mysql1 -f /root/values.yaml stable/mysql
metrics想要能被prometheus收集數據需要在metadata中將prometheus.io/scrape:設置爲true
metadata:
  annotations:
    prometheus.io/scrape: 'true'
# 部署完應用包後,查看release提示信息
helm status mysql1
helm fetch stable/redis
查看chart官方手冊,瞭解每個參數的含義https://docs.helm.sh/developing_charts/#charts
# 用helm生成基礎chart示例性文件,myapp是chart的名字
helm create myapp
# 做語法檢查
helm lint myapp
==> Linting myapp
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
# 打包
helm package myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
# 啓動8879倉庫的服務
helm serve
# 查看local倉庫裏面是否有我們創建的chart包
helm search myapp
# 部署我們自定義的chart
helm install --name myapp1 local/myapp
# 刪除我們部署的chart
helm delete --purge myapp1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章