**Helm 是管理 Kubernetes 包的工具,Helm 能提供下面的能力:node
**在 Helm 中,有三個須要瞭解的重要概念:linux
在 Helm 中有兩個主要的組件,既 Helm 客戶端和 Tiller 服務器:nginx
Helm 客戶端:這是一個供終端用戶使用的命令行工具,客戶端負責以下的工做:git
Tiller 服務器: Tiller 服務部署在 Kubernetes 集羣中,Helm 客戶端經過與 Tiller 服務器進行交互,並最終與 Kubernetes API 服務器進行交互。 Tiller 服務器負責以下的工做:github
客戶端負責管理 chart,服務器發展管理髮布。web
Helm 客戶端是使用 Go 語言編寫的,它經過 gRPC 協議與 Tiller 服務器交互。數據庫
Tiller 服務器也是使用 Go 語言編寫的,它使用 Kubernetes 客戶端類庫(當前是那個 REST+JSON )與 Kubernetes 進行通信。json
Tiller 服務器經過 Kubernetes 的 ConfigMap 存儲信息,所以自己沒有用於存儲數據庫。ubuntu
在進行 Helm 客戶端安裝前,請確認已有可用的 Kubernetes 集羣環境,並已安裝了 kubectl
。vim
經過訪問:https://github.com/kubernetes...。
下載 Helm 的合適的版本。
helm-v2.8.0-linux-amd64.tgz
版本;tar -zxvf helm-v2.8.0-linux-amd64.tgz
/usr/local/bin
目錄下:mv linux-amd64/helm /usr/local/bin/helm
注意:
kubectl
命令行工具的機器上安裝Helm客戶端;或者將安裝kubectl
命令行工具生成的配置文件($HOME/.kube/config
)複製到 Helm 客戶端所安裝的機器上( $HOME/.kube/config
)。建立一個名爲 tiller 的 Service Account
$ kubectl create serviceaccount tiller --namespace kube-system
cluster-admin
:將 tiller 綁定至集羣管理員角色的的 yaml 文件以下所示:
$vim rbac-config.yaml apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects:
name: tiller namespace: kube-system ```
經過執行 kubectl create -f
將授予 tiller 集羣管理員角色:
$ kubectl create -f rbac-config.yaml
安裝 Tiller 服務器
$ helm init --service-account tiller
在安裝完成後,能夠經過執行以下命令來檢查是安裝成功:
$ helm version
若是正確顯示 Helm 客戶端和 Tiller 服務器的版本,這表示安裝成功。
或者經過執行 kubectl
的以下命令來查看是否已正常按照 Tiller 服務器:
$ kubectl get pods -n kube-system
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,即已經經過helm部署到 k8s 平臺的應用helm list 或者 helm ls# 若要查看或搜索存儲庫中的 Helm charts,鍵入如下任一命令helm search helm search 存儲庫名稱 #如 stable 或 incubatorhelm search chart名稱 #如 wordpress 或 spark# 查看charm詳情helm inspect ali/wordpress
helm fetch ali/wordpress [ubuntu@master1 ~]# ls wordpress-0.8.8.tgz wordpress-0.8.8.tgz
$ helm install --name wordpress-test --set "persistence.enabled=false,mariadb.persistence.enabled=false" ali/wordpress [ubuntu@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 [ubuntu@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
[ubuntu@master1 ~]# helm listNAME REVISION UPDATED STATUS CHART NAMESPACEwordpress-test 1 Thu May 17 11:35:07 2018 DEPLOYED wordpress-0.8.8 default [ubuntu@master1 ~]# helm delete wordpress-testrelease "wordpress-test" deleted
建立一個本身的chart,看下文檔結構,學習下如何使用
$ helm create emqx Creating emqx $ tree misa86 emqx ├── 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,定義變量
template 下包含應用全部的 yaml 文件模板,應用資源的類型不只限於 deployment 和 service 這些,k8s 支持的均可以。
$cat templates/deployment.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ include "emqx.fullname" . }} labels: app.kubernetes.io/name: {{ include "emqx.name" . }} helm.sh/chart: {{ include "emqx.chart" . }} app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app.kubernetes.io/name: {{ include "emqx.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} template: metadata: labels: app.kubernetes.io/name: {{ include "emqx.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: 1883 - containerPort: 8883 - containerPort: 8080 - containerPort: 8083 - containerPort: 8084 - containerPort: 18083 env: - name: EMQX_NAME value: emqx - name: EMQX_CLUSTER__K8S__APP_NAME value: emqx - name: EMQX_CLUSTER__DISCOVERY value: k8s - name: EMQX_CLUSTER__K8S__SERVICE_NAME value: {{ include "emqx.fullname" . }} - name: EMQX_CLUSTER__K8S__APISERVER value: {{ .Values.env.kubeApiserver }} - name: EMQX_CLUSTER__K8S__NAMESPACE value: {{ .Values.env.kubeNamespace }} - name: EMQX_CLUSTER__K8S__ADDRESS_TYPE value: {{ .Values.env.kubeAddressType }} - name: EMQX_CLUSTER__K8S__APP_NAME value: emqx tty: true
這是該應用的 Deploymen t的 yaml 配置文件,其中的雙大括號包擴起來的部分是 Go template, template "emqx.name" 這類是在 _helpers.tpl
文件中定義的,若是不定義,未來文件名會是隨意字符加 chart 名字。
其中的 Values 是在 values.yaml 文件中定義的,應用主要的參數在這邊:
$ cat values.yaml# Default values for emqx.# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount: 2image: repository: emqx/emqx tag: latest pullPolicy: IfNotPresent env: kubeApiserver: http://127.0.0.1:8080 kubeNamespace: default kubeAddressType: ip service: type: ClusterIP mqttPort: 1883 mqttsslPort: 8883 mgmtPort: 8080 webscoketPort:8083 wssPort:8084 dashboardPort: 18083ingress: 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
好比在 Deployment.yaml 中定義的容器鏡像 image:
{{ .Values.image.repository }}:{{ .Values.image.tag }}
其中的:
.Values.image.repository就是emqx/emqx .Values.image.tag就是latest
以上兩個變量值是在 install chart 的時候自動生成的默認值。
當使用 kubernetes 部署應用的時候實際上將 templates 渲染成最終的 kubernetes 可以識別的 yaml 格式。
使用helm install --dry-run --debug <chart_dir>
命令來驗證 chart 配置。該輸出中包含了模板的變量配置與最終渲染的 yaml 文件。 deployment service 的名字前半截由兩個隨機的單詞組成,隨機數加 chart 名。這名字也能夠改爲 value 方式,本身定義若是配置等有問題此處會報錯。
helm install --set env.kubeApiserver=http://172.31.31.241:8080 --dry-run --debug .[debug] Created tunnel using local port: '43251'[debug] SERVER: "127.0.0.1:43251"[debug] Original chart version: ""[debug] CHART PATH: /home/ubuntu/emqx-helm NAME: quelling-toad REVISION: 1RELEASED: Tue Oct 30 08:18:09 2018CHART: emqx-helm-v1.0USER-SUPPLIED VALUES: env: kubeApiserver: http://172.31.31.241:8080COMPUTED VALUES: env: kubeAddressType: ip kubeApiserver: http://172.31.31.241:8080 kubeNamespace: defaultimage: pullPolicy: IfNotPresent tag: latest ingress: annotations: {} enabled: false hosts: - chart-example.local path: / tls: [] replicaCount: 2service: dashboardPort: 18083 mappingPort: 4369 mgmtPort: 8080 mqttPort: 1883 mqttsslPort: 8883 type: ClusterIP HOOKS: MANIFEST: ---# Source: emqx-helm/templates/service.yamlapiVersion: v1 kind: Service metadata: name: quelling-toad-emqx-helm labels: app.kubernetes.io/name: emqx-helm helm.sh/chart: emqx-helm-v1.0 app.kubernetes.io/instance: quelling-toad app.kubernetes.io/managed-by: Tiller spec: type: ClusterIP ports: - name: mqtt port: 1883 protocol: TCP targetPort: 1883 - name: mqttssl port: 8883 protocol: TCP targetPort: 8883 - name: mgmt port: 8080 protocol: TCP targetPort: 8080 - name: webscoket port: 8083 protocol: TCP targetPort: 8083 - name: wss port: 8084 protocol: TCP targetPort: 8084 - name: dashboard port: 18083 protocol: TCP targetPort: 18083 selector: app.kubernetes.io/name: emqx-helm app.kubernetes.io/instance: quelling-toad ---# Source: emqx-helm/templates/deployment.yamlapiVersion: apps/v1beta2 kind: Deployment metadata: name: quelling-toad-emqx-helm labels: app.kubernetes.io/name: emqx-helm helm.sh/chart: emqx-helm-v1.0 app.kubernetes.io/instance: quelling-toad app.kubernetes.io/managed-by: Tiller spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: emqx-helm app.kubernetes.io/instance: quelling-toad template: metadata: labels: app.kubernetes.io/name: emqx-helm app.kubernetes.io/instance: quelling-toad spec: containers: - name: emqx-helm image: "emqx/emqx:latest" imagePullPolicy: IfNotPresent ports: - containerPort: 1883 - containerPort: 8883 - containerPort: 8080 - containerPort: 8083 - containerPort: 8084 - containerPort: 18083 env: - name: EMQX_NAME value: emqx - name: EMQX_CLUSTER__K8S__APP_NAME value: emqx - name: EMQX_CLUSTER__DISCOVERY value: k8s - name: EMQX_CLUSTER__K8S__SERVICE_NAME value: quelling-toad-emqx-helm - name: EMQX_CLUSTER__K8S__APISERVER value: http://172.31.31.241:8080 - name: EMQX_CLUSTER__K8S__NAMESPACE value: default - name: EMQX_CLUSTER__K8S__ADDRESS_TYPE value: ip - name: EMQX_CLUSTER__K8S__APP_NAME value: emqx tty: true
在 EMQ X 目錄下執行下面的命令將應用部署到 kubernetes 集羣上。
$ helm install --set env.kubeApiserver=http://172.31.31.241:8080 .NAME: ugly-bumblebee LAST DEPLOYED: Tue Oct 30 08:19:17 2018NAMESPACE: defaultSTATUS: DEPLOYED RESOURCES: ==> v1/Service NAME AGE ugly-bumblebee-emqx-helm 0s ==> v1beta2/Deployment ugly-bumblebee-emqx-helm 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE ugly-bumblebee-emqx-helm-5bc599849f-n4htc 0/1 ContainerCreating 0 0s ugly-bumblebee-emqx-helm-5bc599849f-xwdn7 0/1 ContainerCreating 0 0s NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=emqx-helm,app.kubernetes.io/instance=ugly-bumblebee" -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
$ helm listNAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE ugly-bumblebee 1 Tue Oct 30 08:19:17 2018 DEPLOYED emqx-helm-v1.0 v1.0 default$ helm delete ugly-bumblebee release "ugly-bumblebee" deleted
咱們能夠修改 Chart.yaml 中的 helm chart 配置信息,而後使用下列命令將 chart 打包成一個壓縮文件。
$ helm package . Successfully packaged chart and saved it to: /home/ubuntu/emqx/emqx-v1.0.tgz
chart 庫是帶有一個 index.yaml 文件和任意個打包 chart 的 HTTP 服務器。當準備好分享 chart 時,首選方法是將其上傳到 chart 庫。
因爲 chart 庫能夠是任何能夠提供 YAML 和 tar 文件並能夠回答 GET 請求的 HTTP 服務器,所以當託管本身的 chart 庫時,不少選擇。例如,可使用 Google 雲端存儲(GCS)存儲桶,Amazon S3 存儲桶,Github Pages,甚至能夠建立本身的 Web 服務器。
chart 庫由打包的 chart 和一個名爲的特殊文件組成, index.yaml 其中包含 chart 庫中全部 chart 的索引。一般,index.yaml 描述的 chart 也是託管在同一臺服務器上,源代碼文件也是如此。
例如,chart 庫的佈局 https://example.com/charts 可能以下所示:
charts/ | |- index.yaml | |- alpine-0.1.2.tgz | |- alpine-0.1.2.tgz.prov
這種狀況下,索引文件包含有關一個 chart(Alpine chart)的信息,並提供該 chart 的下載 URL https://example.com/charts/al...。
不要求 chart 包與 index.yaml 文件位於同一臺服務器上 。可是,放在一塊兒這樣作一般是最簡單的。
索引文件是一個叫作 yaml 文件 index.yaml。它包含一些關於包的元數據,包括 chart 的 Chart.yaml 文件的內容。一個有效的 chart 庫必須有一個索引文件。索引文件包含有關 chart 庫中每一個 chart 的信息。helm repo index 命令將根據包含打包的 chart 的給定本地目錄生成索引文件。
下面一個索引文件的例子:
apiVersion: v1 entries: alpine: - created: 2016-10-06T16:23:20.499814565-06:00 description: Deploy a basic Alpine Linux pod digest: 99c76e403d752c84ead610644d4b1c2f2b453a74b921f422b9dcb8a7c8b559cd home: https://k8s.io/helm name: alpine sources: - https://github.com/kubernetes/helm urls: - https://technosophos.github.io/tscharts/alpine-0.2.0.tgz version: 0.2.0 - created: 2016-10-06T16:23:20.499543808-06:00 description: Deploy a basic Alpine Linux pod digest: 515c58e5f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cd78727 home: https://k8s.io/helm name: alpine sources: - https://github.com/kubernetes/helm urls: - https://technosophos.github.io/tscharts/alpine-0.1.0.tgz version: 0.1.0 nginx: - created: 2016-10-06T16:23:20.499543808-06:00 description: Create a basic nginx HTTP server digest: aaff4545f79d8b2913a10cb400ebb6fa9c77fe813287afbacf1a0b897cdffffff home: https://k8s.io/helm name: nginx sources: - https://github.com/kubernetes/charts urls: - https://technosophos.github.io/tscharts/nginx-1.1.0.tgz version: 1.1.0generated: 2016-10-06T16:23:20.499029981-06:00
生成的索引和包能夠從基本的網絡服務器提供。可使用 helm serve 啓動本地服務器,在本地測試全部內容。
$ helm serve --repo-path ./charts Regenerating index. This may take a moment. Now serving you on 127.0.0.1:8879
要配置普通 Web 服務器來服務 Helm chart,只需執行如下操做:
例如,若是想在 $WEBROOT/charts 之外的目錄爲 chart 提供服務,請確保 Web 根目錄中有一個 charts/ 目錄,並將索引文件和 chart 放入該文件夾內。
如今已有一個 chart 存儲庫,讓咱們上傳一個 chart 和一個索引文件到存儲庫。chart 庫中的 chart 必須正確打包(helm package chart-name/)和版本(遵循 SemVer 2 標準)。
接下來的這些步驟是一個示例工做流程,也能夠用你喜歡的任何工做流程來存儲和更新 chart 庫中的 chart。
準備好打包 chart 後,建立一個新目錄,並將打包 chart 移動到該目錄。
$ helm package . $ mkdir emqx-charts $ mv emqx-0.1.0.tgz emqx-charts/ $ helm repo index emqx-charts --url https://example.com/charts
最後一條命令採用剛建立的本地目錄的路徑和遠程 chart 庫的 URL,並在給定的目錄路徑中生成 index.yaml。
如今可使用同步工具或手動將 chart 和索引文件上傳到 chart 庫。若是使用 Google 雲端存儲,請使用 gsutil 客戶端查看此示例工做流程。對於 GitHub,能夠簡單地將 chart 放入適當的目標分支中。
每次將新 chart 添加到存儲庫時,都必須從新生成索引。helm repo index 命令將 index.yaml 從頭開始徹底重建該文件,但僅包括它在本地找到的 chart。
可使用 --merge 標誌向現有 index.yaml 文件增量添加新 chart(在使用遠程存儲庫(如 GCS)時,這是一個很好的選擇)。運行 helm repo index --help 以瞭解更多信息,
確保上傳修改後的 index.yaml 文件和 chart。若是生成了出處 provenance 文件,也要上傳。
準備好分享 chart 時,只需讓別人知道存儲庫的 URL 是什麼就能夠了。
他們將經過 helm repo add [NAME] [URL]
命令將倉庫添加到他們的 helm 客戶端,並能夠起一個帶有任何想用來引用倉庫的名字。
$ helm repo add emqx-charts https://example.com/charts $ helm repo list emqx-charts https://example.com/charts
若是 chart 由 HTTP 基本認證支持,也能夠在此處提供用戶名和密碼:
$ helm repo add emqx-charts https://example.com/charts --username my-username --password my-password $ helm repo list emqx-charts https://example.com/charts
注意: 若是存儲庫不包含有效信息庫 index.yaml 文件,則添加不會成功。
以後,用戶將可以搜索 chart。更新存儲庫後,他們可使用該 helm repo update 命令獲取最新的 chart 信息。
原理是helm repo add和helm repo update命令獲取index.yaml文件並將它們存儲在 $HELM_HOME/repository/cache/目錄中。這是helm search 找到有關chart的信息的地方。
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。