k8s筆記十一(Helm程序包管理器的安裝與使用)

一、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文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章