使用 helm 部署 k8s 資源

shanyue發表於2019-11-04

helm 是基於 kubernetes 的包管理器。它之於 kubernetes 就如 yum 之於 centospip 之於 pythonnpm 之於 javascript

helm 的引入對於管理叢集有哪些幫助呢?

  1. 更方便地部署基礎設施,如 gitlabpostgresprometheusgrafana
  2. 更方便地部署自己的應用,為公司內部的專案配置 Chart,使用 helm 結合 CI,在 k8s 中部署應用一行命令般簡單

當然 helm 更偉大的作用在於運維人員與開發人員的職責分離

讓開發人員寫 k8s 資源配置檔案是不現實的

  1. 不是所有開發都瞭解k8s,或者說很少,不瞭解 k8s 很難寫資源配置部署檔案
  2. 開發的主要職能還是在業務上

於是 helm 應時而出,運維寫配置檔案,開發給配置檔案填很少的引數

本篇文章主要介紹如何安裝 helm 以及如何使用 helm 部署基礎服務和業務

如果你是新人的話,目前在阿里雲買機器會有優惠,可以點選 連結 購買。你可以跟著我的筆記 伺服器運維指南 來開始維護伺服器並搭建應用。

介紹

  • Chart: 一系列 k8s 資源集合的命名,它包含一系列 k8s 資源配置檔案的模板與引數,可供靈活配置
  • release: 當一個 Chart 部署後生成一個 release,chart/relase 類似於 docker 中 image/container
  • repo: 即 chart 的倉庫,其中有很多個 chart 可供選擇,如官方 helm/charts

使用 helm create 建立一個 chart,瞭解簡單 chart 的目錄結構

關於如何安裝 helm 參考下一小節

# 建立一個 chart
$ helm create todo
Creating todo

$ cd todo

# 列印 chart 目錄,主要檔案有 Chart.yaml 與 values.yaml
# --dirsfirst 先列印資料夾名稱
$ tree --dirsfirst
.
├── charts
├── templates
│   ├── tests
│   │   └── test-connection.yaml
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── ingress.yaml
│   └── service.yaml
├── Chart.yaml
└── values.yaml

3 directories, 8 files
複製程式碼

檢視主要的兩個檔案目錄

  • templates/: 這是運維大哥寫的配置檔案模板,示例是最簡單應用的資源配置,但複雜應用還會有 pvc,role,service-acount 等等
  • values.yaml: 這是給開發小弟寫的可選引數,但是大部分引數都被運維大哥給內建了

使用 helm 部署基礎服務

真實案例可以參看我的系列文章其它章節

這裡講述一些關於部署基礎服務的一般步驟。假設我們需要部署 redis

這裡使用 helm v3,語法與 v2 可能略有出入

01 查詢相關 Chart

使用 helm search hub

$ helm search hub redis
URL                                                     CHART VERSION   APP VERSION     DESCRIPTION
https://hub.helm.sh/charts/bitnami/redis                9.5.0           5.0.5           Open source, advanced key-value store. It is of...
https://hub.helm.sh/charts/hephy/redis                  v2.4.0                          A Redis database for use inside a Kubernetes cl...
https://hub.helm.sh/charts/incubator/redis-cache        0.5.0           4.0.12-alpine   A pure in-memory redis cache, using statefulset...
複製程式碼

02 選定 Chart,跟進 Chart 的官方文件

我們選定 stable/redis 這個 chart。

跟蹤官方文件,設定相關引數,儲存為 values-production.yaml

# Production configuration
$ helm install stable/redis --values values-production.yaml
複製程式碼

如果有必要時會新增 repo: helm repo add

# helm repo add stable https://kubernetes-charts.storage.googleapis.com/

# 列出所有 repo
$ helm repo list
NAME            URL
stable          https://kubernetes-charts.storage.googleapis.com/
apphub          https://apphub.aliyuncs.com
jetstack        https://charts.jetstack.io
複製程式碼

03 校驗部署狀態

這與需要部署的資源有關,不過一般也就分為 ServicePodPVC

安裝 helm

這裡參考官方文件 安裝 helm

helm 在 helm v2 時分為客戶端 (helm client,即命令列工具) 與服務端 (helm server) 兩部分,在服務端又叫 Tiller,安裝 Tiller 時會在叢集中部署一個 Pod

helm 此時已釋出了 v3,相比 v2 而言,它去掉了 Tiller,更加具體的變更參考 helm v3 FAQ

安裝客戶端 (helm client)

helm client 需要安裝在你可以訪問 k8s 叢集的任何伺服器,如同 kubectl,不過通常來說,你需要安裝在兩個地方

  1. k8s 叢集的 master node
  2. 你自己的 PC/mac 上

在 helm v3 中,只需要安裝 helm client

在 mac 上進行安裝

$ brew install kubernetes-helm
複製程式碼

在 linux 上進行安裝

$ curl -LO https://git.io/get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
複製程式碼

根據原始碼包進行安裝,比較推薦(畢竟使用以上兩種方案可能有網路問題),至於如何使用 rsync 見以下安裝步驟

使用指令碼安裝在國內會出現網路問題,需要在代理節點安裝並使用 rsync 或者 scp 移動到目標位置

示例選擇 2.14.3 進行安裝,helm 的最新版本可以參考 helm/helm Releases

可以選擇 3.0+ 版本的安裝,目前最新版本是 Helm v3.0.0-rc.1 (2019/11/01)

# 下載 MAC 上適用的軟體包
# -L: 追蹤重定向連結
# -O: 儲存到本地
# -S: 列印錯誤
$ curl -SLO https://get.helm.sh/helm-v2.14.3-darwin-amd64.tar.gz 

# 下載 CentOS 上適用的軟體包
$ curl -SLO https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz

# 如果有網路問題,請在代理節點下載並 rsync 到目標節點,如果沒有,跳過此步
$ rsync -avhzP proxy:/root/helm-v2.14.3-linux-amd64.tar.gz .

# 如果在 mac 上
$ tar -zxvf helm-v2.14.3-darwin-amd64.tar.gz 

# 如果在 centos 上
$ tar -zxvf helm-v2.14.3-linux-amd64.tar.gz

# 進入相應目錄,移至 /bin 目錄
$ mv linux-amd64/helm /usr/local/bin/helm
複製程式碼

安裝 tiller (helm server)

如果使用了 Helm v3,則不用安裝 tiller

01 下載映象

tiller 的映象 gcr.io/kubernetes-helm/tiller:v2.14.3 在 gcr.io 上,這意味著在國內網路需要先下載到代理節點,再移動到目標位置。具體步驟參照以前章節

02 安裝 Tiller

當安裝好 helm 命令列工具後,使用 helm init 安裝 tiller。安裝 tiller 時會在 k8s 上部署一個 pod。

$ helm init
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
複製程式碼

根據提示此時已安裝成功,校驗 Pod 狀態

# 檢視 tiller 是否出在執行狀態
$ kubectl get pods --all-namespaces

# 檢視 helm 與 tiller 版本
$ helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
複製程式碼

更多文章


我是山月,一個夢想跑步與爬山的程式設計師,我會定期分享全棧文章在個人公眾號中,歡迎交流

歡迎關注公眾號山月行,我會定期分享一些前後端以及運維的文章

相關文章