1、Helm 是一个用于 Kubernetes 应用程序部署和管理的包管理工具。它允许用户将Kubernetes应用程序打包成 chart,以方便在 Kubernetes 集群中部署和管理。
2、Helm 由两个核心组件组成:Helm Client 和 Tiller Server。Helm Client 是一个命令行工具,用于创建、打包、安装、更新和删除 Helm Charts。Tiller Server 是一个Kubernetes部署,它与Helm Client交互,并将 Charts 安装到 Kubernetes 集群中。
3、对于Helm,有三个重要的概念:
①、chart 创建Kubernetes应用程序所必需的一组信息。
②、config 包含了可以合并到打包的chart中的配置信息,用于创建一个可发布的对象。
③、release 是一个与特定配置相结合的chart的运行实例。
4、以下是 Helm 架构的基本组成部分:
①、Helm Client:Helm 的命令行工具,用于打包、安装、升级和删除 Helm Charts。
②、Chart:用于描述 Kubernetes 应用程序的打包格式。Chart 包含了应用程序的 Kubernetes 部署文件、服务文件、配置文件和依赖关系等。
③、Repository:Helm Chart 存储库,用于存储和分发 Chart。存储库可以是本地目录、HTTP/HTTPS URL 或者 Git 仓库等。
④、Tiller Server:Helm 的服务端组件,负责将 Charts 安装到 Kubernetes 集群中。Tiller Server 需要有足够的权限才能在集群中执行安装操作。
⑤、Release:Helm 在 Kubernetes 集群中安装的应用程序实例。Release 是 Chart 的一个实例化对象,它包含了部署的应用程序的所有相关信息和配置。
下载二进制文件:
①、解压至
/root/helm
目录下,然后将解压得到的文件里的一个可执行文件helm
移动到usr/local/bin/helm
②、命令自动补全:
helm completion bash > /etc/bash_completion.d/helm
,终端重新连接就自动生效了③、helm常用命令:
helm repo 列出、增加、更新、删除 chart 仓库
helm search 使用关键词搜索 chart
helm pull 拉取远程仓库中的 chart 到本地
helm create 在本地创建新的 chart
helm dependency 管理 chart 依赖
helm install 安装 chart
helm list 列出所有 release
helm lint 检查 chart 配置是否有误
helm package 打包本地 chart
helm rollback 回滚 release 到历史版本
helm uninstall 卸载 release
helm upgrade 升级 release
wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
1、k8s 中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV。
2、每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。
# 在master节点上安装nfs服务,(每个node节点上都安装下nfs,这样的目的是为了node节点可以驱动nfs设备)
[root@k8s-master01 ~]# yum install nfs-utils -y
# 准备共享目录
[root@k8s-master01 ~]# mkdir /nfs_data/rw/
[root@k8s-master01 ~]# mkdir /nfs_data/ro/
# 暴露服务
[root@k8s-master01 ~]# vim /etc/exports
/nfs_data/rw 192.168.18.0/24(rw,sync,no_subtree_check,no_root_squash)
/nfs_data/ro 192.168.18.0/24(ro,sync,no_subtree_check,no_root_squash)
# 启动nfs服务
[root@k8s-master01 ~]# systemctl restart nfs
①、RABC是 k8s 中的一种访问控制机制,可以帮助管理员在 Kubernetes 集群中控制用户或者服务的访问权限;需要使用 RABC 角色和绑定,以授予该 Provisioner 执行所需操作的权限
②、创建命名空间[root@k8s-master01 redis]# kubectl create namespace redis
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: redis
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: redis
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
nfs-provisioner容器将在k8s集群中运行,并使用RABC角色和绑定来执行创建、删除和管理NFS PV的操作
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: redis
---
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: redis
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccount: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0 #在 k8s 1.20 之后,出于对性能和统一 apiserver 调用方式的初衷,移除了对 SelfLink 的支持,该镜像可以不需要SekfLINK。
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: cai.pri/ifs
- name: NFS_SERVER
value: 192.168.18.101
- name: NFS_PATH
value: /nfs_data/rw
volumes:
- name: nfs-client-root
nfs:
server: 192.168.18.101
path: /nfs_data/rw
nfs-StorageClass是k8s中的一个存储类资源,用于定义动态NFS存储的配置和属性。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
namespace: redis
annotations:
storageclass.kubernetes.io/is-default-class: "false" ## 是否设置为默认的storageclass
provisioner: cai.pri/ifs ## 动态卷分配者名称,必须和上面创建的"provisioner"变量中设置的Name一致
reclaimPolicy: Retain ## 指定回收政策,storage 默认为 Delete
volumeBindingMode: Immediate # 默认为 Immediate,表示创建 PVC 立即进行绑定,只有 azuredisk 和 AWSelasticblockstore 支持其他值
# 查看默认仓库
helm repo list
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add aliyun https://apphub.aliyuncs.com/stable
helm repo add azure http://mirror.azure.cn/kubernetes/charts
# 搜索 redis chart
helm search repo redis
# 查看安装说明
helm show readme bitnami/redis
# 将 chart 拉到本地
helm pull bitnami/redis
# 解压
tar -xvf xxx -C /root/helm
这次用到这个包
bitnami/redis
[root@k8s-master01 redis]# vim /root/helm/redis/values.yaml
# 修改 storageClass 为 managed-nfs-storage
storageClass: "managed-nfs-storage"
# 设置 redis 密码 password
password: "123456"
# 修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
architecture: replication
# 修改实例存储大小 persistence.size 为需要的大小(看情况给)
size: 8Gi
# 修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767>
nodePorts:
redis: "32221"
# 安装(可以使用相对路径)
[root@k8s-master01 redis]# helm install redis /root/helm/redis -n redis
显示这个就代表安装成功了!
# 查看 redis 命名空间下所有对象信息
[root@k8s-master01 redis]# kubectl get all -n redis
搞定!
3升级版本
[root@k8s-master01 redis]# helm upgrade redis ./ -n redis
# 查看历史
helm history redis
# 回退到指定版本
helm rollback redis 3
六、卸载redis
[root@k8s-master01 redis]# helm delete redis -n redis