Helm架構由Helm客戶端、Tiller服務器端和Chart倉庫所組成;Tiller部署在Kubernetes中,Helm客戶端從Chart倉庫中獲取Chart安裝包,並將其安裝部署到Kubernetes集羣中。node
#下載安裝包 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/
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
這裏使用阿里的鏡像和阿里的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"}
helm reset 或 helm reset --force
查看倉庫列表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/ &
kubeapps是一個基於web的用戶界面,用於部署和管理在kubernetes羣集中的應用程序。Kubeapps容許你:安全
安裝訪問服務器
helm repo add bitnami https://charts.bitnami.com/bitnami helm install --name kubeapps --namespace kubeapps bitnami/kubeapps
kubectl create serviceaccount kubeapps-operator kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
#使用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
下面咱們經過一個完整的示例來學習如何使用 Helm 建立、打包、分發、安裝、升級及回退Kubernetes應用。併發
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中幾個重要文件解釋:
其中firstchart/templates/的文件及其做用以下:
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 的時候就自動生成的默認值,你能夠根據實際狀況進行修改。
打開 Chart.yaml, 填寫你部署的應用的詳細信息,以 firstchart 爲例:
$ cat firstchart/Chart.yaml apiVersion: v1 appVersion: "1.0" description: A Helm chart for Kubernetes name: firstchart version: 0.1.0
編輯 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: {}
$ helm lint firstchart/ ==> Linting . [INFO] Chart.yaml: icon is recommended 1 chart(s) linted, no failures
若是文件格式錯誤,能夠根據提示進行修改。
$ 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/
雖然咱們已經打包了 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
注: 由於網上文檔都是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
完成部署後,如今 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
從上面 helm list 輸出的結果中咱們能夠看到有一個 Revision(更改歷史)字段,該字段用於表示某一個 Release 被更新的次數,咱們能夠用該特性對已部署的 Release 進行回滾
將版本號從 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
如今用 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
若是更新後的程序因爲某些緣由運行有問題,須要回退到舊版本的應用。首先咱們可使用 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!
若是每次上線回滾都要打包,更新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'
# helm delete busybox release "busybox" 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
# 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
# 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
# helm delete --purge busybox release "busybox" deleted
# helm hist busybox Error: release: "busybox" not found # helm ls 命令也已均無查詢記錄。 # helm ls --deleted # helm ls -a busybox