一. 安裝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)生效。