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)生效。