写在最前
根据你自身的需求选择任意一种部署方式,如果是新人可以先看之前的篇章来完成基础环境的安装与配置。
1. 前置要求
2. docker 部署
mkdir -p /data/mysql8/conf /data/mysql8/data
docker run -d \
--privileged=true \
--name mysql8 \
--restart=always \
-p 3306:3306 \
-v /data/mysql8/conf:/etc/mysql/conf.d \
-v /data/mysql8/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=test-db \
mysql:8.0.20 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_bin
2.1 错误1
如果出现 --initialize specified but the data directory has files in it. Aborting. 异常,请尝试加上 --privileged=true 以超级权限运行。
2.2 错误2
最新的MySQL模块并未完全支持MySQL 8.0的caching_sha2_password加密方式,而MySQL 8.0中默认仍然是caching_sha2_password加密方式,因此用户认证不通过了。
注意,我是为了个人开发便捷将root设置为允许远程连接,生产禁止此操作。
# 1. 进入容器
docker exec -it mysql8 /bin/bash
# 2. 登录mysql
mysql -u root -p
# 3. 更新root密码规则为 mysql_native_password ,允许root远程连接,并且设密码为123456
alter user 'root'@'%' identified with mysql_native_password by '123456';
# 4. 刷新权限
flush privileges;
3. Kubernetes 部署
namespace 我统一设置为 basic ,自行修改存储类相关配置
3.1 secret
MYSQL_ROOT_PASSWORD 值是123456
apiVersion: v1
kind: Secret
metadata:
namespace: basic
labels: {}
name: mysql-secret
type: Opaque
spec:
template:
metadata:
labels: {}
data:
MYSQL_ROOT_PASSWORD: MTIzNDU2
3.2 configmap
修改全局字符集
kind: ConfigMap
apiVersion: v1
metadata:
name: mysql8-conf
namespace: basic
annotations:
kubesphere.io/creator: admin
data:
my.cnf: |
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init_connect='SET collation_connection = utf8mb4_bin'
init_connect='SET NAMES utf8mb4'
character_set_server = utf8mb4
collation_server = utf8mb4_bin
skip-character-set-client-handshake
skip-name-resolve
3.3 deployment
kind: Deployment
apiVersion: apps/v1
metadata:
name: mysql8
namespace: basic
labels:
app: mysql8
annotations:
deployment.kubernetes.io/revision: '6'
kubesphere.io/creator: admin
spec:
replicas: 1
selector:
matchLabels:
app: mysql8
template:
metadata:
creationTimestamp: null
labels:
app: mysql8
annotations:
kubesphere.io/creator: admin
kubesphere.io/imagepullsecrets: '{}'
kubesphere.io/restartedAt: '2024-09-18T07:33:09.888Z'
logging.kubesphere.io/logsidecar-config: '{}'
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
- name: mysql8-data
persistentVolumeClaim:
claimName: mysql8-data
- name: mysql8-conf
configMap:
name: mysql8-conf
defaultMode: 420
containers:
- name: container-6m2r7f
image: 'mysql:8.0.20'
ports:
- name: http-3306
containerPort: 3306
protocol: TCP
- name: http-33060
containerPort: 33060
protocol: TCP
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_ROOT_PASSWORD
resources: {}
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
- name: mysql8-data
mountPath: /var/lib/mysql
- name: mysql8-conf
readOnly: true
mountPath: /etc/mysql/conf.d
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
3.4 service
使用nodeport方式连接
kind: Service
apiVersion: v1
metadata:
name: mysql8
namespace: basic
labels:
app: mysql8
annotations:
kubesphere.io/creator: admin
spec:
ports:
- name: http-3306
protocol: TCP
port: 3306
targetPort: 3306
nodePort: 31205
selector:
app: mysql8
type: NodePort
sessionAffinity: None
externalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
internalTrafficPolicy: Cluster
4. 操作总结
部署5.x很简单,但是为啥部署8.x会那么复杂多坑,可能是他的镜像做的有问题吧启动起来还不能直接使用晕死了。