Kubernetes使用helm部署单机版mysql(使用hostPath数据卷)

一. 安装helm

官网:https://helm.sh/zh/docs/intro/install/
https://helm.sh/zh/docs/intro/quickstart/#初始化
通过GitHub下载安装包

解压
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
在解压目中找到helm程序,移动到需要的目录中
mv linux-amd64/helm /usr/local/bin/helm
添加阿里云存储库
helm repo add brigade http://mirror.azure.cn/kubernetes/charts

二. 配置本机数据卷hostPath

在节点k8s-node01上创建mysql数据存储目录
# mkdir -p /data/k8s-mysql-data && chmod -R 777 /data/k8s-mysql-data

三. 自定义配置helm chart

搜索mysql的charts
# helm search repo mysql

下载对应的mysql chart
# helm fetch stable/mysql

# tar zxvf mysql-1.6.9.tgz
# cd mysql


查看mysql的docker image版本
grep image values.yaml

修改mysql的docker image版本为5.7版最新5.7.37
# sed -i 's/5.7.30/5.7.37/g' values.yaml

修改busybox的docker image版本为latest
# sed -i ‘s/1.32/latest/g‘ values.yaml

在节点k8s-node01上下载mysql和busybox的docker镜像
# docker pull mysql:5.7.37 
# docker pull busybox:latest

配置节点亲和性(nodeAffinity)
vi values.yaml
......
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-node01
.....

配置持久化存储
vi values.yaml
……
persistence:
  enabled: true
  # storageClass: "-"
  accessMode: ReadWriteOnce
  size: 8Gi
  annotations: {}
......

配置资源使用
vi values.yaml
……
resources:
  requests:
    memory: 1024Mi
    cpu: 1000m
......

配置mysql的配置文件
添加字符编码配置和其它配置
vi values.yaml
……
configurationFiles:
  mysql.cnf: |-
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    #log-error      = /var/log/mysql/error.log
    # By default we only accept connections from localhost
    #bind-address   = 127.0.0.1
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    #如果你的sql语句里有group,添加这句可以防止报错 
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    #避免表名大小写问题 
lower_case_table_names=1
......

配置mysql服务的访问方式
vi values.yaml
……
  #service-types
  #type: ClusterIP
  type: NodePort
  port: 3306
  nodePort: 32000
  # loadBalancerIP:
......
配置pod的时区
vi values.yaml
……
timezone: 'Asia/Shanghai'
......

配置挂载卷
vi templates/deployment.yaml
文件末尾处
      volumes:
      ......
      - name: data
      {{- if .Values.persistence.enabled }}
        persistentVolumeClaim:
          claimName: {{ .Values.persistence.existingClaim | default (include "mysql.fullname" .) }}
      {{- else }}
        emptyDir: {}
      {{- end -}}
      ……
修改为
......
      volumes:
      ......
      - name: data
        hostPath:
          path: /data/k8s-mysql-data
          type: Directory
      ……
......

手动创建pv
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-mysql
spec:
  capacity:
    storage: 8Gi
  accessModes:
   - ReadWriteOnce
  hostPath:
    path: /data/k8s-mysql-data
type: Directory
# kubectl create -f pv.yaml
# kubectl get pv

四. 通过helm安装mysql

# kubectl create ns mysql

# helm install -n mysql mysql -f values.yaml  .
如果出现报错,请检查配置文件的语法格式!

# kubectl get pod -n mysql -o wide


# kubectl -n mysql get svc

# kubectl -n mysql get pvc

保存本地的chart
# helm package mysql

五. 验证

获取mysql root密码
# MYSQL_ROOT_PASSWORD=$(kubectl get secret -n mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
# echo $MYSQL_ROOT_PASSWORD


连接数据库mysql
# mysql -h 节点IP -P 32000 -uroot -p



查看主机上mysql挂载的目录
在节点k8s-node01上

# cd /data/k8s-mysql-data/
# ls -l



多次删除mysql pod, 发现mysql pod 始终被调度到节点k8s-node01上. 证明我们配置的节点亲和性(nodeAffinity)生效。

posted @ 2022-02-23 16:00  Sureing  阅读(2245)  评论(1编辑  收藏  举报