安装好k8s集群
一、引入helm原因
当今的软件开发,随着云原生技术的普及,我们的工程应用进行微服务化和容器化的现象也变得越来越普遍。而Kubernetes几乎已经成了云原生服务编排绕不开的标准和技术。
假设我们需要在K8s中简单部署一个nginx,必要步骤如下:
1、创建或者编写deployment模板
kubectl create deployment nginx --image=nginx:1.20 --dry-run=client -o yaml > deployment.yaml
2、创建deployment资源
kubectl apply -f deployment.yaml
3、查看pod状态
kubectl get pod
4、创建service
kubectl expose deployment nginx --port=8099 --target-port=80 --type=NodePort --dry-run=client -o yaml > service.yaml
5、创建service资源
kubectl apply -f service.yaml
6、查看service端口
kubectl get svc
7、访问nginx服务
使用浏览器访问192.168.10.11:31994
实际生产中,微服务项目可能有十几个模块,若还需要进行安全访问和控制,那么需要创建诸如Role、ServiceAccount等资源。部署和版本升级时也往往需要修改或添加配置文件中的一些参数(例如:服务占用的CPU、内存、副本数、端口等),维护大量的yaml文件极为不便,所以,我们需要将这些YAML文件作为一个整体管理,并高效复用。
- 在Linux操作系统软件部署中,我们可以使用批量管理工具完成软件的批量管理等,例如yum、apt等;
- 在容器应用中Docker使用Dockerfile文件解决了容器镜像制作难题;
- 在kubernetes应用中,通过YAML格式文件解决容器编排部署难题,例如可以通过YAML格式的资源清单文件,非常方便部署不同控制器类型的应用;
- 但是如何维护大量的,系统性的YAML文件,需要我们拥有更好的工具,不能简单使用YAML资源清单托管服务器就可以解决的
那么在CNCF的体系中是否存在这样的强力“工具”,能够简化我们部署安装过程呢?答案是存在的,Helm就是这样一款工具。
二、helm是什么
官方:https://helm.sh/
作为CNCF的毕业项目。它的官方的定义是:Helm是一个为K8s进行包管理的工具。Helm将yaml作为一个整体管理并实现了这些yaml的高效复用,就像Linux中的yum或apt-get,它使我们能够在K8s中方便快捷的安装、管理、卸载K8s应用。
- Helm(舵柄; 舵轮)是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等。
- helm一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
- 通过helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。
- 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
- 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
- 除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
- Helm 社区已经维护了一个官方 Helm Hub,我们可以直接使用已经做好的 Helm Chart,部署和管理比较复杂的应用程序
- 早期的hub.helm.dev转移到了https://artifacthub.io/。
三、helm作用及核心概念
Helm基于go模板语言,用户只要提供规定的目录结构和模板文件。在真正部署时Helm模板引擎便可以将其渲染成真正的K8s资源配置文件,并按照正确的顺序将它们部署到节点上。
Helm 定义了一套 Chart 格式来描述一个应用。打个比方,一个安卓程序打包成 APK 格式,就可以安装到任意一台运行安卓系统的手机上,如果我们把 kubernetes 集群比做安卓系统,kubernetes 集群内应用比做安卓程序,那么 Chart 就可以比做 APK。这就意味着,kubernetes 集群应用只要打包成 Chart,就可以通过 Helm 部署到任意一个 kubernetes 集群中。
Helm中有三个重要概念,分别为Chart、Repository和Release。
- Chart代表Helm包。它包含在K8s集群内部运行应用程序,工具或服务所需的所有资源定义,为所有项目资源清单yaml文件的集合,采用TAR格式,可以类比成yum中的RPM。
- Repository就是用来存放和共享Chart的地方,可以类比成YUM仓库。
- Release是运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。
Helm作为K8s的包管理软件,每次安装Charts 到K8s集群时,都会创建一个新的 release。你可以在Helm 的Repository中寻找需要的Chart。Helm对于部署过程的优化的点在于简化了原先完成配置文件编写后还需使用一串kubectl命令进行的操作、统一管理了部署时的可配置项以及方便了部署完成后的升级和维护。
四、helm部署(二进制包)
下载或上传helm-v3.13.2-linux-amd64.tar.gz包到/root目录
下载方法:wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
tar xf helm-v3.13.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
helm version
五、helm基础使用
1、查看仓库
helm repo list
2、添加新的仓库地址
微软仓库:
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
bitnami仓库(需要连接VPN才能添加):
helm repo add bitnami https://charts.bitnami.com/bitnami
阿里云仓库:
helm repo add alistable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
开源社仓库:
helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts
3、查看已经添加的仓库
helm repo list
4、为了确保获取到最新的Chart包信息,需要更新仓库
helm repo update
再次查看
helm repo list
5、删除仓库
helm repo remove kaiyuanshe
helm repo list
6、查看charts
使用helm search repo 关键字可以查看相关charts
helm search repo nginx
helm search repo mysql
从 stable Helm 仓库中安装名为 mysql 的 Chart
helm install mysql stable/mysql
列出当前 Kubernetes 集群中已安装的所有 Helm Release
helm list
NAME:mysql Release 的名称,这里是 mysql。
NAMESPACE:default Release 安装的命名空间,这里是 default。
REVISION:1 Release 的版本号,这里是 1,表示这是第一次安装或更新。
UPDATED:2025-04-11 17:45:58.45362188 +0800 CST Release 的更新时间,格式为 YYYY-MM-DD HH:MM:SS +时区。
STATUS:deployed Release 的状态,这里是 deployed,表示成功部署。
CHART:mysql-1.6.9 使用的 Chart 名称和版本,这里是 mysql Chart 的 1.6.9 版本。
APP VERSION:5.7.30 应用程序的版本,这里是 MySQL 的 5.7.30 版本。
kubectl get all
此处会因为连接不到StorageClass,pod异常
卸载名为 mysql 的 Helm Release
helm uninstall mysql
执行结果:
删除与 mysql Release 相关的所有 Kubernetes 资源(如 Pod、Service、PersistentVolumeClaim 等)。
从 Helm 的 Release 历史记录中移除 mysql。
六、部署应用MySQL
环境说明:k8s集群中存在storageclass:nfs-client
1、部署storageclass
(1)配置NFS服务
所有节点都安装nfs-utils工具包
yum -y install nfs-utils
这里将192.168.10.14作为nfs服务器
192.168.10.14:
mkdir -p /data/nfs
vim /etc/exports
添加:
/data/nfs *(rw,sync,no_root_squash)
systemctl start nfs-server
systemctl enable nfs-server
showmount -e
worker1:
showmount -e 192.168.10.14
worker2:
showmount -e 192.168.10.14
(2)下载或上传storageclass-nfs.yml文件并创建storageclass(master1)
wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml
mv class.yaml storageclass-nfs.yml
vim storageclass-nfs.yml
创建资源
kubectl apply -f storageclass-nfs.yml
列出集群中所有的 StorageClass(存储类)
kubectl get sc
存储类名为:nfs-client
(3)下载或上传rbac.yaml文件配置清单文件,创建rbac(创建账号,并授权)(master1)
因为storage自动创建pv需要经过kube-apiserver,所以需要授权。
RBAC(Role-Based Access Control):基于角色的访问控制
wget https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml
mv rbac.yaml storageclass-nfs-rbac.yaml
vim storageclass-nfs-rbac.yaml
创建资源
kubectl apply -f storageclass-nfs-rbac.yaml
(4)创建动态供给的deployment(master1)
需要一个deployment来专门实现pv与pvc的自动创建
vim deploy-nfs-client-provisioner.yml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
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
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.10.14
- name: NFS_PATH
value: /data/nfs
volumes:
- name: nfs-client-root
nfs:
server: 192.168.10.14
path: /data/nfs
创建资源
kubectl apply -f deploy-nfs-client-provisioner.yml
kubectl get pod | grep nfs-client-provisioner
2、安装MySQL应用
在所有已添加的 Helm 仓库中搜索与 mysql 相关的 Chart
helm search repo mysql
用 Helm 从 stable 仓库安装 MySQL Chart
helm install stable/mysql --generate-name --set persistence.storageClass=nfs-client --set mysqlRootPassword=test123
参数解析:
helm install:这是 Helm 的命令,用于安装 Chart。
stable/mysql:这是 Chart 的名称。stable 是仓库名称,mysql 是 Chart 名称。
--generate-name:让 Helm 自动生成一个唯一的 Release 名称,而不是手动指定。
--set persistence.storageClass=nfs-client:设置持久化存储的 StorageClass 为 nfs-client。
--set mysqlRootPassword=test123:设置 MySQL 的 root 用户密码为 test123
列出当前 Kubernetes 集群中已安装的所有 Helm Release
helm list或helm ls
kubectl get pod
kubectl get pvc
kubectl get pv
一个 chart 包是可以多次安装到同一个集群中的,每次安装都会产生一个release, 每个release都可以独立管理和升级。
再用 Helm 从 stable 仓库安装 MySQL Chart
helm install stable/mysql --generate-name --set persistence.storageClass=nfs-client --set mysqlRootPassword=root
列出当前 Kubernetes 集群中已安装的所有 Helm Release
helm ls
kubectl get pod
进入第一次创建的MySQL Pod
kubectl exec -it mysql-1744374156-55976dffc-nkmkv – bash
mysql -uroot -ptest123
show databases;
在NFS服务器上查看/data/nfs目录下的内容
ls /data/nfs/
3、查看Chart资源
helm ls
获取所有带有标签 release=mysql-1744374156 的资源
kubectl get all -l release=mysql-1744374156
显示 stable/mysql Chart 的详细信息
helm show chart stable/mysql
显示 stable/mysql Chart 的所有相关信息,包括 Chart 的元数据、默认值、模板和依赖项等
helm show all stable/mysql
4、删除Release
如果需要删除这个 Release 也很简单,只需要使用 helm uninstall或helm delete 命令即可
helm ls
卸载名为 mysql-1744374156 的 Helm Release
helm uninstall mysql-1744374156
执行结果:
删除与 mysql-1744374156 Release 相关的所有 Kubernetes 资源(如 Pod、Service、PersistentVolumeClaim 等)。
从 Helm 的 Release 历史记录中移除 mysql-1744374156
在NFS服务器上查看/data/nfs目录下的内容
ls /data/nfs/
持久化目录也一并删除
helm ls
在删除的时候使用 --keep-history 参数,则会保留 release 的历史记录,该 release 的状态就是 UNINSTALLED。
卸载名为 mysql-1744374360 的 Helm Release,同时保留其历史记录
helm uninstall mysql-1744374360 --keep-history
--keep-history:保留 Release 的历史记录,而不是完全删除
helm ls
获取所有带有标签 release= mysql-1744374360的资源
kubectl get all -l release=mysql-1744374360
资源都被删除
列出所有 Helm Release,包括已卸载的 Release
helm ls -a
STATUS:uninstalled Release 的状态,这里是 uninstalled,表示已被卸载。
查看 Release 的历史记录
helm history mysql-1744374360
将名为 mysql-1744374360 的 Helm Release 回滚到指定的版本(这里是版本 1)
helm rollback mysql-1744374360 1
helm ls
rollback回滚后,又回到deployed状态表示成功部署
获取所有带有标签 release= mysql-1744374360的资源
kubectl get all -l release=mysql-1744374360
七、更多安装方式
1、Chart 仓库(上面的方式)
2、本地Chart包离线安装(实例)
从 stable 仓库下载 mysql Chart 的压缩包到本地
helm pull stable/mysql
ls
使用 Helm 从本地的 mysql-1.6.9.tgz Chart 压缩包安装 MySQL
helm install mysql2 mysql-1.6.9.tgz --set persistence.storageClass=nfs-client --set mysqlRootPassword=root
helm ls
获取所有带有标签 release=mysql2的资源
kubectl get all -l release=mysql2
3、在线URL安装
使用浏览器访问:Index of /kubernetes/charts/ 找到所需包
helm install mysql http://mirror.azure.cn/kubernetes/charts/mysql-1.6.9.tgz --set persistence.storageClass=nfs-client --set mysqlRootPassword=root
helm ls
获取所有带有标签 release=mysql的资源
kubectl get all -l release=mysql