一、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檔案。