使用Helm管理kubernetes應用

1. Helm用途

Helm把Kubernetes資源(比如deployments掌动、services或 ingress等) 打包到一個chart中齐蔽,而chart被保存到chart倉庫。通過chart倉庫可用來存儲和分享chart。Helm使發(fā)布可配置,支持發(fā)布應用配置的版本管理拓轻,簡化了Kubernetes部署應用的版本控制、打包经伙、發(fā)布扶叉、刪除、更新等操作橱乱。

做為Kubernetes的一個包管理工具辜梳,用來管理charts——預先配置好的安裝包資源,有點類似于Ubuntu的APT和CentOS中的yum泳叠。Helm具有如下功能:

  • 創(chuàng)建新的chart
  • chart打包成tgz格式
  • 上傳chart到chart倉庫或從倉庫中下載chart
  • 在Kubernetes集群中安裝或卸載chart
  • 管理用Helm安裝的chart的發(fā)布周期

Helm有三個重要概念:

  • chart:包含了創(chuàng)建Kubernetes的一個應用實例的必要信息
  • config:包含了應用發(fā)布配置信息
  • release:是一個chart及其配置的一個運行實例

2. Helm組件

Helm基本架構如下:


架構圖

Helm有以下兩個組成部分:

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

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

Tiller Server是一個部署在Kubernetes集群內部的server,其與Helm client危纫、Kubernetes API server進行交互宗挥。

Tiller server主要負責如下:

  • 監(jiān)聽來自Helm client的請求
  • 通過chart及其配置構建一次發(fā)布
  • 安裝chart到Kubernetes集群,并跟蹤隨后的發(fā)布
  • 通過與Kubernetes交互升級或卸載chart

簡單的說种蝶,client管理charts契耿,而server管理發(fā)布release。

3. 安裝Helm

3.1 前提要求

  • Kubernetes1.5以上版本
  • 集群可訪問到的鏡像倉庫
  • 執(zhí)行helm命令的主機可以訪問到kubernetes集群

3.2 安裝步驟

首先需要安裝helm客戶端

方法1:需要能連外網

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

方法2: 我把helm 包和鏡像上傳到了網盤

鏈接:https://pan.baidu.com/s/168HPcThZQU8SgxDA43_4vg 密碼:l4it

tar -zxvf helm-v2.9.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
chmod +x /usr/local/bin/helm
docker load -i tiller-2.9.0.tar

然后安裝helm服務端tiller

創(chuàng)建tiller的serviceaccount和clusterrolebinding

tiller的服務端是一個deployment螃征,在kube-system namespace下搪桂,會去連接kube-api創(chuàng)建應用和刪除,所以需要給他權限

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

安裝server端盯滚,如果能連外網踢械,直接helm init,會自動拉取鏡像魄藕。不能的話内列,指定鏡像,鏡像文件在上面的網盤里

helm init   或者
helm init -i gcr.io/kubernetes-helm/tiller:v2.9.0

為應用程序設置serviceAccount:

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

3.3 檢驗版本

完成后查看pod狀態(tài)和helm版本背率,容器中的為helm server端话瞧, 虛擬機的/usr/local/bin/helm為client

[root@master1 ~]# kubectl get pod -n kube-system |grep tiller
tiller-deploy-f6585f7d5-k9chk     1/1       Running   0          10m
[root@master1 ~]# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"}

4. helm 使用

常用命令

查看源

helm repo list    #列出所有源,當前還沒有添加源
# 添加一個國內可以訪問的阿里源寝姿,不過好像最近不更新了
helm repo add ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts  
如果能連外網交排,可以加google,f8
helm repo add google https://kubernetes-charts.storage.googleapis.com 
helm repo add fabric8 https://fabric8.io/helm
# 更新源
helm repo update

查看chart

# 查看chart饵筑,即已經通過helm部署到 k8s 平臺的應用
helm list    或者  helm ls

# 若要查看或搜索存儲庫中的 Helm charts埃篓,鍵入以下任一命令
helm search 
helm search 存儲庫名稱 #如 stable 或 incubator
helm search chart名稱 #如 wordpress 或 spark

# 查看charm詳情
helm inspect ali/wordpress

下載chart

helm fetch ali/wordpress
[root@master1 ~]# ls wordpress-0.8.8.tgz 
wordpress-0.8.8.tgz

部署應用 wordpress, 通過ali源文件

helm install --name wordpress-test --set "persistence.enabled=false,mariadb.persistence.enabled=false" ali/wordpress

[root@master1 ~]# kubectl get pod 
NAME                                        READY     STATUS    RESTARTS   AGE
wordpress-test-mariadb-84b866bf95-7bx5w     1/1       Running   1          4h
wordpress-test-wordpress-5ff8c64b6c-hrh9q   1/1       Running   0          4h
[root@master1 ~]# kubectl get svc 
NAME                       TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kubernetes                 ClusterIP      10.96.0.1        <none>        443/TCP                      2d
wordpress-test-mariadb     ClusterIP      10.105.71.95     <none>        3306/TCP                     4h
wordpress-test-wordpress   LoadBalancer   10.104.106.150   <pending>     80:30655/TCP,443:32121/TCP   4h

訪問wordpress翻翩,使用node節(jié)點ip + nodeport都许, 192.168.1.181:30655

訪問wordpress

刪除應用

[root@master1 ~]# helm list
NAME            REVISION    UPDATED                     STATUS      CHART           NAMESPACE
wordpress-test  1           Thu May 17 11:35:07 2018    DEPLOYED    wordpress-0.8.8 default  
[root@master1 ~]# helm delete wordpress-test
release "wordpress-test" deleted

5. 建立自己的chart

創(chuàng)建一個自己的chart,看下文檔結構嫂冻,學習下如何使用

root@master1:~# helm create misa86
root@master1:~# tree misa86
misa86
├── charts     #Chart本身的版本和配置信息
├── Chart.yaml    #Chart本身的版本和配置信息
├── templates    #配置模板目錄
│   ├── deployment.yaml    #kubernetes Deployment object
│   ├── _helpers.tpl    #用于修改kubernetes objcet配置的模板
│   ├── ingress.yaml    #kubernetes Deployment object
│   ├── NOTES.txt    #helm提示信息
│   └── service.yaml    #kubernetes Serivce
└── values.yaml    #kubernetes object configuration胶征,定義變量

2 directories, 7 files

5.1 模板 template

template下包含應用所有的yaml文件模板,這個和openshift的template 有點類似桨仿,感覺openshift的使用更簡便一些睛低。
應用資源的類型不僅限于deployment 和service這些,k8s支持的都可以服傍。

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ template "misa86.fullname" . }}
  labels:
    app: {{ template "misa86.name" . }}
    chart: {{ template "misa86.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ template "misa86.name" . }}
      release: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ template "misa86.name" . }}
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
{{ toYaml .Values.resources | indent 12 }}
    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}

這是該應用的Deployment的yaml配置文件钱雷,其中的雙大括號包擴起來的部分是Go template, template "misa86.name" 這類是在 _helpers.tpl 文件中定義的吹零,如果不定義罩抗,將來文件名會是隨意字符加chart名字。

其中的Values是在values.yaml文件中定義的灿椅,應用主要的參數在這邊:

# Default values for misa86.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - chart-example.local
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #  cpu: 100m
  #  memory: 128Mi
  # requests:
  #  cpu: 100m
  #  memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

比如在Deployment.yaml中定義的容器鏡像image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"其中的:

.Values.image.repository就是nginx 
.Values.image.tag就是stable

以上兩個變量值是在create chart的時候自動生成的默認值套蒂。

將默認的鏡像地址和tag改成自己的地址 registry.cn-hangzhou.aliyuncs.com/misa/nginx:1.13

5.2 檢查配置和模板是否有效

當使用kubernetes部署應用的時候實際上將templates渲染成最終的kubernetes能夠識別的yaml格式。

使用helm install --dry-run --debug <chart_dir>命令來驗證chart配置茫蛹。該輸出中包含了模板的變量配置與最終渲染的yaml文件操刀。 deployment service的名字前半截由兩個隨機的單詞組成,隨機數加chart名婴洼。 這名字也可以改成value方式骨坑,自己定義
如果配置等有問題此處會報錯

[root@master1 ~]# helm install --dry-run --debug misa86/
[debug] Created tunnel using local port: '44114'

[debug] SERVER: "127.0.0.1:44114"

[debug] Original chart version: ""
[debug] CHART PATH: /root/misa86

NAME:   esteemed-wallaby
REVISION: 1
RELEASED: Fri May 18 17:38:49 2018
CHART: misa86-0.1.0
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
image:
  pullPolicy: IfNotPresent
  repository: registry.cn-hangzhou.aliyuncs.com/misa/nginx
  tag: 1.13
ingress:
  annotations: {}
  enabled: false
  hosts:
  - chart-example.local
  path: /
  tls: []
nodeSelector: {}
replicaCount: 1
resources: {}
service:
  port: 80
  type: ClusterIP
tolerations: []

HOOKS:
MANIFEST:

---
# Source: misa86/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: esteemed-wallaby-misa86
  labels:
    app: misa86
    chart: misa86-0.1.0
    release: esteemed-wallaby
    heritage: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: misa86
    release: esteemed-wallaby
---
# Source: misa86/templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: esteemed-wallaby-misa86
  labels:
    app: misa86
    chart: misa86-0.1.0
    release: esteemed-wallaby
    heritage: Tiller
spec:
  replicas: 1
  selector:
    matchLabels:
      app: misa86
      release: esteemed-wallaby
  template:
    metadata:
      labels:
        app: misa86
        release: esteemed-wallaby
    spec:
      containers:
        - name: misa86
          image: "registry.cn-hangzhou.aliyuncs.com/misa/nginx:1.13"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {}

5.3 部署到kubernetes

在misa86目錄下執(zhí)行下面的命令將應用部署到kubernetes集群上。

[root@master1 misa86]# helm install .
NAME:   wizened-jackal
LAST DEPLOYED: Fri May 18 17:44:41 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta2/Deployment
NAME                   DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
wizened-jackal-misa86  1        0        0           0          0s

==> v1/Pod(related)
NAME                                    READY  STATUS             RESTARTS  AGE
wizened-jackal-misa86-5dd4fdff49-22rx9  0/1    ContainerCreating  0         0s

==> v1/Service
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
wizened-jackal-misa86  ClusterIP  10.98.43.164  <none>       80/TCP   0s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=misa86,release=wizened-jackal" -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

現在nginx已經部署到kubernetes集群上柬采,本地執(zhí)行提示中的命令在本地主機上訪問到nginx實例欢唾。

export POD_NAME=$(kubectl get pods --namespace default -l "app=misa86,release=wizened-jackal" -o jsonpath="{.items[0].metadata.name}")

kubectl port-forward $POD_NAME 8080:80
在本地訪問http://127.0.0.1:8080即可訪問到nginx 
注意: 只能本地訪問

5.4 查看部署的relaese

[root@master1 misa86]# helm list
NAME            REVISION    UPDATED                     STATUS      CHART           NAMESPACE
wizened-jackal  1           Fri May 18 17:44:41 2018    DEPLOYED    misa86-0.1.0    default  
[root@master1 misa86]# helm delete wizened-jackal
release "wizened-jackal" deleted

5.5 打包分享

我們可以修改Chart.yaml中的helm chart配置信息,然后使用下列命令將chart打包成一個壓縮文件警没。

[root@master1 misa86]# helm package .
Successfully packaged chart and saved it to: /root/misa86/misa86-0.1.0.tgz

5.6 依賴

我們可以在charts 的目錄 requirement.yaml 中定義應用所依賴的chart匈辱,例如定義對mariadb的依賴:

這功能還沒屢明白

dependencies:
- name: mariadb
  version: 0.6.0
  repository: https://kubernetes-charts.storage.googleapis.com

使用helm lint .命令可以檢查依賴和模板配置是否正確。

5.7 http提供chart

我們在前面安裝chart可以通過HTTP server的方式提供杀迹,如果不帶 address 參數亡脸,那只能本機訪問

把已安裝的chart做server

[root@master1 misa86]# helm serve --address 192.168.1.181:80
Regenerating index. This may take a moment.
Now serving you on 192.168.1.181:80

指定目錄做server

helm serve --address "0.0.0.0:8879" --repo-path "/root/.helm/repository/local" --url http://192.168.1.181:8879/chart/

/root/.helm/repository/local目錄下得有chart文件,比如nginx1目錄树酪,下有values.yaml 和templates等
先把目錄打包浅碾,庫索引文件index只認打包的,  helm package nginx1

更新index文件   
helm  repo index . 
cat index.html

任意節(jié)點訪問 192.168.1.181:80 可以看到安裝的chart续语,點擊鏈接即可以下載chart的壓縮包垂谢。

chart-http

6. 注意事項

下面列舉一些常見問題,和在解決這些問題時候的注意事項疮茄。

6.1 服務依賴管理

所有使用helm部署的應用中如果沒有特別指定chart的名字都會生成一個隨機的Release name滥朱,例如romping-frog根暑、sexy-newton等,跟啟動docker容器時候容器名字的命名規(guī)則相同徙邻,而真正的資源對象的名字是在YAML文件中定義的名字排嫌,我們成為App name,兩者連接起來才是資源對象的實際名字:Release name-App name缰犁。

而使用helm chart部署的包含依賴關系的應用淳地,都會使用同一套Release name,在配置YAML文件的時候一定要注意在做服務發(fā)現時需要配置的服務地址帅容,如果使用環(huán)境變量的話颇象,需要像下面這樣配置。

env:
 - name: SERVICE_NAME
   value: "{{ .Release.Name }}-{{ .Values.image.env.SERVICE_NAME }}"
這是使用了Go template的語法并徘。至于{{ .Values.image.env.SERVICE_NAME }}的值是從values.yaml文件中獲取的遣钳,所以需要在values.yaml中增加如下配置:

image:
  env:
    SERVICE_NAME: k8s-app-monitor-test

6.2 解決本地chart依賴

在本地當前chart配置的目錄下啟動helm server,我們不指定任何參數饮亏,直接使用默認端口啟動耍贾。

helm serve
將該repo加入到repo list中。

helm repo add local http://localhost:8879
在瀏覽器中訪問http://localhost:8879可以看到所有本地的chart路幸。

然后下載依賴到本地荐开。

helm dependency update
這樣所有的chart都會下載到本地的charts目錄下。

6.3 設置helm命令自動補全

為了方便helm命令的使用简肴,helm提供了自動補全功能晃听,如果使用zsh請執(zhí)行:

source <(helm completion zsh)
如果使用bash請執(zhí)行:

source <(helm completion bash)

參考文檔

https://jimmysong.io/kubernetes-handbook/practice/helm.html
http://dockone.io/article/2701

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砰识,隨后出現的幾起案子能扒,更是在濱河造成了極大的恐慌,老刑警劉巖辫狼,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初斑,死亡現場離奇詭異,居然都是意外死亡膨处,警方通過查閱死者的電腦和手機见秤,發(fā)現死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來真椿,“玉大人鹃答,你說我怎么就攤上這事⊥幌酰” “怎么了测摔?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我锋八,道長浙于,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任挟纱,我火速辦了婚禮路媚,結果婚禮上,老公的妹妹穿的比我還像新娘樊销。我一直安慰自己,他們只是感情好脏款,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布围苫。 她就那樣靜靜地躺著,像睡著了一般撤师。 火紅的嫁衣襯著肌膚如雪剂府。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天剃盾,我揣著相機與錄音腺占,去河邊找鬼。 笑死痒谴,一個胖子當著我的面吹牛衰伯,可吹牛的內容都是我干的。 我是一名探鬼主播积蔚,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼意鲸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尽爆?” 一聲冷哼從身側響起怎顾,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漱贱,沒想到半個月后槐雾,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡幅狮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年募强,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪笼。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钻注,死狀恐怖,靈堂內的尸體忽然破棺而出配猫,到底是詐尸還是另有隱情幅恋,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布泵肄,位于F島的核電站捆交,受9級特大地震影響淑翼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜品追,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一玄括、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肉瓦,春花似錦遭京、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲫趁,卻和暖如春斯嚎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挨厚。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工堡僻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疫剃。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓钉疫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巢价。 傳聞我的和親對象是個殘疾皇子陌选,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容