k8s包管理工具helm - 介紹和安裝

一、Kubernetes 應用部署的挑戰

Kubernetes 是一個提供了基於容器的應用集羣管理解決方案,Kubernetes 爲容器化應用提供了部署運行、資源調度、服務發現和動態伸縮等一系列完整功能。
Kubernetes 的核心設計理念是: 用戶定義要部署的應用程序的規則,而 Kubernetes 則負責按照定義的規則部署並運行應用程序。若是應用程序出現問題致使偏離了定義的規格,Kubernetes 負責對其進行自動修正。例如:定義的應用規則要求部署兩個實例(Pod),其中一個實例異常終止了,Kubernetes 會檢查到並從新啓動一個新的實例。
用戶經過使用 Kubernetes API 對象來描述應用程序規則,包括 Pod、Service、Volume、Namespace、ReplicaSet、Deployment、Job等等。通常這些資源對象的定義須要寫入一系列的 YAML 文件中,而後經過 Kubernetes 命令行工具 Kubectl 調 Kubernetes API 進行部署。git

以一個典型的三層應用 Wordpress 爲例,該應用程序就涉及到多個 Kubernetes API 對象,而要描述這些 Kubernetes API 對象就可能要同時維護多個 YAML 文件。
在進行 Kubernetes 軟件部署時,咱們面臨下述幾個問題:github

  • 如何管理、編輯和更新這些這些分散的 Kubernetes 應用配置文件。
  • 如何把一套相關的配置文件做爲一個應用進行管理。
  • 如何分發和重用 Kubernetes 的應用配置

二、Helm 是什麼

Helm 是 Deis 開發的一個用於 Kubernetes 應用的包管理工具,主要用來管理 Charts。有點相似於 Ubuntu 中的 APT 或 CentOS 中的 YUM。vim

Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。能夠在你部署應用的時候自定義應用程序的一些 Metadata,以便於應用程序的分發。api

對於應用發佈者而言,能夠經過 Helm 打包應用、管理應用依賴關係、管理應用版本併發布應用到軟件倉庫。bash

對於使用者而言,使用 Helm 後不用須要編寫複雜的應用部署文件,能夠以簡單的方式在 Kubernetes 上查找、安裝、升級、回滾、卸載應用程序。
作爲 Kubernetes 的一個包管理工具,Helm具備以下功能:
建立新的 chart
chart 打包成 tgz 格式
上傳 chart 到 chart 倉庫或從倉庫中下載 chart
在Kubernetes集羣中安裝或卸載 chart
管理用Helm安裝的 chart 的發佈週期服務器

三、Helm 組件及相關術語

本文中講到的是helm V2最新版本,V3版本也已經發布了beta版,在 Helm 3 中,Tiller 被移除了。併發

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

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

  • Chart
    包含了建立Kubernetes的一個應用實例的必要信息,Helm 的軟件包,採用 TAR 格式。相似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件。

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

  • Release
    是一個 chart 及其配置的一個運行實例,使用 helm install 命令在 Kubernetes 集羣中部署的 Chart 稱爲 Release。

四、Helm 工做原理

  • Chart Install 過程
    Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
    Helm 將指定的 Chart 結構和 Values 信息經過 gRPC 傳遞給 Tiller。
    Tiller 根據 Chart 和 Values 生成一個 Release。
    Tiller 將 Release 發送給 Kubernetes 用於生成 Release。

  • Chart Update 過程
    Helm 從指定的目錄或者 TAR 文件中解析出 Chart 結構信息。
    Helm 將須要更新的 Release 的名稱、Chart 結構和 Values 信息傳遞給 Tiller。
    Tiller 生成 Release 並更新指定名稱的 Release 的 History。
    Tiller 將 Release 發送給 Kubernetes 用於更新 Release。

  • Chart Rollback 過程
    Helm 將要回滾的 Release 的名稱傳遞給 Tiller。
    Tiller 根據 Release 的名稱查找 History。
    Tiller 從 History 中獲取上一個 Release。
    Tiller 將上一個 Release 發送給 Kubernetes 用於替換當前 Release。

  • Chart 處理依賴說明
    Tiller 在處理 Chart 時,直接將 Chart 以及其依賴的全部 Charts 合併爲一個 Release,同時傳遞給 Kubernetes。所以 Tiller 並不負責管理依賴之間的啓動順序。Chart 中的應用須要可以自行處理依賴關係。

Helm Client 是用戶命令行工具,其主要負責以下:

  • 本地 chart 開發
  • 倉庫管理
  • 與 Tiller sever 交互
  • 發送預安裝的 chart
  • 查詢 release 信息
  • 要求升級或卸載已存在的 release

Tiller Server是一個部署在Kubernetes集羣內部的 server,其與 Helm client、Kubernetes API server 進行交互。Tiller server 主要負責以下:
監聽來自 Helm client 的請求
經過 chart 及其配置構建一次發佈
安裝 chart 到Kubernetes集羣,並跟蹤隨後的發佈
經過與Kubernetes交互升級或卸載 chart
簡單的說,client 管理 charts,而 server 管理髮布 release

五、Helm 安裝

5.1 客戶端安裝

客戶端二進制文件下載地址:https://github.com/helm/helm/releases
解壓後將可執行文件helm拷貝到/usr/local/bin目錄下便可,這樣Helm客戶端就在這臺機器上安裝完成了。

[root@master01 helm-soft]# mv linux-amd64/helm /usr/local/bin/
[root@master01 helm-soft]# helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Error: could not find tiller

5.2 安裝服務端 Tiller

Tiller 是以 Deployment 方式部署在 Kubernetes 集羣中的,只需使用如下指令即可簡單的完成安裝,使用阿里雲鏡像安裝並把默認倉庫設置爲阿里雲上的鏡像倉庫

[root@master01 helm-soft]# helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
[root@master01 helm-soft]# kubectl get pods -n kube-system |grep tiller-deploy
tiller-deploy-6d99bc8567-zv9q8          1/1     Running   0          2m33s
[root@master01 helm-soft]# helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}

若是在初始化時報錯

Error: cannot connect to Tiller

解決方法爲在節點執行

yum install -y socat

5.3 給 Tiller 受權

由於 Helm 的服務端 Tiller 是一個部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它會去鏈接 Kube-Api 在 Kubernetes 裏建立和刪除應用。
而從 Kubernetes 1.6 版本開始,API Server 啓用了 RBAC 受權。目前的 Tiller 部署時默認沒有定義受權的 ServiceAccount,這會致使訪問 API Server 時被拒絕。因此咱們須要明確爲 Tiller 部署添加受權。詳細內容可見https://docs.helm.sh/using_helm/#role-based-access-control

[root@master01 helm]# pwd
/root/manifest/helm
[root@master01 helm]# vim 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
[root@master01 helm]# kubectl create -f rbac.yaml 
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

使用 kubectl patch 更新 API 對象,給 Tiller 打上一個 ServiceAccount 的補丁

[root@master01 helm]# kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment.extensions/tiller-deploy patched

查看受權是否成功

[root@master01 helm]# kubectl get deploy --namespace kube-system   tiller-deploy  --output yaml|grep  serviceAccount
      serviceAccount: tiller
      serviceAccountName: tiller

卸載 Helm 服務器端 Tiller
若是你須要在 Kubernetes 中卸載已部署的 Tiller,可以使用命令helm reset完成卸載。

5.4 Helm 命令補全

命令自動補全
爲了方便 helm 命令的使用,Helm 提供了自動補全功能
若是使用 ZSH 請執行

$ source <(helm completion zsh)

若是使用 BASH 請執行

$ source <(helm completion bash)
$ echo "source <(helm completion bash)" >> ~/.bashrc
相關文章
相關標籤/搜索