天天看點

k8s筆記十一(Helm程式包管理器的安裝與使用)一、Helm二、Helm Charts

一、Helm

       Helm是一個基于Kubernetes的程式包管理器,它将一個應用的相關資源組織成charts,并通過Charts管理程式包。

1、Helm中的一些概念

(1)Charts

       Charts是一個Helm程式包,它包含了運作一個Kubernetes應用所需要的鏡像,依賴關系和資源定義。

(2)Repositiory

      Repositiory是Charts倉庫,用于集中存儲和分發Charts。

(3)Config

      應用程式執行個體化安裝運作時使用的配置資訊。

(4)Release

      應用程式執行個體化配置後運作于Kubernetes叢集中的一個Charts執行個體。在同一叢集上,一個Charts可以使用不同的Config重複多次安裝,每次安裝都會建立一個新的Release。

2、Helm的組成

      Helm主要由Helm用戶端、Tiller伺服器和Charts倉庫組成。

      Helm用戶端是指令行用戶端工具,主要用于本地Charts開發、管理Charts倉庫及與Tiller伺服器互動等。

      Tiller server是托管于運作于kubernetes叢集之中的容器化服務應用,它接受來自Helm用戶端的請求,并在必要時與Kubernetes API Server互動。主要作用如下:

        1)監聽來自于Helm用戶端的請求

        2)合并Charts和配置以建構一個Release

        3)向Kubernetes叢集安裝Charts并對相應的Release進行追蹤

        4)更新和解除安裝Charts

3、安裝Helm Client

      Helm Client的安裝方式有兩種,分别是預編譯安裝和源碼編譯安裝,使用預編譯安裝的方式如下:

# 先去https://github.com/helm/helm下載下傳适合的版本并解壓
]# wget https://get.helm.sh/helm-v2.9.0-linux-amd64.tar.gz
]# tar -xf helm-v2.9.0-linux-amd64.tar.gz
# 将二進制程式檔案移動或複制到系統PATH環境變量指向的目錄
]# cp linux-amd64/helm /usr/bin/
# 檢視helm的用法
]# helm –help
           

      Helm的運作依賴本地安裝并配置完成的kuberctl方能與運作于Kubernetes叢集之上的Tiller伺服器進行通信;是以,運作Helm的節點也應該是可以正常使用kubectl指令的主機。為了保證後續helm能夠正常使用helm clien和tiller server版本需要一緻。

4、安裝Tiller server

      Tiller是Helm的服務端,一般運作于kubernetes叢集之上;也可以部署與本地,但需要能夠與遠端的kubernetes叢集通信。對于RBAC授權插件的Kubernetes叢集來說,需要事先建立相關的ServiceAccount才能進行安裝。

# 定義一個名為titler的ServerAccount并通過ClusterRoleBinding綁定至叢集管理者角色cluster-admin
]# cat tiller-rbac.yaml 
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
]# kubectl apply -f tiller-rbac.yaml 
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
# 完成tiller server的初始化及安裝
]# helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.0 --service-account=tiller --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 檢視tiller鏡像的運作狀态
]# kubectl get pods -n kube-system -l app=helm
NAME                             READY   STATUS    RESTARTS   AGE
tiller-deploy-7df55fb58c-wq549   1/1     Running   0          7m52
# 檢視tiller版本
]# helm version
Client: &version.Version{SemVer:"v2.9.0", GitCommit:"d325d2a9c179b33af1a024cdb5a4472b6288016a", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"}
           

       初始化安裝tiller時還有如下的選項

        1)--canary-image:安裝金絲雀build

        2)--tiller-image:安裝指定image

        3)--kube-context:安裝到指定的kubernetes叢集

        4)--tiller-namespace:安裝到指定的namespace中

        5)--upgrade:如果tiller server已經被安裝了,可以使用此選項更新鏡像

        6)--service-account:用于指定運作tiller server的serviceaccount,該account需要事先在kubernetes叢集中建立,且需要相應的rbac授權

       解除安裝tiller的方法有如下的兩種

       1)kubectl delete deployment tiller-deploy –namespae kube-system

       2)helm reset

5、Helm的使用

       Helm常用的文法可通過” helm --help”指令去查詢,常用的指令如下:

(1)“helm repo”相關的指令可用于管理使用的charts倉庫,add用于添加倉庫,update能夠更新使用的預設倉庫的員資料資訊。

# 更新倉庫資訊
]# helm repo update
           

(2)“helm search”用于列出stable倉庫中維護的charts清單

# 列出所有的charts清單
]# helm search
# 列出符合條件的charts
]# helm search redis
NAME                 CHART VERSION     APP VERSION       DESCRIPTION                                                 
stable/redis        1.1.15             4.0.8              Open source, advanced key-value store. It is often referr...
stable/redis-ha     2.0.1                                 Highly available Redis cluster with multiple sentinels an...
stable/sensu        0.2.0                                 Sensu monitoring framework backed by the Redis transport
           

(3)“helm inspect”指令能夠列印出指定的charts的詳細資訊

# 列印指定的charts的詳細資訊
]# helm inspect stable/redis
appVersion: 4.0.8
description: Open source, advanced key-value store. It is often referred to as a data
  structure server since keys can contain strings, hashes, lists, sets and sorted
  sets.
           

(4)“helm install”指令可用于安裝指定的charts為kubernetes叢集的release

# 安裝redis
]# helm install stable/redis
NAME:   sullen-snail
LAST DEPLOYED: Thu Jun 13 14:07:25 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME                TYPE    DATA  AGE
sullen-snail-redis  Opaque  1     1s

==> v1/PersistentVolumeClaim
NAME                STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
sullen-snail-redis  Pending  1s
           

(5)“helm list”指令可以列出已經安裝生成的Release,删除Release則可以使用“helm delete”指令。

# 檢視已經安裝生成的release
]# helm list
NAME                REVISION UPDATED                      STATUS   CHART              NAMESPACE
sullen-snail        1         Thu Jun 13 14:07:25 2019    DEPLOYED redis-1.1.15      default
# 删除安裝的redis
]# helm delete sullen-snail
release "sullen-snail" deleted
           

二、Helm Charts

      Charts是helm使用的kubernetes程式包打包的格式,一個charts就是一個描述一組kubernetes資源檔案的集合,Charts是一個遵循特定規範的目錄結構,它能夠打包成為一個可用于部署的版本化歸檔檔案。

1、Charts檔案組織結構

       一個Charts就是按特定格式組織的目錄結構,目錄名即為Charts名,目錄名稱本身不包含版本資訊,一個Charts中每個目錄及檔案的基本作用如下:

       (1)Chart.yaml:目前Charts的描述資訊

       (2)LICENSE:目前Charts的許可證資訊檔案,可選

       (3)requirements.yaml:目前Charts的依賴關系描述檔案,可選

       (4)README.md:易讀格式的README檔案      

       (5)values.yaml:目前charts用到的預設配置值

       (6)cahrts/目錄:存放目前Charts依賴到的所有Charts檔案

       (7)templates/目錄:存放目前Charts用到的模闆檔案,可應用于Charts生成有效的 Kuber-netes清單檔案

       (8)templaets/NOTES.txt:純文字檔案,Template簡單實用注解

2、Chart.yaml檔案組織格式

       Chary.yaml用于提供Charts相關的各種中繼資料,如名稱、版本、關鍵詞、維護者資訊、實用的模闆引擎等,它是一個Charts必備的核心檔案,主要包含如下字段:

       (1)name:目前Charts的名稱

       (2)version:遵循語義化版本規範第二版的版本号

       (3)description:目前項目的單語句描述資訊,可選字段

       (4)keyword:目前項目的關鍵詞清單,可選字段

       (5)home:目前項目首頁URL,可選字段

       (6)sources:目前項目用到的源碼的URL清單,可選字段

       (7)maintainers:項目維護者資訊,可選字段

       (8)engine:模闆引擎的名稱

       (9)icon:為URL,指向目前項目的圖示,可選字段

       (10)appVersion:本項目用到的應用程式的版本号,可選字段

       (11)deprecated:目前Charts是否已經廢棄,可選字段

       (12)tillerVersion:目前Charts依賴的Tiller版本号,可選字段

3、Charts中的依賴關系

       Helm中Charts的依賴關系可經requirements.yaml進行動态連結,也可直接存儲于charts/目錄中進行手動管理,建議使用動态管理。

(1)erquirements.yaml檔案

       Requirements.yaml檔案本質上隻是一個簡單的依賴關系表,其中包含的主要字段如下:

       1)name:被依賴的Charts的名稱

       2)version:被依賴的Charts的版本

       3)repository:被依賴的Charts所屬的倉庫及URL

       4)alias:為被依賴的Charts建立一個别名

       5)tags:預設情況下,所有的Charts都會被裝載,若給定了tags則僅裝載那些比對到 的Charts

       6)condition:類似于tags字段,但需要通過自定義的條件來指明要裝載的charts

       7)import-values:導入子charts中的值,被導入的值需要在子charts中導出。

       依賴關系配置完成後,可使用“helm dependency update”指令更新依賴關系,并自動下載下傳被依賴的charts到charts/目錄中。

(2)Charts目錄

       若需要對依賴關系進行更多的控制,則所有被依賴到的Charts都能以手工方式複制到Charts目錄中。

4、模闆和值

       Helm Charts模闆模闆遵循Go模闆語言格式,所有的模闆檔案都存儲于Template目錄中,在目前的Charts被Helm引用時,此目錄中的所有模闆檔案都會傳遞給模闆引擎進行處理。模闆檔案中用到的值可由values.yaml檔案提供或在運作helm install指令時傳遞包含所需要的自定義值得YAML檔案。

5、自定義Charts

(1)生成一個空的Charts

       建立一個Charts時可通過“helm create”指令建立,它能夠在一個新的目錄中建立初始化一個空的Charts目錄結構,并包含所需要的各個核心檔案

# 建立初始化一個名為mychart的charts
[[email protected] helm]# helm create mychart
Creating mychart
[[email protected] helm]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml
           

(2)修改Charts以部署自定義服務

# 修改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: 1.12
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80
# 修改完配置後通過helm lint指令确認修改的Charts模闆格式是否良好
]# helm lint mychart
==> Linting mychart
[INFO] Chart.yaml: icon is recommended
# 配置完成後可通過“helm install”指令調試運作
]# helm install --name mynginx --dry-run --debug ./mychart --set service.type=NodePort
# 測試無誤後部署應用
]# helm install --name mynginx ./mychart --set service.type=NodePort
NAME:   mynginx
LAST DEPLOYED: Thu Jun 13 16:30:15 2019
NAMESPACE: default
STATUS: DEPLOYED
. . . . . 
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services mynginx-mychart)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT
           

(3)Charts倉庫

       一個基于本地的Charts設定完成後,他僅用于本地通路。同時也可将它通過”helm package”打包成tar包後分享。

# 打包自定義的charts
]# helm package ./mychart/
Successfully packaged chart and saved it to: /root/job/helm/mychart-0.1.0.tgz
# 搜尋本地的charts
]# helm search local
NAME                 CHART VERSION     APP VERSION       DESCRIPTION                
local/mychart       0.1.0              1.0                A Helm chart for Kubernetes
           

(4)、配置依賴關系

      當建構存在依賴關系的Charts時。還需要為其定義依賴項,依賴項定義在requirements.yaml檔案中,定義完依賴項後通過運作“helm dependency update”指令更新依賴關系。使用者也可以手動将依賴到的程式包直接放置于mycahrt/charts目錄中定義依賴關系,此時不再必要使用requirements.yaml檔案。

繼續閱讀