kubernetes實戰篇之helm完整示例

系列目錄html

構建一個 Helm Chart

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

建立一個名爲 mychart 的 Chartnginx

$ helm create mychart

該命令建立了一個 mychart 目錄,該目錄結構以下所示。這裏咱們主要關注目錄中的 Chart.yaml、values.yaml、NOTES.txt 和 Templates 目錄。json

[centos@k8s-master helm]$ tree mychart
mychart
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
  • Chart.yaml 用於描述這個 Chart的相關信息,包括名字、描述信息以及版本等。

僅僅是一些簡單的文本描述centos

  • values.yaml 用於存儲 templates 目錄中模板文件中用到變量的值。api

  • NOTES.txt 用於介紹 Chart 部署後的一些信息,例如:如何使用這個 Chart、列出缺省的設置等。bash

  • Templates 目錄下是 YAML 文件的模板,該模板文件遵循 Go template 語法。網絡

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

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

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

以上兩個變量值是在 create chart 的時候就自動生成的默認值,你能夠根據實際狀況進行修改。實際上都是靜態文本,只在是執行的時候才被解析.

若是你須要瞭解更多關於 Go 模板的相關信息,能夠查看 Hugo 的一個關於 Go 模板 的介紹

編寫應用的介紹信息

打開 Chart.yaml,能夠看到內容以下

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

編寫具體應用部署信息

編輯 values.yaml,它默認會在 Kubernetes 部署一個 Nginx。下面是 mychart 應用的 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 mychart/
==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures

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

將應用打包

$ helm package mychart
Successfully packaged chart and saved it to: /home/k8s/mychart-0.1.0.tgz

mychart 目錄會被打包爲一個 mychart-0.1.0.tgz 格式的壓縮包,該壓縮包會被放到當前目錄下,並同時被保存到了 Helm 的本地缺省倉庫目錄中。

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

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

將應用發佈到 Repository

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

$ helm search mychart
No results found

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

注:新版本中執行 helm init 命令後默認會配置一個名爲 local 的本地倉庫。若是你們經過helm repo list 能夠看到local選項,則爲默認添加了,下面的有配置不用管,固然若是你不太明白仍然按照下面的操做執行了,也是沒有問題的

咱們能夠在本地啓動一個 Repository Server,並將其加入到 Helm Repo 列表中。Helm Repository 必須以 Web 服務的方式提供,這裏咱們就使用 helm serve 命令啓動一個 Repository Server,該 Server 缺省使用 $HOME/.helm/repository/local 目錄做爲 Chart 存儲,並在 8879 端口上提供服務。

$ helm serve &
Now serving you on 127.0.0.1:8879

默認狀況下該服務只監聽 127.0.0.1,若是你要綁定到其它網絡接口,可以使用如下命令:

helm serve --address 192.168.100.211:8879 &

若是你想使用指定目錄來作爲 Helm Repository 的存儲目錄,能夠加上 --repo-path 參數

helm serve --address 192.168.124.59:8879 --repo-path /data/helm/repository/ --url http://192.168.124.59:8879/charts/

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

更新 Helm Repository 的索引文件
$ cd /home/k8s/.helm/repository/local
$ helm repo index --url=http://192.168.100.211:8879 .

完成啓動本地 Helm Repository Server 後,就能夠將本地 Repository 加入 Helm 的 Repo 列表

$ helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories

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

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

在 Kubernetes 中部署應用

部署一個應用

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

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

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

在部署前咱們可使用 helm install --dry-run --debug --name 命令來驗證 Chart 的配置。該輸出中包含了模板的變量配置與最終渲染的 YAML 文件。

$ helm install --dry-run --debug local/mychart --name mike-test
[debug] Created tunnel using local port: '46649'

[debug] SERVER: "127.0.0.1:46649"

[debug] Original chart version: ""
[debug] Fetched local/mychart to /home/k8s/.helm/cache/archive/mychart-0.1.0.tgz

[debug] CHART PATH: /home/k8s/.helm/cache/archive/mychart-0.1.0.tgz

NAME:   tylertest
REVISION: 1
RELEASED: Mon Jul 23 10:39:49 2018
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
{}

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

HOOKS:
MANIFEST:

---
# Source: mychart/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: tylertest-mychart
  labels:
    app: mychart
    chart: mychart-0.1.0
    release: tyler-test
    heritage: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mychart
    release: mike-test
---
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: tylertest-mychart
  labels:
    app: mychart
    chart: mychart-0.1.0
    release: tyler-test
    heritage: Tiller
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mychart
      release: tyler-test
  template:
    metadata:
      labels:
        app: mychart
        release: tyler-test
    spec:
      containers:
        - name: mychart
          image: "nginx:stable"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {}

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

# 部署時需指定 Chart 名及 Release(部署的實例)名。
$ helm install local/mychart --name mike-test
NAME:   mike-test
LAST DEPLOYED: Mon Jul 23 10:41:20 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
mike-test-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   1s

==> v1beta2/Deployment
NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
mike-test-mychart  1        0        0           0          0s

==> v1/Pod(related)
NAME                                READY  STATUS   RESTARTS  AGE
mike-test-mychart-6d56f8c8c9-d685v  0/1    Pending  0         0s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -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 install 默認會用到 socat,須要在全部節點上安裝 socat 軟件包。

關於訪問的部分這裏就再也不介紹了,後面會講解一個完整項目對外暴露訪問

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

$ helm list
NAME        REVISION    UPDATED                     STATUS      CHART           NAMESPACE
tylertest   1           Mon Jul 23 10:41:20 2018    DEPLOYED    mychart-0.1.0   default

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

$ helm status tylertest
LAST DEPLOYED: Mon Jul 23 10:41:20 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                                READY  STATUS   RESTARTS  AGE
tylertest-mychart-6d56f8c8c9-d685v  1/1    Running  0         1m

==> v1/Service
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
tylertest-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   1m

==> v1beta2/Deployment
NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
tylertest-mychart  1        1        1           1          1m


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=tyler-test" -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 list 輸出的結果中咱們能夠看到有一個 Revision(更改歷史)字段,該字段用於表示某一個 Release 被更新的次數,咱們能夠用該特性對已部署的 Release 進行回滾。

  • 修改 Chart.yaml 文件

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

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

$ helm package mychart
Successfully packaged chart and saved it to: /home/k8s/mychart-0.2.0.tgz

查詢本地倉庫中的 Chart 信息

咱們能夠看到在本地倉庫中 mychart 有兩個版本

[centos@k8s-master helm]$ helm search mychart -l
NAME            CHART VERSION   APP VERSION     DESCRIPTION
local/mychart   0.2.0           1.0             A Helm chart for Kubernetes
local/mychart   0.1.0           1.0             A Helm chart for Kubernetes
  • 升級一個應用

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

[centos@k8s-master helm]$ helm upgrade tylertest mychart
Release "tylertest" has been upgraded. Happy Helming!
LAST DEPLOYED: Thu Apr 25 09:19:53 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME               READY  UP-TO-DATE  AVAILABLE  AGE
tylertest-mychart  1/1    1           1          25m

==> v1/Pod(related)
NAME                                READY  STATUS   RESTARTS  AGE
tylertest-mychart-545479dd4b-hj9ml  1/1    Running  0         25m

==> v1/Service
NAME               TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
tylertest-mychart  ClusterIP  10.103.51.57  <none>       80/TCP   25m


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=tylertest" -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

完成後,能夠看到已部署的 tylertest 被升級到 0.2.0 版本。

NAME                    REVISION        UPDATED                         STATUS          CHART                           APP VERSION     NAMESPACE
kubernetes-dashboard    1               Thu Mar 14 09:06:25 2019        DEPLOYED        kubernetes-dashboard-1.2.0      1.10.1          kube-system
tylertest               2               Thu Apr 25 09:19:53 2019        DEPLOYED        mychart-0.2.0                   1.0             default
  • 回退一個應用

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

[centos@k8s-master helm]$ helm list tylertest
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
tylertest       2               Thu Apr 25 09:19:53 2019        DEPLOYED        mychart-0.2.0   1.0             default

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

[centos@k8s-master helm]$ helm rollback tylertest 1
Rollback was a success! Happy Helming!

注:其中的參數 1 是 helm history 查看到 Release 的歷史記錄中 REVISION 對應的值。

  • 最後,咱們使用 helm list 和 helm history 命令均可以看到 mychart 的版本已經回退到 0.1.0 版本。
[centos@k8s-master helm]$ helm list
NAME                    REVISION        UPDATED                         STATUS          CHART                           APP VERSION     NAMESPACE
kubernetes-dashboard    1               Thu Mar 14 09:06:25 2019        DEPLOYED        kubernetes-dashboard-1.2.0      1.10.1          kube-system
tylertest               3               Thu Apr 25 09:22:19 2019        DEPLOYED        mychart-0.1.0                   1.0             default
[centos@k8s-master helm]$ helm history tylertest
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Thu Apr 25 08:54:49 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Thu Apr 25 09:19:53 2019        SUPERSEDED      mychart-0.2.0   Upgrade complete
3               Thu Apr 25 09:22:19 2019        DEPLOYED        mychart-0.1.0   Rollback to 1

刪除一個應用

若是須要刪除一個已部署的 Release,能夠利用 helm delete 命令來完成刪除。

[centos@k8s-master helm]$ helm delete tylertest
release "tylertest" deleted

確認應用是否刪除,該應用已被標記爲 DELETED 狀態

[centos@k8s-master helm]$ helm ls --deleted
NAME                    REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE
intentional-chinchilla  1               Wed Apr 24 18:37:29 2019        DELETED mychart-0.1.0           1.0             default
invisible-turkey        1               Mon Apr 22 17:39:14 2019        DELETED nginx-ingress-0.21.1    0.14.0          jx
punk-condor             1               Wed Apr 24 18:38:09 2019        DELETED mychart-0.1.0           1.0             default
tylerchart              1               Wed Apr 24 18:40:01 2019        DELETED mychart-0.1.0           1.0             default
tylertest               3               Thu Apr 25 09:22:19 2019        DELETED mychart-0.1.0           1.0             default
vigilant-bat            1               Wed Apr 24 17:40:02 2019        DELETED xray-0.4.2              2.3.0           default

從上面的結果也能夠看出,默認狀況下已經刪除的 Release 只是將狀態標識爲 DELETED 了 ,但該 Release 的歷史信息仍是繼續被保存的。

[centos@k8s-master helm]$ helm history tylertest
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Thu Apr 25 08:54:49 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Thu Apr 25 09:19:53 2019        SUPERSEDED      mychart-0.2.0   Upgrade complete
3               Thu Apr 25 09:22:19 2019        DELETED         mychart-0.1.0   Deletion complete

若是要移除指定 Release 全部相關的 Kubernetes 資源和 Release 的歷史記錄,能夠用以下命令:

[centos@k8s-master helm]$ helm delete --purge tylertest
release "tylertest" deleted

再次查看已刪除的 Release,已經沒法找到相關信息。

$ helm hist tylertest
Error: release: "tyertest" not found

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