您好,登錄后才能下訂單哦!
一、Helm概述
Helm是一個(gè)用于kubernetes的包管理器。每個(gè)包稱為一個(gè)Chart,一個(gè)Chart是一個(gè)目錄(一般情況下會(huì)將目錄進(jìn)行打包壓縮,形成name-version.tgz格式的單一文件,方便傳輸和存儲(chǔ))。我們可以將Helm看作Kubernetes下的apt-get/yum。
對(duì)于應(yīng)用發(fā)布者而言,可以通過(guò)Helm打包應(yīng)用,管理應(yīng)用依賴關(guān)系,管理應(yīng)用版本并發(fā)布應(yīng)用到軟件倉(cāng)庫(kù)。
對(duì)于使用者而言,使用Helm后無(wú)須了解Kubernetes的yaml文件語(yǔ)法、應(yīng)用部署文件。直接使用Helm下載即可在Kubernetes上安裝需要的應(yīng)用。
Helm是一個(gè)命令行下的客戶端工具。主要用于Kubernetes應(yīng)用程序Chart的創(chuàng)建、打包、發(fā)布及創(chuàng)建和管理本地和遠(yuǎn)程的Chart倉(cāng)庫(kù)。
Tiller是Helm的服務(wù)端,部署在Kubernetes集群中,Tiller用于接收Helm的請(qǐng)求,并根據(jù)Chart生成Kubernetes的部署文件,然后提交給Kubernetes創(chuàng)建應(yīng)用,Tiller還提供和了Release的升級(jí)、刪除、回滾等一系列功能。
Chart是一個(gè)Helm的程序包,包含了運(yùn)行一個(gè)Kubernetes應(yīng)用程序所需的鏡像、依賴關(guān)系和資源定義等。
Repoistory是Helm的軟件倉(cāng)庫(kù),Repository本質(zhì)上是一個(gè)Web服務(wù)器,該服務(wù)器保存了一系列的Chart軟件包以供用戶下載,并且提供了該Repository的Chart包的清單文件便于查詢。Helm可以同時(shí)管理多個(gè)不同的Repository。
Release是應(yīng)用程序運(yùn)行Chart之后,得到的一個(gè)實(shí)例。
注意:Helm中提到的Release和我們通常概念中的版本有所不同,這里的Release可以理解為Helm使用Chart包部署的一個(gè)應(yīng)用實(shí)例。
Chart install過(guò)程:
1)Helm從指定的目錄或者tgz文件中解析出Chart結(jié)構(gòu)信息;
2)Helm將指定的Chart結(jié)構(gòu)和Values信息通過(guò)gRPC傳遞給Tiller;
3)Tiller根據(jù)Chart和Values生成一個(gè)Release;
4)Tiller將Release發(fā)送給Kubernetes用于生成Release;
---
Chart update過(guò)程:
1)Helm從指定的目錄或者tgz文件中解析出Chart結(jié)構(gòu)信息;
2)Helm將要更新的Release的名稱和Chart結(jié)構(gòu)、Values信息傳遞給Tiller;
3)Tiller生成Release并更新指定名稱的Release的history;
4)Tiller將Release發(fā)送給Kubernetes用于更新Release;
---
Chart Rollback過(guò)程:
1)Helm將要回滾的Release的名稱傳遞給Tiller;
2)Tiller根據(jù)Release的名稱查找history;
3)Tiller從history中獲取上一個(gè)Release;
4)Tiller將上一個(gè)Release發(fā)送給Kubernetes用于替換當(dāng)前的Release;
[root@master ~]# wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
#從Github上下載Helm軟件包
[root@master ~]# tar zxf helm-v2.14.3-linux-amd64.tar.gz
[root@master ~]# mv linux-amd64/helm /usr/local/bin/
[root@master ~]# chmod +x /usr/local/bin/helm
#獲取這個(gè)軟件包只是為了獲取這個(gè)helm文件
[root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile
[root@master ~]# source /etc/profile
#設(shè)置helm命令可以自動(dòng)補(bǔ)全并且寫入環(huán)境變量文件中
[root@master ~]# vim tiller-rbac.yaml #編寫yaml文件并創(chuàng)建授權(quán)用戶
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
[root@master ~]# kubectl apply -f tiller-rbac.yaml
[root@master ~]# helm init --service-account=tiller
#指定剛才創(chuàng)建的授權(quán)用戶初始化helm
[root@master ~]# kubectl get pod -n kube-system | grep tiller
tiller-deploy-8557598fbc-jf85m 0/1 ErrImagePull 0 3m1s
#發(fā)現(xiàn)pod并沒(méi)有運(yùn)行,那是因?yàn)樵損od使用的是Google的鏡像,國(guó)內(nèi)下載不了,需要將鏡像換成國(guó)內(nèi)的鏡像,這里選擇阿里云
[root@master ~]# kubectl edit pod -n kube-system tiller-deploy-8557598fbc-jf85m
#修改spec字段的image指定的鏡像,修改前如下:
image: gcr.io/kubernetes-helm/tiller:v2.14.3
#修改后如下:
image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
#修改后,如果沒(méi)有自動(dòng)下載,就想辦法吧,比如說(shuō)在tiller容器所在的節(jié)點(diǎn)手動(dòng)下載下來(lái)鏡像,然后重啟該節(jié)點(diǎn)的kubelet,或重啟該容器
[root@master ~]# kubectl get pod -n kube-system | grep tiller
tiller-deploy-8557598fbc-jf85m 1/1 Running 0 6m31s
#必須保證tiller的Pod正常運(yùn)行
[root@master ~]# helm repo list #查看倉(cāng)庫(kù)的詳細(xì)信息
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
#默認(rèn)情況下,倉(cāng)庫(kù)的地址是某歌,國(guó)內(nèi)無(wú)法下載,需要更改為國(guó)內(nèi)的倉(cāng)庫(kù)地址
[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#更改為國(guó)內(nèi)阿里云的倉(cāng)庫(kù)地址
[root@master ~]# helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
#再次查看倉(cāng)庫(kù)地址,可以發(fā)現(xiàn)地址已經(jīng)換成了阿里云的倉(cāng)庫(kù)地址
[root@master ~]# helm repo update # 更新一下Helm倉(cāng)庫(kù)
[root@master ~]# helm version #查看helm版本信息
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
#必須保證可以查看出來(lái)client和server,才可正常使用helm
就此Helm就已經(jīng)表示部署成功,可以正常使用!
[root@master ~]# yum -y install nfs-utils rpcbind
[root@master ~]# mkdir /nfsdata
[root@master ~]# echo "/nfsdata *(rw,no_root_squash,sync)" > /etc/exports
[root@master ~]# systemctl start nfs-server && systemctl start rpcbind
[root@master ~]# showmount -e
Export list for master:
/nfsdata *
[root@master ~]# vim rbac-rolebind.yaml
apiVersion: v1 #創(chuàng)建一個(gè)用于認(rèn)證的服務(wù)賬號(hào)
kind: ServiceAccount
metadata:
name: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1 #創(chuàng)建群集規(guī)則
kind: ClusterRole
metadata:
name: nfs-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get","create","list", "watch","update"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding #將服務(wù)認(rèn)證用戶與群集規(guī)則進(jìn)行綁定
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-runner
apiGroup: rbac.authorization.k8s.io
[root@master ~]# kubectl apply -f rbac-rolebind.yaml
[root@master ~]# vim nfs-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1 #指定副本數(shù)量為1
strategy:
type: Recreate #指定策略類型為重置
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-provisioner #指定rbac yaml文件中創(chuàng)建的認(rèn)證用戶賬號(hào)
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner #使用的鏡像
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes #指定容器內(nèi)掛載的目錄
env:
- name: PROVISIONER_NAME #容器內(nèi)的變量用于指定提供存儲(chǔ)的名稱
value: lzj-test
- name: NFS_SERVER #容器內(nèi)的變量用于指定nfs服務(wù)的IP地址
value: 192.168.1.1
- name: NFS_PATH #容器內(nèi)的變量指定nfs服務(wù)器對(duì)應(yīng)的目錄
value: /nfsdata
volumes: #指定掛載到容器內(nèi)的nfs的路徑及IP
- name: nfs-client-root
nfs:
server: 192.168.1.1
path: /nfsdata
[root@master ~]# kubectl apply -f nfs-deployment.yaml
[root@master ~]# kubectl get pod | grep nfs #確認(rèn)pod運(yùn)行成功
nfs-client-provisioner-7cf975c58b-2hbcm 1/1 Running 0 80s
[root@master ~]# vim storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: stateful-nfs
provisioner: lzj-test #這個(gè)要和nfs-client-provisioner的env環(huán)境變量中的PROVISIONER_NAME的value值對(duì)應(yīng)。
reclaimPolicy: Retain #指定回收策略為Retain(手動(dòng)釋放)
[root@master ~]# kubectl apply -f storage-class.yaml
[root@master ~]# kubectl get sc #確認(rèn)Storage Class創(chuàng)建成功
NAME PROVISIONER AGE
stateful-nfs lzj-test 14s
[root@master ~]# helm fetch stable/mysql #將mysql的軟件包下載到本地
[root@master ~]# tar zxf mysql-0.3.5.tgz
[root@master ~]# vim mysql/values.yaml +55
storageClass: "stateful-nfs" #去除注釋,并指定剛才創(chuàng)建的Storage Class名稱
[root@master ~]# vim mysql/values.yaml +79
type: NodePort #默認(rèn)是ClusterIP,可更改為NodePort
[root@master ~]# helm install stable/mysql -f mysql/values.yaml --set mysqlRootPassword=123.com -n test-mysql
#如果修改了values.yaml文件的數(shù)據(jù),創(chuàng)建時(shí)應(yīng)該指定values.yaml文件
#安裝mysql,并設(shè)置mysql的root密碼為123.com,-n表示指定名稱
[root@master ~]# helm list #查看已安裝的軟件包
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
test-mysql 1 Mon Mar 2 15:14:15 2020 DEPLOYED mysql-0.3.5 default
[root@master ~]# kubectl get svc | grep test-mysql #確認(rèn)service類型
test-mysql-mysql NodePort 10.111.61.171 <none> 3306:30637/TCP 26m
[root@master ~]# kubectl get pv,pvc #查看PV、PVC是否綁定成功
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-2d0d5eb7-1023-436d-b931-0a344a3df990 8Gi RWO Delete Bound default/test-mysql-mysql stateful-nfs 27m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/test-mysql-mysql Bound pvc-2d0d5eb7-1023-436d-b931-0a344a3df990 8Gi RWO stateful-nfs 27m
[root@master ~]# kubectl exec -it test-mysql-mysql-dfb9b6944-tz2vd -- mysql -u root -p123.com
#登錄到剛才創(chuàng)建的mysql數(shù)據(jù)庫(kù)中
mysql>
[root@master ~]# kubectl describe pod test-mysql-mysql-dfb9b6944-tz2vd
#查看pod的詳細(xì)信息可以看出,該pod所用鏡像為mysql:5.7.14
[root@master ~]# helm upgrade --set imageTag=5.7.15 test-mysql stable/mysql -f mysql/values.yaml
#對(duì)test-mysql這個(gè)實(shí)例進(jìn)行鏡像的升級(jí),由于更改了service、Storage Class,所以升級(jí)時(shí),也需指定values.yaml文件
[root@master ~]# kubectl get pod | grep test-mysql #確保升級(jí)之后,pod是正常運(yùn)行的
#注意升級(jí)之后,pod名稱會(huì)發(fā)生變化
test-mysql-mysql-54c7bfdd77-lrzm8 1/1 Running 0 3m11s
[root@master ~]# kubectl describe pod test-mysql-mysql-54c7bfdd77-lrzm8
#查看pod的詳細(xì)信息,可以看出,鏡像已經(jīng)升級(jí)為mysql:5.7.15
[root@master ~]# helm list #再次查看實(shí)例,可以發(fā)現(xiàn)“REVISION”字段為2,而初次創(chuàng)建實(shí)例時(shí),該列為1,只要對(duì)該實(shí)例進(jìn)行升級(jí)回滾一次,數(shù)值便會(huì)加1
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
test-mysql 2 Mon Mar 2 15:48:35 2020 DEPLOYED mysql-0.3.5 default
[root@master ~]# helm history test-mysql #查看該實(shí)例的歷史版本
REVISION UPDATED STATUS CHART DESCRIPTION
1 Mon Mar 2 15:14:15 2020 SUPERSEDED mysql-0.3.5 Install complete
2 Mon Mar 2 15:48:35 2020 DEPLOYED mysql-0.3.5 Upgrade complete
[root@master ~]# helm rollback test-mysql 1 #將該實(shí)例回滾到版本1
[root@master ~]# helm list #再次查看,可以看到“REVISION”的值變成了3
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
test-mysql 3 Mon Mar 2 15:57:58 2020 DEPLOYED mysql-0.3.5 default
[root@master ~]# kubectl get pod | grep test-mysql #確認(rèn)pod是正常狀態(tài)
#對(duì)pod進(jìn)行回滾操作也會(huì)更改pod的名稱
test-mysql-mysql-dfb9b6944-tj2cr 1/1 Running 1 107s
[root@master ~]# kubectl describe pod test-mysql-mysql-dfb9b6944-tj2cr
#查看pod的詳細(xì)信息,可以看出,該pod使用的鏡像已經(jīng)回滾到mysql:5.7.14版本
[root@node01 ~]# mkdir -p /var/www/charts
#創(chuàng)建目錄,用于存放charts包
[root@node01 ~]# docker run -d -p 8080:80 -v /var/www:/usr/local/apache2/htdocs httpd
[root@master ~]# helm create testchart
#創(chuàng)建chart包(生成的是目錄),名稱為testchart
[root@master ~]# helm package testchart
#將剛才生成的目錄進(jìn)行打包,會(huì)在當(dāng)前目錄下生成名為testchart-0.1.0.tgz的包
[root@master ~]# mkdir myrepo
[root@master ~]# mv testchart-0.1.0.tgz myrepo/
#創(chuàng)建用于存放chart包的目錄,并將chart包移動(dòng)到該目錄
[root@master ~]# helm repo index myrepo/ --url http://192.168.1.2:8080/charts
#url路徑表示運(yùn)行web容器的節(jié)點(diǎn)IP+端口
[root@master ~]# ls myrepo/
index.yaml testchart-0.1.0.tgz
#確認(rèn)已經(jīng)生成index.yaml文件
[root@master ~]# scp myrepo/* node01:/var/www/charts
#將生成的index.yaml文件及charts包復(fù)制到web容器所在節(jié)點(diǎn)映射的本地目錄
[root@master ~]# helm repo add newrepo http://192.168.1.2:8080/charts
#url是web容器所在的節(jié)點(diǎn)的IP+端口+存放chart包的目錄,并指定倉(cāng)庫(kù)的名稱為newrepo
[root@master ~]# helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
newrepo http://192.168.1.2:8080/charts
#stable是剛創(chuàng)建helm添加的阿里云的倉(cāng)庫(kù)
#local是本地的緩存
#newrepo是剛剛添加的倉(cāng)庫(kù)名稱(確認(rèn)該倉(cāng)庫(kù)已經(jīng)存在)
配置至此,已經(jīng)可以正常供內(nèi)網(wǎng)環(huán)境使用這個(gè)charts包的私有倉(cāng)庫(kù)了,下面是一些驗(yàn)證。
[root@master ~]# helm search testchart
NAME CHART VERSION APP VERSION DESCRIPTION
local/testchart 0.1.0 1.0 A Helm chart for Kubernetes
newrepo/testchart 0.1.0 1.0 A Helm chart for Kubernetes
#local是本地的緩存,不用理會(huì),可以查看到newrepo提供的testchart包
[root@master ~]# helm install newrepo/testchart -n test-nginx
#既然可以搜索到就表示可以使用chart包創(chuàng)建實(shí)例
[root@master ~]# kubectl get pod | grep test-nginx
test-nginx-testchart-64d8585997-qjjgb 1/1 Running 0 3m54s
#確認(rèn)pod已經(jīng)運(yùn)行成功
[root@master ~]# kubectl describe pod test-nginx-testchart-64d8585997-qjjgb
#通過(guò)查看pod的詳細(xì)信息,確認(rèn)pod所使用的鏡像
其實(shí)就是一個(gè)服務(wù)版本升級(jí)的操作,大概思路如下:修改解壓后的charts包目錄下的values.yaml文件為所需的值(values.yaml文件包含的是這個(gè)服務(wù)的值,可以在里面指定鏡像及標(biāo)簽、數(shù)據(jù)持久化的類型等等),修改完成后,再使用下面的命令進(jìn)行升級(jí)操作。
[root@master ~]# helm upgrade -f testchart/values.yaml test-nginx newrepo/testchart
#my-nginx是之前實(shí)例的名稱,可以通過(guò)“helm list”查看實(shí)例名稱
#newrepo/testchart :為自定義倉(cāng)庫(kù)中的chart包
[root@master ~]# kubectl describe pod test-nginx-testchart-6d6984ddd9-gn9sw
#確認(rèn)pod所使用的鏡像已經(jīng)更新
注意
如果使用命令的方式直接進(jìn)行升級(jí),命令執(zhí)行完成不會(huì)報(bào)錯(cuò),但是鏡像并不會(huì)更新,推薦使用更改values.yaml的方式進(jìn)行升級(jí)!
[root@master ~]# helm create mychart
[root@master ~]# helm package mychart/
[root@master ~]# mv mychart-0.1.0.tgz myrepo/
[root@master ~]# helm repo index myrepo/ --url http://192.168.1.2:8080/charts
#當(dāng)有新的chart包時(shí),需更新index.yaml文件
[root@master ~]# scp myrepo/* node01:/var/www/charts
[root@master ~]# helm repo update
#如果需要使用則需更新一下本地的倉(cāng)庫(kù)
[root@master ~]# helm search mychart
NAME CHART VERSION APP VERSION DESCRIPTION
local/mychart 0.1.0 1.0 A Helm chart for Kubernetes
newrepo/mychart 0.1.0 1.0 A Helm chart for Kubernetes
#確保新添加的chart包可以被搜索到
[root@master ~]# helm version #查看helm版本信息
[root@master ~]# helm list #查看當(dāng)前安裝的Chart包
[root@master ~]# helm search mysql #查看與mysql相關(guān)的chart包
[root@master ~]# helm fetch stable/mysql #將mysql軟件包下載到本地
[root@master ~]# helm inspect stable/mysql #查看該軟件包的詳細(xì)信息
[root@master ~]# helm install stable/mysql -n mysql #安裝指定的mysql軟件包,并命名為mysql
[root@master ~]# helm status mysql #查看mysql的狀態(tài)信息
[root@master ~]# helm delete --purge mysql #刪除mysql,并將本地的緩存也進(jìn)行刪除
[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#添加阿里云的repo源
[root@master ~]# helm repo update #更新repo倉(cāng)庫(kù)資源
[root@master ~]# helm create helm_charts #創(chuàng)建一個(gè)chart,名稱為helm_charts
[root@master ~]# cd helm_charts/ && helm lint #測(cè)試charts語(yǔ)法
[root@master ~]# helm package helm_charts #打包c(diǎn)harts
[root@master helm_charts]# helm template helm_charts-0.1.0.tgz #查看該軟件包生成的yaml文件
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。