一、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
[root@master01 helm]# helm create mychart
Creating mychart
[root@master01 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文件。