k8s部署无状态应用非常方便,写好deployment、replicaset配置清单即可部署,而有状态应用集群则很困难,因为k8s会探测、重启、调度,Pod会销毁重建,像 redis、mysql这些有主从关系的,主节点pod重启后,还是得成为主节点,写这类应用的配置清单很麻烦,而 helm 为简化有状态应用的创建应运而生

1.Helm简介

大家都用过centos的yum,它是Linux系统下的包管理工具,通过yum 可以很方便的安装各种工具,而 Helm 是 Kubernetes中方便有状态应用部署的工具,通过 helm 可以很方便部署一个 redis 集群、rabbitmq集群等等,这些集群的镜像已经被 helm 官方做好了,用户只需通过 helm install 安装部署即可

2.Helm 组件
  • 1.Helm 是一个命令行客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库
  • 2.Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能
3.Helm核心术语
  • Chart:Helm的软件包,采用 tar 格式。
  • Repository:Helm 的软件仓库,Charts仓库
  • Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release
4.官网地址

Helm官方地址:https://helm.sh/
Helm Github:http://github.com/helm/helm
Chart中央仓库地址:https://hub.kubeapps.com/ (国内被墙,一般用下面微软仓库地址)
微软Chart仓库地址:http://mirror.azure.cn/kubernetes/charts/

5.Helm安装
  • 1.在github上,下载helm客户端,https://github.com/helm/helm/releases
  • 2.解压,tar -xvzf helm-v2.14.3-linux-amd64.tar.gz
  • 3.进入解压目录,找到 helm binary文件,复制到 /usr/bin/ 或 /usr/local/bin/目录下
  • 4.测试,helm help
  • 5.sudo snap install helm --classic ,(先安装snap: https://snapcraft.io/docs/installing-snap-on-centos)
  • 6.下载 rbac-config.yaml,并部署,kubectl apply -f rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
  name: tiller
  namespace: kube-system
  • 7.下载 tiller 镜像,tiller官方镜像因国内网络被限,需要在docker hub下载网友的 tiller 镜像,docker pull jessestuart/tiller:latest
  • 8.初始化,helm init --service-account tiller --history-max 200
  • 9.查看 tiller 的 pod 状态,kubectl get pods -n kube-system,如果状态不为 running,则需要修改 tiller 的 deployment配置文件,修改里面的镜像为本地下载的镜像,kubectl edit deployment tiller-deploy -n kube-system,修改为:jessestuart/tiller:latest,不修改则tiller容器无法启动,状态为ImagePullBackoff
  • k8s部署Springboot k8s部署有状态应用_github

  • 10.查看版本,helm version
  • 11.修改仓库地址为微软Chart仓库地址:helm repo add stable http://mirror.azure.cn/kubernetes/charts/
  • 12.更新仓库,helm repo update
  • 13.查询仓库,helm search redis,也可以在helm的chart官网通过网页查询仓库,https://hub.helm.sh/
  • 14.查看已安装的charts,helm list
  • 15.安装redis,helm install --name redis1 stable/redis,helm会把charts下载到本地的 ${HOME}/.helm/cache/archive/redis.tar.gz,执行安装命令时会解压该文件,根据里面定义的配置内容,把文件一个个拷贝出来,最后提交给 k8s 的master记录到etcd中,用户可以修改配置文件中的内容,来配置自己需要的应用,可以参考helm–charts—redis的安装配置页:https://hub.helm.sh/charts/bitnami/redis
  • k8s部署Springboot k8s部署有状态应用_github_02

  • 16.删除安装的charts,helm delete redis1 --purge

安装redis可能无法安装成功,因为redis的配置文件中,还定义了需要 pv 存储资源,因此你还需要创建 k8s 的 pv 资源,pv可以挂载分布式文件存储系统,如:nfs、glusterfs等
以nfs为例:
在服务器上装nfs,yum -y install nfs-utils
创建2个目录:mkdir -p /data/volumes/v1,mkdir -p /data/volumes/v2
创建配置,vi /etc/exports,内容如下:

/data/volumes/v1 192.168.0.0/16(rw,no_root_squash)
/data/volumes/v2 192.168.0.0/16(rw,no_root_squash)

重载,exportfs -arv
挂载,k8s所有worker节点挂在该目录, mount -t nfs node1:/data/volumes /mnt
卸载, umount /mnt
挂载后就可以在 k8s 中创建 pv 资源了,pv-demo.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
  labels:
    name: pv1
spec:
  nfs:
    path: /data/volumes/v1
    server: store1.magedu.com
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
  labels:
    name: pv2
spec:
  nfs:
    path: /data/volumes/v2
    server: store1.magedu.com
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 10Gi

创建pv,kubectl apply -f pv-demo.yaml
查看pv,kubectl get pv
查看pvc,kubectl get pvc

有 pv 资源后,上面的 redis 就会通过 pvc 申请 pv,如果有符合未绑定且符合空间大小的 pv,就会绑定起来给redis存储数据