K8s之Helm工具详解

一、helm介绍

  • 在Kubernetes中部署容器云的应用也是一项有挑战性的工作,Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具。通过helm能够帮助开发者定义、安装和升级Kubernetes中的容器云应用,同时,也可以通过helm进行容器云应用的分享。在Kubeapps Hub中提供了包括Redis、M% i a v YySQLa ) X和Jenkins等常见的应用,通过helm可以使用一条命令就能够将其部G + 3 @ l署安装在自己的KuberC p t Knetes集群中。

  • Helm是一个用于kubernetes的包管理器。每I | x ; _个包称为一个Char ] 1 ort,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。我们可以将Helm看作Kubernetes下的apt-get/yum。

  • 对于应用& ) ] f i发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

  • 对于使用者而言,使用Helm后无须了解Kc ` l z $ ] Bubernetes的yaml文件语法、应F 3 = 2 o 2用部署文件。直接使用Helm下载即可在Kubernetes上a 9 = F A t ! ^ T安装需要的应用。

Helm组件及相关术语

1)Helm
Helm是一个命令行下的客户端工具。主要用于Kubern7 ? j { ^ &etes应用程序Chart的; m . I创建、打包、发布及创建和管理
本地和远程的Chart仓库。
2)Tiller
Tiller是Helm的服务端,部署在Kubernetes集群中,Tiller用于接收Helm的请求,并根据Chart生成Kubernete
s的部署文件,然后提交给Kubernetes创建应用,Tiller还提供和了Release的升级、删除、回滚等一系列功能。
3)Chart
Chart是一个Helm的程序包,包含了运行一个KubernZ L ) aetes应用程序所需的镜像、依赖关系和资源定义等。
4)Repoistory
Repoistory是Helm的软件仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart软件包
以供用户下载,并且) w # b Z r提供了该Repository的CY 6 6 6 T 2hart包的清单9 { n文件便于查询。Helm可以同时管理多个不同的Repositoryg # 1 I C ` B w。
5)Release
Release是应9 a Y用程序运行Chart之后,得到的一个实例。

elm架构
hn 3 } p d Eelm的整体架构如下图所示,Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller部署在Kubernetes中,HeZ g ] D V tlm客户端从Chq L 1 8 %art仓库中获取Chart安装包,并将其安装部署到Kubernetes集群中。
K8s之Helm工具详解

Chart install过程:
1)Helm从指定的目录或者tgz文件中解析出Chart结构信息;
2)Helm将指定的Chart结构和Values信息通过gRPC传递给o i E R  mTiller;
3)Tiller根据Chart和Values生成一个Release;
4)Tiller将Release发送给Kubernetes用于生成Release;
---
Chart update过程:
1)Helm从指定的目录或者tgz文件中解析出Chart结构信息;
2)Helm将要更新的Release的名称和Chart结构、Values信息传递给Tiller;
3)Tiller生成Release并更新指定名称的Release的history;
4)Tillem B : ? 7r将Release发送[ k E %给Kubernetes用于更新Release;
---
Chart Rollback过程:
1)Helm将要回滚的Release的名称传递给Tiller;
2)Tiller根据Release的名称查找histor] U S & *y;
3)Tiller从history中获取上一个Release;
4)Tiller将上一个Release发送给Kubernetes用于替换当前的Release;

二、部署Helm

1)安装Helm客] o 9 C户端

[root@master ~]# wget https://get.helm.sh! h * t $ g s ! N/helm-v2.14.3-linux-amd64.tar.gz
//从Github上下载Helm软件包
[= $ 8root@master ~]# tar zxf helm-v2.14.3-linux-aC d kmd64.tar.gz
[root@master ~]# mv linux-amd64/helm /usr/local/bin/1 G b
[root@master ~]# chmod +x /usr/lo: | 0 . Q 7 J j .cal/bin/helm
//获取这个软件包只是为了获取这个helm文件
[root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile
[root@master ~]# sol q ) M b R ^urce /etc/profile
//U ; e p a H z设置helm命令可以自动补全并且写入环境变量文件中

2)安装Tiller server(需要创建授权用户)

[root@master ~]#  vim tiller-rbac.yaJ } S ] A )ml             //编写yaml文件并创建授权用户
apiVersion: v1
kind: ServiceAce / Z ) . A ! 0count
metadata:
name: tiller
namespace:d 8 z f $ kube-system
---
apiVersz } k fion:H A c rbac.authorization.k8s.io/v1betam + t = 2 E !  @1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rb- M lacc - j.authorization.k8s.io
kind| . ~ x A u: Clu_ q [sterRole
name: cluster-admin
subjects:
- kS  6ind: ServiceAccount
name: tiller
namespace: kube-system
[root@masq T R Mter ~]# kubectl apply -f tiller-rbac.yaml
[root@mastM  Y W 0er ~]# helm init --service-account=tF q a * i j NillF $ er
//Tiller server的环境# 7 a e * Q ?初始化
//helm的服务端就是Tiller
//指定刚才创建的授权用户初始化helm
[root@master{ } ( - M ^ e ~]# kubectl get pod -n kube^ x H B b F-system | grep t` ~ Ziller  /4 : ? 5 # I 0 a/查看tiller的pod名称
tN 5 i  @iller-deploy-8557598fbc-mlr6c   0/1     ContainerCrN | p Eeating   0          6s
//编辑pod的yaml文件,将其使用的镜像改为国内阿里云的,默认是Google的镜像,下载不下来
//修改spec字段的image指定的镜[ ; A V像,如下:
[root@master ~]# kubectl  edit  pod -n kube-system  tiller-deploy-8557598fbc= j V ( x-mlr6c
//修改spec字段的image指定f g c R的镜像,如下:
im% J 1age: gcr.io/kuberneteO s a ks-helm/tiller:v2.14.3
//修改后如下:
image: registry.cn-hangzhou.aliyuncs.com/google_containera g Z 4 P # ~ Js/tiller:v2.14.3
//修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,~ 7 # P比如说在tiller容器所在的节点手动下载下来镜% 4 G L B a A tM _ H r q 2 e ),然后重启该节点= C h *的kG j v + mubelet,或重启该容器)
[root@master ~]#  kubectl get pod -n kube-system  | grep tiller  //必须保证tiller的Pod正常运行
tiller-deploy-8557598fbc-mlr6c   1q d ! K D/1     Running   0          5m16s

注:避免出错附加一张图片如下:
K8s之Helm工具详解

3)配置Helm仓库

[root@master ~]# h8 t ? Q i Delmo S u ; [ = u C R repo list   //查看仓库的详细信息
NAME    URL
stable  https://kubernete& V S g C Ts-charts.storage.googleapis.com   //默认是Google,在国外,速度特别慢
local   http://127[ ( P O - s S o .0.0.1:8879/charts
[root@master ~]#  helm repo add stable htk D _ - 2 l /  4tps://kubernetes.osN Z x } { N @s-cn-hax n c !ngzhou.aliyuncs.com/charts
//更改为国内阿里云M W * g $ G l的地址
[root@masK ] 9 v Dter ~]# hew { N w klm repo list
//再次查看仓库的详细信息,可以发现地址已经换成了阿里? L m云的仓库地址
NAME    URL
stable  https://kubernetes.L # 6 L f , Zoss-cn-hangzhou.aliyuncs.com/charts
local   http://127.0.0.1:8879/charts
[root@master ~]# helm_ b } a S { _ N repo update  //更新一下helm仓库
[root@master ~]# helm version        //查看helm版本信息
C_ s Q m o = a tlient: &version.Version{SemVer:"v2.14.3g B m ~ 7 N X", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7co J w ; C p 4bebb0085", GiN 5 3 YtTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7ai Y z $ Q [f8fcfddb3d29411 0 { q 8 : qfcc7cbebb0085L ^  ^ U 6 G", GitTreeState:"clean"}
//必须保证可以查看出来client和server,才可正常使用helm

注:就R 2 4 z 2 7 W ?此Helm就已经表* i g . ` Y示部署成功,可以正常使用!

三、使用helm安装mZ C E . g F x Q ^ysql+Storage Class

创建Storage Class
1)部署nfs

[root@master ~]# yum -y install nfs-utils rpcbind
[root@master ~]# mkdir /nfsdad v V L / &ta
[root@master ~]V m V :# echo "/nfsdata *(rwd . : `,no_root_squash,sync)" > /etc/exports
[root@master ~]# systemctl start nfs-server && syste2 M z  4 x 8mctl start rpcbind
[root@master ~]# showmount -e
Export list for masteB T W _ ~ 2 X @ wr:
/nfsdata *

2)创建rbac授权

[root@master ~]# vim rbac-rolebind.yaml   //编辑yaml文件
ap3 G w H | / @iVersion: v1                            //创建一个用于认证的服务账号
kind: ServiceAccount
metadata:
name: nfs-provish W , g kioner
---
apiVersion: rbac.authorization.k8s.io/v1        //创p | _ 7 { R G )建群集规则
kind: ClusterRole
metaO t B =data:
name: nfs-provisioner-runner
rules:
-  apiGroups: [""6 ! 1]
resources: ["persist= * n q x V Oentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
-  apiGroups: [""]
resources: ["pe& a hrsistentvolumecla& s k wims"]
verbs: ["get", "list", "watch", "update"]
-  apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
-  apiGg 0  Zroups: [""]
resources: ["events"]
verbs: ["watch", "create", "update", "patch"]
-$ 6 M  apiGroups: [""]
resoT 6 B S ~urces: ["se 1 ervices", "endpoints"]
verbs: ["gi F D + 0 | L det","create","list", "watch","update"]
-  apiGroups: ["exten+ e ! Wsions"]
resources: ["podsecuritypoliciesE 9 H D i z O u"]
resourceNames: ["nfs-provisioner"]
verbs: ["use"]
---
kind: ClusterRoleBinding                //将服务认证用户与群集规则进行绑定
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-provisioner
subjects:
- kind: ServiceAccount
name: nfs-t o B j 1 1 9 n Tprovisioner
namespace: default
roleRef:
kind: ClusterRoB O L ^ e %le
name: nfs-provisioner-runner
ak R epiGroup: rbac.authorization.k8s7 i _ + X 6 8 v.io
[root@master ~]# kubectl apply -f rbac-rolebind.yaml  //执行yaml文件

3)创建n? [ 8 H = : Gfs-deployment.资源

[root@master ~]# vim nfs-depl^ m C $ * % w ) -oyment.yaml
aZ P t M d S ; J mpiV* X U 6 z L 6 6ersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1_ 0 @ m p B 7 H @                              //指定副本数量为1
strat / v Utegy:
tf  2 oype: Recreate                      //指定策略类型为重置
template:
metadata:
labels:
app: nfs-! U C 1 ] ^ O t #clienL t y d 7 5 c t ot-provisioner
spec:
serviceAccount: nfsG O W X ; Z @ R v-provisionerK t R 8 e u A            //指定rbac ya: 9 % # 7 m ] n Yml文件中创建的认证用户账号
contf 8 K  Bainers:
- name: nfs-cli- v 9 z , 0 o 7 Vent-provisioner
image: registry.cnB U } q I m m R-ha o p vngzhou.aliyuncsj | 5 x l.com. x q c B u 2 , L/open-ali/nfs-client-provisioner  //使用的镜像
volumeMounts:
- name: nb g w 8  - B % !fs-client-root
mountPathr 8 8 p D h 0 U h:  /persistentvolumes             //指定容器内挂7 W @ ? d V :载的目录
env:
- name: PROVISIONER_NAME           //容器内的变量用于指定提供存储的名称
value: bjq-test
- name: NFS_SERVER                      //容器内的变量用于指定nfs服务的IP地址
value: 192.168.45.129
- name: NFS_PATH                       //容6 S Z器内的变量指定nfs服务器对应的目录
value: /nfsdata
volumes:                                                //A h / ; 5指定挂载到容器内的nfs的路径及IP
- name: nfs-client-root
nfs:
server: 192.168.45.129
path: /nfsdad 1 r & 8 jta
//编辑完成保存退出即可
[root@master ~]#] = G g 9 J kubectl  apply  -f nfs-deployment.yaml   //执行yaml文件
[root@master ~]# kubectl  get  pod | grep nfs  //确认pod是否正常运p S Q Z [ Z行
n3 ] o % ifs-client-provisioner-8844fb875-prjhq   1/1     Running   0          14s

4)创建Storage Class

[root@master ~]# vim storage-class.yaml   //编辑yaml文件
apiVers J ?sion:y J 5 _ ? K 5 ^ q storage.k8s.io/v1
kind: StorageClass
metadata:
name: stateful-nfs
provisioner: bjq-B P ^test    //这个要和nfs-client-provisioner的env环境变量中的PROVISIONER_NAME的value值对应。
reclaimPolicy: Retain  //指定回收策略为Retain(手动释放)
[root@master ~]# kubectl apply -f storage-class.yaml   //执行yaml文件
[root@master ~]# kubectl get sc            //确认Storage Class创建成功
NAME           PROVISION= ! n RER   AGE
stateful-nfsi & c } %   bj* J =q-tesr J I yt      8s

5)helm部, ] Y E e署mysql

[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"                  //去除注释,并指定刚才创建的Storage Class名称
[Z S froot@master ~]# vim mysql/valu3 ( ! h [ f -es.yaml +79
type: Nj Z r 5 ^ o EodePort                                     //默认是ClusterIP,可更改为NodePort
[root@master ~]# helm in9 ? T %  /stall stablq $ E z _ l 8 V oe/mysql -f mys9  :ql/values.yaml --set mysqlRootPassword=123.coq a  w 0 | 5m -n test-mysql
//如果修改了values.yaml文件s Q h 7T ` u数据,创建时应该指定values.yaml文件
//安装my H V Vsql,并设置mysql的root密码为123.com,j R X 5 C j b P-n表示指定名称
root@master ~]# helm list               /` f r D y Q ?/查看已安装的软件包
NAME        REVISION    U# D f n ` x IPDATED                     STAx C hTUS      CHART       APP VERSION NF # S `  0 @AMf c - V J 4ESPACE
test-mysql  1           Tue Sep  1 13:26:01 2020    DEPLOYED    mysql-0.3.5             default

避免出错附加一张图片:
K8s之Helm工具详解

[roo1 1 !  R v 0 et@Q S 6 Ymaster ~]# kubectl get svc | g2 B | I 9  j &rep test-mysZ [ k f t jql //确认service类型
test-mysql-mysql   NodePR r U E z | (  6ortN K a .    10.98.129.4   <none>        3306:30083/TCP   4m56s
[root@master ~]# kubectl get pv,pvc  //查看PV、PVC是否绑定成功
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLAn $ X u WSS   REASON   AGE
persistentvolume/pvc-4ebb; O h V B3a43-b192-4e2d-884a-C [ 2= f 2 y & Q ` :b75308f63dd   8Gi        RV p 6 b _ d cWO            Delete           Bound    default/test-m. d e (ysql-mysql   stateful-nfs            5m5s
NAME                                     STATUS   VOLUME                                     CAPACITY   ACj F } Z p k WCESS MODES   STORAGECLASS   AGE
pe7 a $ B o / O ersistentvolumeclaim/test-mysql-mysql   Bound    pvc-4ebb3a/ ; & y *43-b192-4e2d-884a-2b75308f63dd   8Gi        RWO            statefu1 1 x P z w ) k ul-nfs   5m^ * t h5s
[root@master ~]# kubectl  exec  -it test-mysql-mysql-dfb9b6944-q7tcd  -- mysql -u root -; x P 1 d sp123.com
//登录到刚才创建的mysql数据库中
mysql> 

6)使用hel2 : d qm对mysql进行升级操作

[root@master ~]# kubectl  describe  pod test-mysql-mysql-dfb9b6944-q7tcd
//查看pod的详细信息以下可以看出,该po6 b 1  Z ` Q ( .d所用镜像为mysql:5.7.14
Events:
Type     Reason            Age                    Fr6 W n O @om               Message
-o H v }---     ------            ----                   ----               -------
Warning  FailedScheduling  8m57s (x2 over 8m57s)  default-scheduler  pod has unbound immq ` (ediate Persit V 3 - # 5 ) ZstentVolumeClaims (repea~ [ m , rted 2 times)
Normal   Scheduled         8m56s                  default-s9 i ( | + , k w _cheduler  Successfully assigned default/test-mys= b 6 h g [ qql-mysql-dfb9b6944-q7tcd to noy 9 Q 6 E *  w Sde02
Normal   Pulling           8m55s                  kubelet, node02    Pulling image "x x n ` [ obusybox:1.25.0"
Normal   Pulled            8m46s                  kubelet, no_ h +de02    Successfully pulZ , ) j k B s v 1led image "busybox:1.25.0"
Normal   Created           8m46s                  kubelet/ 0 Y b, node02    Created container remove-lost-found
Normal   S0 | V . + + % ,tartI ) Sed           8m46s                  kubelet, node02    Started container remove-lost-found
Normal   Pulling           8m46s                  kubelet, node02    Pulling image "my/ 0 O u O W @ ! 5sql:5.7.) i * r z !14"
Normal   Pulled            8m24s                  kubelet, node02    Successfully puH z g i c Wlled image "mysql:5.7.14"
Normal   Created           8m24s                  kubelet, node02    Created container test-mys2 v j O D f ^ ) lql-mysql
Normal   Started           8m24s                  kubelet,0 ^ o y node02    Start4 - A 3 Eed container test-mysql-mysql
[roD # | ) a {ot@mT S Haster ~]# kubectl get pod | grep test-m( T W o Z U 1 R ysql  //注意升级之后,pod名称会发生变化
test-mysql-mysql-54c7bfdd77-8jlpj        1/1     Running   0          2m54s
[root@master ~]# kubectl  describe  pod test: J $ P 2 # a-mysql-mysql-54c7bfdd77-8jlpj
/Y % f [ g s/再次查看pod详细信息,可以看出,镜像升级为mysql:5.7.15
Events:
Type    Reason     Age    From               Message
----    ------     ----   ----               -------
Normal  Schedul, M : e y r ) # *ed  4m1g 9 % W { s s ; ks   default-schedulerc q @  S N r  Successfully assigned default/test-mysql-mysq% i !l-54c7bfdd77-8jlpj to node01
Normal  Pulling    4m1s   kubelet, noA Z k d # @ .de01    Pulling image "busybox:1.25.0"
Normal  P= W 0 r + 4 w Iulled     3m50s  kubelet, node01    Successfully% u i e ? | Z ~ B pulled image "busyj C y * 0 - V 0box:1.25.0"
Normal  Creati J u ; B t 2ed    3m50s  kubelet, node01    CreatV G p c + y q r Ped container remove-lost-found
Normal  Started    3m50s  kubelet, nod( P m 6 l ^ d |e01    Sn Y 9tarted container remove-lost-found
Normal  Pulli` + , = ` = - DngF 0 )    3m50s  kube& J | 3 ~let, node01    Pulling image "mysql:5.7.15"
Normal  Pulled     3m# n ) ) 1 y25s  kubelet, node01    Successfully pulled imag~ z n #e "mysql:5.7.15"
Normaa r w Z ] / q }l  Created    3m25s  kubelet, nody y V m y , I `e01    Createdw e f K / r container test-mysql-mysql
Normal  Started    3m25s  kubelet, node01    Started container test-mysql-mysql

7)使用helm对mysql进行回滚操作

[root@masterH 6 % ) C k A ~]# helm list
//再次查看K , H : X =实例,可以发现“REVISION”字段为2,而初次创建实例时,该列为1,只要对该实例进行升级回滚一次,数值便会加1
NAME        REVISION    UPDATED                     STATUS      CHART       APP VERSION NAMESPACE
test-mysql  2           Tue Sep  1 13:37:45 2020    DEPLOYED    mysql-0.3.5             default
[root@m| b D ] 4 ~aster ~]# h2 k Lelm history  test-mysql  //查看该@ * Y O实例的历史版本
REVISION    UPE { ^ 9 Y Q j A !DATED                     STATUS      CHART       DESCRI5 ; 7  c 2PTION
1           Tue Sep  1 13:26:01 2020    SUPERSEDED  mysql-0.3.5 Install complete
2           Tue Sep  1 13:37:45 2y Q t 9 ,020    DEPLOYED    mysql-0.3.5 Upgrade complete
[root@master ~]# helm rollbh , o 1  ~ Back test-mysql 1  //将该实例回滚到版本1
[root@mastem m v 5 5 ! v r ~]# helm list   //再次查看,可以u b  u 6 ] ;看到“REVISION”的值G 3 Y q z l #变成% . p | M了3
NAME        REVISION    UPDATED                     STATUS      CHART       APP VERL 3 A R FSION NAMESPACE
test-mysql  3           Tue Sep  1 13:55:57 2020    DEPLOYED    mysql-0.3.5             default
[root@master ~]# kub ) Q iectl get pod | grep test-mysql  //确认pod是正常状态
test-mysql-mysql-dfb9b6944-fd6l9         1/1     R2 a Sunning   0          67s
[root( , V r ^ @ y R &@master ~]# kubectl  describe  pod test-mysql-mysql-dfb9b6944-fd6l9
//查看pod的详细信息,可以看出,该pod使用的镜像已经回滚到mysql:5.7.14版本
Events:
Type    Reason     Age   From               Message
----    ------     ----  ----               -------
Normal  Scheduled  2m4s  default-scheduler  Successfully assigneC C - Bd default/test-mysql-mysql-dfb9b6944-fd6l9 to node02
Normal  Pulledx n ; N R ? ?     2m3s  kubelet, node02    Container image "busybox:1.25.0" already present on machine
Normal  Created    2m3s  kubelet, node02    Created container rC R x o % Z ; H [emove-lost-found
N^ 7 v Z | / Z dormal  Started    2m3s  kubelet, nod% / B F c * j L We02    Started container remove-lost-found
N? P I Y tormal  Pulled     2m1s  kubelet, noT _ (de02    Container image "mysql:5.7) Z }.14" already present on machine
Normal  Created    2m1s  kubelet, node02    Created contaX D !iner test-mysql-mysql
Normal  Started    2m1s  kubelp C } _ H , & @et, node022 H ` F 1 :    Started container test-mysql-mysql

四、部署helm私有仓库

1)node01节点运行web容器作为私有仓库

[root@node01 ~]# mkdir -p /var/www/charts //创建目录,用m . 3 @ 8 4于存放charts包
[root@node01 ~]# docker run -d -p 8080:80 -v /var/www:/usr/local/apache2/htdocs@  Q httpd

2)master节点上,创建chart包并打包0 B ` p L

[r Q $ } t n ; aoot@master ~]# helm create testchart  //创建chart包(生成的是目录),名称为testchart
[root@master ~]# helm package testchart
//将刚才生成的目录进行打包,会在当前目录下生成名为testchart-0.1.0.tgz的包

3)master节点生3 2 I成仓库的index文件

[roo ^ Qt@master ~]# mkdir myrepo
[root@master ~]# mv testchart-0.1.0.t 7 _tgz myrepo/
//创建用于存放chart包的目录,并将chart包移动到该目录
[root@master ~]# he2  ~ Elm re? 8 ~ g - Gpo index myrepo/ --url http://192.168.45.141:8080/charts
//url路径表示运行web容器的节点IP+G n X端口,也就是指定的是q  = ~node01节点
[root@master ~]# ls m) u U =yrepo/
index.yaml  testchart-0.1.0.tgz
//确认已经生成index.7 c 8 r eyaml文件
[root@master ~]# scp myrepo/* node01E # [ @ i !:/var/www/charts
//将生成的index.yaml文件及charts包复制到web容器所在节点映射的本地目录

4)将新repo仓库添加到helml , b

[roQ - w f u i C Tot@master ~]V X b N U n ; G#  helm repo add newrepo http://192.7 % ] I n L168.45.141:8y l C @ u V I Y080/charts
//url是web容器所在的节点的IP+端口+存放chart包的目录,并指定仓库的名称为newrepo
[root@master ~]# helm repo list
NAME    URL
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local   htA / i { B I =tp://127.0.0.1:8879/charts
newrepo http://192.168.47 # 9 l J { : 6 Q5.141:8080/charts
//stable是刚创建helm添加的阿里云的仓V u ! b 6 m j B库
//local是本地的缓存
//newrepo是刚刚添加的仓库名称(确认该仓库已经存在)

注:配置至此,已经可以正常供内网环境使用这个charts包的私有仓库了,下面是一些验证。
5)搜索可用的c6 @ 7 ` q I X hart包并部署

[roo5 b s  r T :t@master ~]# helm search testchart
NAME                CHART VERSION   APP VERSION DE5 Y [ p [ * k j ?SCRIPTION
loch 6 m M 6 Zal/testchart     0.1.0           1.0         A Helm char{ * o # k 4 U 6 ;t for Kubernetes
newrepo/testchart   0.1.0           1.0         A Helm chart for Kubernetes
//local是本地的缓存,不用理会,可以查看; U c 7 0 P = ~ 到newrepo提供的testchart包
[root@master ~]# helm install newrepo/testchart -n test-nginx
//既然可以搜索到就表示可以使用chart包创建实例
[root@master ~]# kubb B r ) 1 s hecf C I m I + Y W :tl  gu a ] p ^ c * x Wet  pod | grep test-nginx  //确认pod运行成功
test-nginx-testchar. x 2 g 4 o C 8t-64d8585997-jxtv7    1/1     Running   0          33s
[root@master ~]# kubectl describe  pod test-nginx-tes+ J I A -tchai I ; % k c W b Ort-64d8585997-jxtv7
//查看这个pod的详细信息,并确认pod所使用的镜像
Events:
Type    Ren u x ! ^ason     Age    From               Message
----    ------     ----   ----               -------
Normal  Scheduled  2m28s  default+ y 2 u-scheduler  Successfully as- 9 B 6 C H Csigned default/test-nginx-testchart-64d8585997-jF D $xtv7 to node01
Normal  Pulli+ b N / k % Tng    2m28s  kubelet, node01    Pulling image "nginx:stable"
Normal  Pulled     2m10s  kubelet, node01    Successfully pe y s Y i M @ w 8ulled image "nginx:stable. K q J $"
Normal  Cre E @ weated    2m10s  kubelet, noJ j $de01    Created container testchart
Normal  St 7 4 / [ r 9 K Vartk  Ted    2m9s   kubelet, node01    Started container testchart

6)更新chart包中所运行服务的镜像
其实就是一个服务版本升级的操作,大概思路如下:修改解压后的charts包目录下的values.yaml文件为所需的值(values.yaml文件包含的是这个服务的值,可以在里面指定镜像及标签、数据持久化的类型等等),x X , K ( } l f修改完成后,再使用下面的命令进行升级操作。

[root@master ~]s ` ^ e 7 z @ T S# helm upgrade -f testchart/values.yaml test-nginx newrepo/testchart
//my-nginx是之前实例的名称,可以通过“T _ ~helm list”查看实例名称
//4 W ?newrepo/testchart :为自定义仓库中的chart` V 2包
[root@master ~]# kubectl describe pod test-nginx-testchart-6d6X o ;984ddd9-gn9sw
//确认pod所使用的镜像已经更新

注:如果使用命令的方式直接进行升级,命令执行完成不会报错,但是镜像并不会更新,推n ~ D / | r @ , w荐使用更改values.yaml的方? U : d式进行升级!

7)再次向newrepo仓库上传chart包

[root@master ~]# helm create mychart
[root@master ~]# helm pG 1 QackP e T p s k E 8age mychart/
[root@master ~]# mv mychart-0.1.0.tgz myrepo/
[root@master ~]# helm repo index myrepo/ --url http://192.168.45.141:8080/charts
//当有新的charY 2 ! 4 & ( : j }t包时,需更新index.yaml文件
[root@master ~]# sc& 4 m V h p myrepo/* nB g W ^ [ 0 N 1ode01:/var/www/charts; . p # m
[root@master ~]# helm repo update
//如果需要使用( / P q L ^ f i则需更新一下本地的仓库
[root@masterJ b n U ] - l h ~]# hele f W 5 x _ 1 + fm search mychart
NAME            CHART VERSION   APP VERSION DESCRIPTION
local/mychart   0.1.0           1.0         A Helm charh S ; P R w !tK 7 o [ s + for Kubernetes
newrepo/mychart 0.1.0           1.0         A Helm chart for Kubernetes
//确保新添加的chart包可以被~ N K 1 F ,搜索到

五、Helm常用命令

[root@master ~]# helm version        //查看helm版本信息
[root@master ~]# helm list               /查看当前安装的Cha7 K S s mrt包
[root@master ~]# helm search mysql         /( f b 9 j/查看与mysql相关的chart包
[root@master ~]# helm fetch stable/mysql            //将mysql软件包下载到本地
[root@master ~]# helm inspect stable/mysql       //查看该软件包的详细信息
[root@master ~]# helm install stable/mysql -n mysql        //[ [ Y O & , * 0 t安装指定的mysql软件包,并命名为mysql
[root@mat X I 3 # 7ster ~]# heE . p [lm status mysql[ E t i K a                 //查看mysql的状态信息
[root@master ~]# helm delete --purge mysql       //删除mysql,并将本地的缓存也进行删除
[root@master ~]# hh | + o H f 0 VelS v i f xm rep3 F ( 1 ` |o add stable https://kubernetes.ou R Pss-cn-hangzhou.aliyuncs.com/charts
//添加阿里云的repo源
[root@master ~]# helm repo update              //更新repo仓库资源
[root@master ~, V X |]# helm create helm_charts       //创建一个chart,名称为helm_charts
[root@master ~]# cd helm_charts/ && helm lint       //测试charts语法
[root@ma. z ( $ ~ ^ste c ( H l _ k U jr ~]# helm package helm_charts           //打包charts
[root@master helm_charts]# helm template helm_charts-0.1.0.J 9 ` z N 3 ntgz       //查看该软件包生成的yaml文件