Helm 类似 npm,pip,docker hub, 可以理解为是一个软件库,可以方便快速的为我们的集群安装一些第三方软件。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。使用 Helm 我们可以非常方便的就搭建出来 MongoDB / MySQL 副本集群,YAML 文件别人都给我们写好了,直接使用
Helm 官网:https://helm.sh/zh/docs/
Helm chart 仓库 Artifact Hub :https://artifacthub.io/packages/search
Artifact Hub 是基于web页面的应用,支持CNCF项目的查找、安装和发布包及配置项,包括了公开发布的Helm chart。它是CNCF的沙盒项目
环境:
Chart: 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。
Repository(仓库): 是用来存放和共享 charts 的地方,供 Kubernetes 包所使用的。
Release: 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一个 chart 都拥有自己的 release 和 release name。
Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
更多详细命令参考:https://helm.sh/zh/docs/helm/helm/
安装 helm,下面使用脚本安装 helm 3,更多安装方法可参考:https://helm.sh/zh/docs/intro/install/
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 天剑 bitnami 仓库
[root@master secret]# helm repo add bitnami https://charts.bitnami.com/bitnami
# 添加开源社/Azure中国
[root@master secret]# helm repo add azure http://mirror.azure.cn/kubernetes/charts/
# 查看添加的仓库
[root@master secret]# helm repo list
NAME URL
azure http://mirror.azure.cn/kubernetes/charts/
bitnami https://charts.bitnami.com/bitnami
查找可用的 MySQL,可以去 Helm chart 仓库 Artifact Hub 中查找可用的 MySQL,如:https://artifacthub.io/packages/helm/bitnami/mysql,也可以使用如下命令查找
# 查询 Artifact Hub 中可用的 mysql chart
[root@master secret]# helm search hub mysql
URL CHART VERSION APP VERSION DESCRIPTION
https://artifacthub.io/packages/helm/cloudnativ... 5.0.1 8.0.16 Chart to create a Highly available MySQL cluster
https://artifacthub.io/packages/helm/stakater/m... 1.0.6 mysql chart that runs on kubernetes
https://artifacthub.io/packages/helm/saber/mysql 8.8.21 8.0.27 Chart to create a Highly available MySQL cluster
# 查询 repo 仓库可用的 mysql chart
[root@master secret]# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
azure/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql ex...
bitnami/mysql 9.1.8 8.0.29 MySQL is a fast, reliable, scalable, and easy t...
安装 MySQL,更多详细参数可参考 https://artifacthub.io/packages/helm/bitnami/mysql
| 参数 | 说明 | 默认值 |
| MySQL 常用参数 | ||
| auth.rootPassword | root 账户密码 | "" |
| auth.createDatabase | 创建 auth.database 指定的数据库 | true |
| auth.database | 数据库名 | my_database |
| MySQL 主要参数参数 | ||
| primary.persistence.storageClass | MySQL主持久卷存储类 | "" |
| primary.persistence.annotations | MySQL 主持久卷声明注释 | {} |
| primary.persistence.accessModes | MySQL主持久卷访问模式 | ["ReadWriteOnce"] |
| primary.persistence.size | MySQL 主持久卷大小 | 8Gi |
| MySQL 辅助参数 | ||
| secondary.service.type | service 类型 | ClusterIP |
| secondary.service.ports.mysql | service 端口 | 3306 |
| secondary.service.nodePorts.mysql | service nodePorts | "" |
config.yaml 文件内容如下,YAML是JSON的超集,也可以使用 JSON文件
auth:
createDatabase: true
database: "study_database"
rootPassword: "Root@1234."
primary:
service:
ports:
mysql: "3306"
type: "NodePort"
nodePorts:
mysql: "33060"
persistence:
storageClass: "nfs-storage"
size: "1Gi"
annotations: {}
accessModes:
- "ReadWriteMany"
enabled: true
其中 primary.persistence.storageClass=“nfs-storage” 如下,具体实现可参考我另一篇文章:K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
[root@master mysql]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage nfs-diy Retain Immediate false 6d20h
[root@master mysql]# kubectl describe sc/nfs-storage
Name: nfs-storage
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"nfs-storage"},"parameters":{"archiveOnDelete":"false"},"provisioner":"nfs-diy","reclaimPolicy":"Retain"}
Provisioner: nfs-diy
Parameters: archiveOnDelete=false
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Retain
VolumeBindingMode: Immediate
Events: <none>
# 安装 MySQL,-f config.yaml 指定参数文件
[root@master mysql]# helm install mysql bitnami/mysql -f config.yaml
NAME: mysql
LAST DEPLOYED: Mon Jun 27 19:05:45 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.1.8
APP VERSION: 8.0.29
** Please be patient while the chart is being deployed **
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace default
Services:
echo Primary: mysql.default.svc.cluster.local:3306
Execute the following to get the administrator credentials:
echo Username: root
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.29-debian-11-r3 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
2. To connect to primary service (read/write):
mysql -h mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
# 查看 pod 详情
[root@master mysql]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-0 1/1 Running 0 105s 10.244.1.57 node1 <none> <none>
# 查看 PVC
[root@master mysql]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysql-0 Bound pvc-e9484bd1-9ec2-4f09-8d71-d7bd1342792b 1Gi RWX nfs-storage 15s
# 查看 PV
[root@master mysql]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-9e1650f2-4f5b-4c14-95c2-eb046ebddb2c 8Gi RWO Retain Released default/data-mysql-0 nfs-storage 85m
# 挂载的目录
[root@master mysql]# ls /home/data/default-data-mysql-0-pvc-e9484bd1-9ec2-4f09-8d71-d7bd1342792b/data/
auto.cnf binlog.000002 binlog.index ca.pem client-key.pem #ib_16384_1.dblwr ibdata1 ib_logfile1 #innodb_temp mysql.ibd performance_schema public_key.pem server-key.pem sys undo_002
binlog.000001 binlog.000003 ca-key.pem client-cert.pem #ib_16384_0.dblwr ib_buffer_pool ib_logfile0 ibtmp1 mysql mysql_upgrade_info private_key.pem server-cert.pem study_database undo_001
# 查看 SVC
[root@master mysql]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql NodePort 10.96.52.109 <none> 3306:33060/TCP 26s
mysql-headless ClusterIP None <none> 3306/TCP 26s
# 创建一个 MySQL pod,退出即删除
[root@master mysql]# kubectl run mysql-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.29-debian-11-r3 --namespace default --env MYSQL_ROOT_PASSWORD=Root@1234. --command -- bash
If you don't see a command prompt, try pressing enter.
I have no name!@mysql-client:/$ mysql -h mysql.default.svc.cluster.local -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 352
Server version: 8.0.29 Source distribution
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| study_database |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>

使用如下命令卸载 mysql,会删除 pod 和 service,但不会删除 PV 、 PVC 和 SC,PV 状态会变为 Released
[root@master mysql]# helm uninstall mysql
release "mysql" uninstalled