Helm 介绍

helmkubernetes 的包管理器。它相当于 CentOSyumUbuntuapt

helm 中有三大概念:

  • Chart:Helm使用的包格式称为 chart。 chart 就是一个描述 Kubernetes 相关资源的文件集合。单个 chart 可以用来部署一些简单的, 类似于 memcache pod,或者某些复杂的 HTTP 服务器以及 web 全栈应用、数据库、缓存等
  • Repo:chart 的存放仓库,社区的 Helm chart 仓库位于 Artifact Hub,也可以创建运行自己的私有 chart 仓库
  • Release:运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次,而每一次安装都会创建一个新的 release

总结:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release 。你可以在 Helm 的 chart repositories 中寻找新的 chart 。

准备阶段

拥有一个 Kubernetes 集群,如下:

具体配置:

类型 IP地址 系统版本 配置
Master主节点 192.168.19.136 CentOS Linux release 7.9.2009 (Core) 4核4G
Work工作节点1 192.168.19.137 CentOS Linux release 7.9.2009 (Core) 4核4G
Work工作节点2 192.168.19.138 CentOS Linux release 7.9.2009 (Core) 4核4G

选择 Helm 版本

Helm 版本 支持的 Kubernetes 版本
3.5.x 1.20.x - 1.17.x
3.4.x 1.19.x - 1.16.x
3.3.x 1.18.x - 1.15.x
3.2.x 1.18.x - 1.15.x
3.1.x 1.17.x - 1.14.x
3.0.x 1.16.x - 1.13.x
2.16.x 1.16.x - 1.15.x
2.15.x 1.15.x - 1.14.x
2.14.x 1.14.x - 1.13.x
2.13.x 1.13.x - 1.12.x
2.12.x 1.12.x - 1.11.x
2.11.x 1.11.x - 1.10.x
2.10.x 1.10.x - 1.9.x
2.9.x 1.10.x - 1.9.x
2.8.x 1.9.x - 1.8.x
2.7.x 1.8.x - 1.7.x
2.6.x 1.7.x - 1.6.x
2.5.x 1.6.x - 1.5.x
2.4.x 1.6.x - 1.5.x
2.3.x 1.5.x - 1.4.x
2.2.x 1.5.x - 1.4.x
2.1.x 1.5.x - 1.4.x
2.0.x 1.4.x - 1.3.x

注: Helm 2 采用 client/server 架构,分为 Helm 客户端和 Tiller 服务端,而 Helm3 移除了 Tiller。 也就是说 Helm3 只要安装 Helm 就可以了。 关于 Helm 2Helm 3 的区别可以阅读:Helm文档

本文会选择 Helm 3.4.2 进行安装。

下载安装 Helm 3.4.2

访问 github.com/helm/helm/r… 选择对应的版本,下载

拷贝到集群中的 Master 节点

解压

tar -zxvf helm-v3.4.2-linux-amd64.tar.gz

移动到 /usr/local/bin

mv linux-amd64/helm /usr/local/bin/helm

查看是否安装成功

helm version

使用 Helm 部署 Consul 集群

Helm 基本用法

在部署consul之前,先来看看 helm 的基本用法。

查找 Charts

helm search hub # 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。
helm search repo # 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。

添加 HashiCorp Helm 仓库:

helm repo add hashicorp https://helm.releases.hashicorp.com
# 查看已添加的仓库列表
helm repo list

搜索 consul

helm search repo consul

Consul 所需环境准备

命名空间

创建一个命名空间,后续都会在此命名空间上进行操作:

kubectl create namespace consul

存储

由于 consul 部署的时候会创建使用 PVC:PersistentVolumeClaimPodPod 中的应用通过 PVC 进行数据的持久化,而 PVC 使用 PV: PersistentVolume 进行数据的最终持久化处理。所以我们要准备好存储资源供应,否则 consul-server 会因为获取不到存储资源而一直处于 pending 状态,有以下两种方案:

方案1,手动创建静态 PV 进行存储供应
cat <<EOF | kubectl apply -f -
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-volume-consul-0
  namespace: consul
  labels:
    type: local
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/consul/data"
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-volume-consul-1
  namespace: consul
  labels:
    type: local
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/consul/data"
EOF

查看:

kubectl get pv -n consul -o wide

方案2,通过 StorageClass 实现动态卷供应

在所有节点上安装 nfs-utils:

yum install -y nfs-utils

选择一台节点,这里选择 work2(192.168.19.138) 节点作为 nfs server:

# 创建nfs目录
mkdir -p /mnt/nfs
# 配置nfs权限
cat>/etc/exports<<EOF
/mnt/nfs/ 192.168.19.0/24(insecure,rw,anonuid=0,anongid=0,all_squash,sync)
EOF
# 启动nfs服务
systemctl start rpcbind.service
systemctl start nfs-server.service
# 设置开机自启
systemctl enable rpcbind.service
systemctl enable nfs-server.service
# 配置生效
exportfs -r

在 master 节点使用 helm 安装 nfs-provisioner:

# 添加仓库源
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
# 搜索nfs-client-provisioner
helm search repo nfs-client-provisioner
# 安装nfs-client-provisioner
helm install nfs-storage azure/nfs-client-provisioner -n consul \
--set nfs.server=192.168.19.138 \
--set nfs.path=/mnt/nfs \
--set storageClass.name=nfs-storage \
--set storageClass.defaultClass=true
# 查看StorageClass
kubectl get sc -n consul

至此,当有 PVC 需要申请 PV 时,StorageClass 就会自动为我们创建 PV 了。

配置文件

创建 config.yaml

global:
  name: consul # 设置用于 Helm chart 中所有资源的前缀
ui:
  service: # 为 Consul UI 配置服务
    type: 'NodePort' # 服务类型为 NodePort
server:
  replicas: 2 # 要运行的服务器的数量,即集群数
  affinity: "" # 允许每个节点上运行更多的Pod
  storage: '10Gi' # 定义用于配置服务器的 StatefulSet 存储的磁盘大小
  storageClass: "" # 使用Kubernetes集群的默认 StorageClass
  securityContext: # 服务器 Pod 的安全上下文,以 root 用户运行
    fsGroup: 2000
    runAsGroup: 2000
    runAsNonRoot: false
    runAsUser: 0

更多配置可以参考:www.consul.io/docs/k8s/he…

开始安装

helm install hi-consul hashicorp/consul -n consul -f config.yaml

hi-consul:你命名的 release 名字

hashicorp/consul:你想安装的 chart 的名称

-n :指定命名空间

-f :传递配置文件

执行安装命令后我们可以监控 pod 的状态:

kubectl get pods -n consul -o wide -w

等待所有 Pod READY 完毕后,查看 svc 状态:

kubectl get svc -n consul -o wide

浏览器访问 http://master:30497/ui/ (已设置hosts)或 http://192.168.19.136:30497/ui/

题外话

# 查看helm已安装列表
helm list -n consul
# 卸载
helm uninstall hi-consul -n consul
# 更多
helm help