第一章:✨ k8s入门:裸机部署 k8s 集群
第二章:✨ k8s入门:部署应用到 k8s 集群
第三章:✨ k8s入门:service 简单使用
第四章:✨ k8s入门:StatefulSet 简单使用
第五章:✨ k8s入门:存储(storage)
第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
第七章:✨ k8s入门:配置 ConfigMap & Secret
第八章:✨ k8s入门:k8s入门:Helm 构建 MySQL
第九章:✨ k8s入门:kubernetes-dashboard 安装
第十章:✨ k8s入门:kube-prometheus-stack 全家桶搭建(Grafana + Prometheus)
二、简介
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的沙盒项目
环境:
- linux:centos 7.9
- helm:v3.9.0
- docker:v20.10.17
- k8s:v1.23.1
- MySQL:v8.0.29
- MySQL chart:9.1.8
三、三大概念
-
Chart: 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。
-
Repository(仓库): 是用来存放和共享 charts 的地方,供 Kubernetes 包所使用的。
-
Release: 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一个 chart 都拥有自己的 release 和 release name。
Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
四、常用命令
- helm search:查找 Charts,可以直接到 Artifact Hub 网站查找 charts, helm search hub 从 Artifact Hub 中查找并列出 helm charts ,Helm 搜索使用模糊字符串匹配算法,所以你可以只输入名字的一部分
- helm search hub - 在 Artifact Hub 或自己的 hub 实例中搜索 chart
- helm search repo - 在你添加的仓库中搜索
- helm install:安装一个 helm 包,最简单的使用方法只需要传入两个参数:你命名的release名字和你想安装的chart的名称。
- helm upgrade 和 helm rollback:升级 release 和失败时恢复
- helm uninstall:卸载 release
- helm repo:Helm 3 不再附带一个默认的 chart 仓库。helm repo 提供了一组命令用于添加(helm repo add)、列出(helm repo list)、更新(helm repo update)和移除仓库(helm repo remove)。
更多详细命令参考:https://helm.sh/zh/docs/helm/helm/
五、实践:helm 安装 mysql
1、安装 helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
2、添加 chart 仓库
[root@master secret] [root@master secret] [root@master secret]
NAME URL
azure http://mirror.azure.cn/kubernetes/charts/
bitnami https://charts.bitnami.com/bitnami
3、查询 mysql 可用版本
查找可用的 MySQL,可以去 Helm chart 仓库 Artifact Hub 中查找可用的 MySQL,如:https://artifacthub.io/packages/helm/bitnami/mysql,也可以使用如下命令查找
[root@master secret]
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 [root@master secret]
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...
4、安装 MySQL
①、可选参数
安装 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
③、storageClass
其中 primary.persistence.storageClass=“nfs-storage” 如下,具体实现可参考我另一篇文章:K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
[root@master mysql]
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage nfs-diy Retain Immediate false 6d20h [root@master mysql]
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 chart
[root@master mysql]
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" [root@master mysql]
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> [root@master mysql]
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysql-0 Bound pvc-e9484bd1-9ec2-4f09-8d71-d7bd1342792b 1Gi RWX nfs-storage 15s [root@master mysql]
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]
auto.cnf binlog.000002 binlog.index ca.pem client-key.pem binlog.000001 binlog.000003 ca-key.pem client-cert.pem [root@master mysql]
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
⑤、连接测试
- 命令行连接如下,可以见到连接成功,并且创建 study_database 数据库
[root@master mysql]
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>
- 可视化界面 sqlyog 连接成功,端口号 33060

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