• k8s入门:Helm 构建 MySQL


    一、系列文章



    二、简介

    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

    安装 helm,下面使用脚本安装 helm 3,更多安装方法可参考:https://helm.sh/zh/docs/intro/install/

    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
    • 1
    2、添加 chart 仓库
    # 天剑 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  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    3、查询 mysql 可用版本

    查找可用的 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...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    4、安装 MySQL
    ①、可选参数

    安装 MySQL,更多详细参数可参考 https://artifacthub.io/packages/helm/bitnami/mysql

    参数说明默认值
    MySQL 常用参数
    auth.rootPasswordroot 账户密码 ""
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    ③、storageClass

    其中 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    ④、安装 MySQL chart
    # 安装 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    ⑤、连接测试
    • 命令行连接如下,可以见到连接成功,并且创建 study_database 数据库
    # 创建一个 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> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 可视化界面 sqlyog 连接成功,端口号 33060
      在这里插入图片描述
    5、卸载 mysql

    使用如下命令卸载 mysql,会删除 pod 和 service,但不会删除 PV 、 PVC 和 SC,PV 状态会变为 Released

    [root@master mysql]# helm uninstall mysql
    release "mysql" uninstalled
    
    • 1
    • 2
  • 相关阅读:
    Transformer模型对应的Tokenizer类型
    LeetCode 260. 只出现一次的数字 III:异或
    什么品牌洗地机性价比高?四大出色的王牌机型力荐
    初识Java(二)
    【2022.12.06】备战春招Day1——每日一题 + 49.字母异位词分组
    【新手入门】Github与Git使用教程
    SpringBoot 快速实现 api 接口加解密
    如何将一个字符串转换为驼峰命名法(camel case)?
    3D bounding box网络简化
    数组07-滑动窗口、HashMap
  • 原文地址:https://blog.csdn.net/qq_41538097/article/details/125442282