helm入門指南及kubernetes應用部署實踐

helm 入門指南

一、架構簡述

Helm架構由Helm客戶端、Tiller服務器端和Chart倉庫所組成;Tiller部署在Kubernetes中,Helm客戶端從Chart倉庫中獲取Chart安裝包,並將其安裝部署到Kubernetes集羣中。node

二、安裝helm

#下載安裝包
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
tar -zxvf helm-v2.12.2-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/

三、安裝tiller服務端

3.1 建立rbca

rbca-config.yamllinux

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

3.2 安裝tiller

這裏使用阿里的鏡像和阿里的charts倉庫,由於默認倉庫和鏡像須要×××nginx

helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.2 --aliyun-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

查看tiller是否安裝完成web

# kubectl get pod -n kube-system -l app=helm
NAME                             READY   STATUS    RESTARTS   AGE
tiller-deploy-84bcb9978c-5xccb   1/1     Running   2          10d

驗證是否正常,注意 helm和tiller 版本要一致json

# helm version
Client: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}

3.3 卸載helm

helm reset 或 helm reset --force

四、helm的使用

4.1 倉庫的操做

  • 查看倉庫列表api

    # helm repo list
    NAME    URL                                                   
    stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    bitnami https://charts.bitnami.com/bitnami                    
    emar    http://192.168.1.57:8879
  • 刪除指定倉庫
    helm repo remove reponame
  • 添加新的倉庫地址
    helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  • 更新倉庫
    helm repo update
  • 建立私有倉
    helm serve --address 192.168.1.57:8879 --repo-path /data/helm/repository/ --url http://192.168.1.57:8879/charts/ &

4.2 安裝使用kubeapps

kubeapps是一個基於web的用戶界面,用於部署和管理在kubernetes羣集中的應用程序。Kubeapps容許你:安全

  • 瀏覽並部署存儲庫中的chats
  • 檢查、升級和刪除集羣中安裝的基於helm的應用程序
  • 添加自定義和私有的chat存儲庫(支持ChartMuseum and JFrog Artifactory)
  • 瀏覽並提供來自Service Catalog的外部服務和可用的服務中介
  • 用服務目錄綁定基於helm的應用程序鏈接到外部服務
  • 基於kubernetes RBAC的安全認證和受權

安裝訪問服務器

  • 使用helm安裝
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install --name kubeapps --namespace kubeapps bitnami/kubeapps
  • 建立Kubernetes API token
    kubectl create serviceaccount kubeapps-operator
    kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
  • 訪問kubeapps dashboard
    #使用port-forward代理訪問pod,能夠臨時從外網訪問。這種方式臨時使用能夠,最好改爲ingress模式
    export POD_NAME=$(kubectl get pods -n kubeapps -l "app=kubeapps,release=kubeapps" -o jsonpath="{.items[0].metadata.name}")
    kubectl port-forward --address 0.0.0.0 -n kubeapps $POD_NAME 8080:8080

卸載kubeapps架構

helm delete --purge kubeapps
kubectl delete crd apprepositories.kubeapps.com

5 構建本身的helm chart

下面咱們經過一個完整的示例來學習如何使用 Helm 建立、打包、分發、安裝、升級及回退Kubernetes應用。併發

5.1 建立自定義chart,默認建立的chart是nginx

helm create firstchart

查看mychart結構:

firstchart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

生成chart目錄裏有Chart.yaml, values.yaml and NOTES.txt等文件,下面分別對chart中幾個重要文件解釋:

  • Chart.yaml 包含了chart的metadata,描述了Chart名稱、描述信息與版本。
  • values.yaml:存儲了模板文件變量。
  • templates/:記錄了所有模板文件。
  • charts/:依賴chart存儲路徑。

其中firstchart/templates/的文件及其做用以下:

  • NOTES.txt:給出了部署chart後的幫助文檔,例如如何使用chart、列出默認的設置等。
  • deployment.yaml:建立 Kubernetes deployment的yaml文件。
  • service.yaml:建立deployment的service endpoint yams文件。
  • _helpers.tpl: 模板使用幫助文件。

Templates 目錄下 YAML 文件模板的值默認都是在 values.yaml 裏定義的,好比在 deployment.yaml 中定義的容器鏡像。

image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

其中的 .Values.image.repository 的值就是在 values.yaml 裏定義的 nginx,.Values.image.tag 的值就是 stable。

$ cat firstchart/values.yaml|grep repository
repository: nginx

$ cat firstchart/values.yaml|grep tag
tag: stable

以上兩個變量值是在 create chart 的時候就自動生成的默認值,你能夠根據實際狀況進行修改。

5.2 編寫應用的介紹信息

打開 Chart.yaml, 填寫你部署的應用的詳細信息,以 firstchart 爲例:

$ cat firstchart/Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: firstchart
version: 0.1.0

5.3 編寫應用具體部署信息

編輯 values.yaml,它默認會在 Kubernetes 部署一個 Nginx。下面是 firstchart 應用的 values.yaml 文件的內容:

$ cat mychart/values.yaml
# Default values for mychart.
# 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: {}

5.4 檢查依賴和模板配置是否正確

$ helm lint firstchart/
==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures

若是文件格式錯誤,能夠根據提示進行修改。

5.5 將應用打包

$ helm package firstchart
Successfully packaged chart and saved it to: /data/helm/repository/firstchart-0.1.0.tgz

firstchart 目錄會被打包爲一個 firstchart-0.1.0.tgz 格式的壓縮包,該壓縮包會被放到當前目錄下。

若是你想看到更詳細的輸出,能夠加上 --debug 參數來查看打包的輸出,輸出內容應該相似以下:

$ helm package firstchart --debug
Successfully packaged chart and saved it to: /data/helm/repository/firstchart-0.1.0.tgz
[debug] Successfully saved /home/k8s/mychart-0.1.0.tgz to /data/helm/repository/

5.5 將應用發佈到 Repository

雖然咱們已經打包了 Chart 併發布到了 Helm 的本地目錄中,但經過 helm search 命令查找,並不能找不到剛纔生成的 firstchart包。

$ helm search mychart
No results found

這是由於 Repository 目錄中的 Chart 包尚未被 Helm 管理。經過 helm repo list 命令能夠看到目前 Helm 中已配置的 Repository 的信息。

# helm repo list
NAME    URL                                                   
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
bitnami https://charts.bitnami.com/bitnami                    
emar    http://192.168.1.57:8879

經過 helm repo index 命令將 Chart 的 Metadata 記錄更新在 index.yaml 文件中:

# 更新 Helm Repository 的索引文件
$ cd /data/helm/repository/
$ helm repo index --url=http://192.168.1.57:8879/charts .

如今再次查找 firstchart 包,就能夠搜索到了。

$ helm repo update
$ helm search firstchart
NAME            CHART VERSION   APP VERSION DESCRIPTION
firstchart      0.1.0           1.0         A Helm chart for Kubernetes

6 在 Kubernetes 中部署應用

6.1 部署一個應用

注:  由於網上文檔都是deployment,我這裏使用daemonset來展現

來看下基於busybox,daemonset的配置

#tree .
.
├── charts
├── Chart.yaml
├── templates
│   ├── busybox-ds.yaml
│   ├── _helpers.tpl
│   └── NOTES.txt
└── values.yaml

查看value

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

image:
  repository: busybox
  tag: latest
  pullPolicy: IfNotPresent

查看template裏面的busybox-ds.yaml

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: busybox
spec:
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        command:
        - sleep
        - "3600"
      nodeSelector:
        ds-test: dstest
status:

Chart 被髮布到倉儲後,就能夠經過 helm install 命令部署該 Chart。

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

當使用helm install 命令部署應用時,實際上就是將 templates 目錄下的模板文件渲染成 Kubernetes 可以識別的 YAML 格式。
在部署前咱們可使用

helm install --dry-run --debug <chart_dir> --name <release_name>

命令來驗證 Chart 的配置。該輸出中包含了模板的變量配置與最終渲染的 YAML 文件。

[root@kvm-ht242057 busybox-ds]# helm install --debug --dry-run --set image.tag='2.0'  .
[debug] Created tunnel using local port: '22888'

[debug] SERVER: "127.0.0.1:22888"

[debug] Original chart version: ""
[debug] CHART PATH: /etc/kubernetes/addons/helm/busybox-ds

NAME:   bailing-terrier
REVISION: 1
RELEASED: Tue Jan 29 15:20:54 2019
CHART: busybox-ds-0.2.1
USER-SUPPLIED VALUES:
image:
  tag: "2.0"

COMPUTED VALUES:
image:
  pullPolicy: IfNotPresent
  repository: busybox
  tag: "2.0"

HOOKS:
MANIFEST:

---
# Source: busybox-ds/templates/busybox-ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: busybox
spec:
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox:2.0
        command:
        - sleep
        - "3600"
      nodeSelector:
        ds-test: dstest
status:

驗證完成沒有問題後,咱們就可使用如下命令將其部署到 Kubernetes 上了。

# 部署時需指定 Chart 名及 Release(部署的實例)名。
helm install emar/busybox-ds --name busybox
Release "busybox" has been upgraded. Happy Helming!
LAST DEPLOYED: Thu Jan 24 17:39:26 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/DaemonSet
NAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGE
busybox  1        1        1      0           1          ds-test=dstest  24h

==> v1/Pod(related)
NAME           READY  STATUS   RESTARTS  AGE
busybox-n7725  1/1    Running  24        24h

NOTES:
please ignore it, this is a test
node selector: 
ds-test: dstest

注意 :helm install 默認會用到 socat,須要在全部節點上安裝 socat 軟件包。

完成部署後,如今 busybox 就已經部署到 Kubernetes 集羣上。

# kubectl get ds
NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR    AGE
busybox   1         1         1       0            1           ds-test=dstest   5d22h

使用下面的命令列出的全部已部署的 Release 以及其對應的 Chart。

# helm list
NAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
busybox                 6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.1        1.0             default  
dealing-buffalo         1               Thu Jan 24 17:39:02 2019        FAILED          busybox-ds-0.2.1        1.0             default  
kubeapps                1               Tue Jan 22 17:45:00 2019        DEPLOYED        kubeapps-1.2.3          v1.1.1          kubeapps 
wobbling-butterfly      1               Thu Jan 24 17:25:48 2019        FAILED          busybox-ds-0.2.1        1.0             default

還可使用 helm status 查詢一個特定的 Release 的狀態。

helm status busybox
LAST DEPLOYED: Thu Jan 24 17:40:02 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/DaemonSet
NAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGE
busybox  1        1        1      0           1          ds-test=dstest  5d22h

==> v1/Pod(related)
NAME           READY  STATUS   RESTARTS  AGE
busybox-n7725  1/1    Running  142       5d22h

NOTES:
please ignore it, this is a test
node selector: 
ds-test: dstest

6.2 升級和回退一個應用

從上面 helm list 輸出的結果中咱們能夠看到有一個 Revision(更改歷史)字段,該字段用於表示某一個 Release 被更新的次數,咱們能夠用該特性對已部署的 Release 進行回滾

  • 修改 Chart.yaml 文件

將版本號從 0.1.0 修改成 0.2.0, 而後使用 helm package 命令打包併發布到本地倉庫

$ cat busybox-ds/Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes,test Daemonset
name: busybox
version: 0.2.0

$ helm package busybox-ds
Successfully packaged chart and saved it to: /data/helm/repository/busybox-ds-0.2.0.tgz

咱們能夠看到在本地倉庫中 busybox-ds 有兩個版本。

# helm search busy -l
NAME            CHART VERSION   APP VERSION     DESCRIPTION                                
emar/busybox-ds 0.2.0           1.0             A Helm chart for Kubernetes, test Daemonset
emar/busybox-ds 0.1.0           1.0             A Helm chart for Kubernetes

6.2.1 升級一個應用

如今用 helm upgrade 命令將已部署的 busybox 升級到新版本。你能夠經過 --version 參數指定須要升級的版本號,若是沒有指定版本號,則缺省使用最新版本。

helm upgrade emar/busybox-ds --name busybox
Release "busybox" has been upgraded. Happy Helming!
LAST DEPLOYED: Thu Jan 24 17:39:26 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta1/DaemonSet
NAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGE
busybox  1        1        1      0           1          ds-test=dstest  24h

==> v1/Pod(related)
NAME           READY  STATUS   RESTARTS  AGE
busybox-n7725  1/1    Running  24        24h

NOTES:
please ignore it, this is a test
node selector: 
ds-test: dstest

完成後,能夠看到已部署的 mike-test 被升級到 0.2.0 版本

helm list
NAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
busybox                 6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.0        2.0             default

6.2.2 回滾一個應用

若是更新後的程序因爲某些緣由運行有問題,須要回退到舊版本的應用。首先咱們可使用 helm history 命令查看一個 Release 的全部變動記錄

# helm history busybox
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION     
1               Wed Jan 23 17:04:18 2019        SUPERSEDED      busybox-ds-0.1.1        Install complete
2               Wed Jan 23 17:09:47 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete
3               Wed Jan 23 17:11:01 2019        SUPERSEDED      busybox-ds-0.1.1        Rollback to 1   
4               Wed Jan 23 17:13:05 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete
5               Thu Jan 24 17:39:26 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete
6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.1        Upgrade complete

其次,咱們可使用下面的命令對指定的應用進行回退。

$ helm rollback busybox 1
Rollback was a success! Happy Helming!
  • 注:其中的參數 1 是 helm history 查看到 Release 的歷史記錄中 REVISION 對應的值。

6.2.3 如何快速上線和回滾

若是每次上線回滾都要打包,更新chart倉,明顯是不切實際的。由於業務上線不只要保證穩定、可追溯,也要保證時效。
一、使用set參數,動態指定鏡像tag。這裏要用到values.yaml
以busybox舉例:
values.yaml

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

image:
  repository: busybox
  tag: latest
  pullPolicy: IfNotPresent

關於values的相關命令

查看charts默認配置
helm inspect values busybox

覆蓋chart中的默認值,經過指定配置文件方式
helm install -f values.yaml ./busybox

或者經過–set key=value形式
helm install --set image.tag='2.0' ./busybox

單獨跑查看配置是否正常
helm install -debug --dry-run --set image.tag='2.0'

咱們能夠看到,每次上線沒必要修改charts,只要修改image 的tag,就能夠達到修改鏡像版本的目的,這樣就能夠快速變動imagetag,達到快速上線和回滾。

注:對於單一項目的多個配置,咱們也能夠寫多個values.yaml來實現不一樣的環境,啓動的時候指定不一樣的values.yaml來實現環境的區分。就是寫多個文件,這裏不詳細演示了。

6.3 刪除一個應用

  • 若是須要刪除一個已部署的 Release,能夠利用 helm delete 命令來完成刪除。
    # helm delete busybox
    release "busybox" deleted
  • 確認應用是否刪除,該應用已被標記爲 DELETED 狀態。
    # helm ls -a busybox
    NAME            REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE
    busybox          1              Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        1.0             default
  • 也可使用 --deleted 參數來列出已經刪除的 Release
    # helm ls --deleted
    NAME            REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE    
    busybox         1               Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        1.0             default
  • 從上面的結果也能夠看出,默認狀況下已經刪除的 Release 只是將狀態標識爲 DELETED 了 ,但該 Release 的歷史信息仍是繼續被保存的。
    # helm hist busybox
    REVISION        UPDATED                         STATUS  CHART                   DESCRIPTION      
    1               Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        Deletion complete
    2               Wed Jan 23 17:09:47 2019        SUPERSEDED busybox-ds-0.2.1     Upgrade complete
    3               Wed Jan 23 17:11:01 2019        SUPERSEDED busybox-ds-0.1.1     Rollback to 1
  • 若是要移除指定 Release 全部相關的 Kubernetes 資源和 Release 的歷史記錄,能夠用以下命令:
    # helm delete --purge busybox
    release "busybox" deleted
  • 再次查看已刪除的 Release,已經沒法找到相關信息。
# helm hist busybox
Error: release: "busybox" not found

# helm ls 命令也已均無查詢記錄。
# helm ls --deleted
# helm ls -a busybox
相關文章
相關標籤/搜索