注意
==可行方式 mysql-nodeport-ingress.yaml ==
初始化sql
- 只有容器首次启动时才会执行/docker-entrypoint-initdb.d下的文件
- 若非首次启动,删除挂在的data目录,再新建data
mysql配置文件my.cnf
- 使用configmap创建my.cnf文件,使用volumeMounts挂载绑定了configmap的volume
volumeMounts挂载绑定了configmap的volume
- subPath方式使用configmap,cm的内容更新不会同步到挂在点
- 不使用subPath方式,更新ConfigMap后,volumeMounts挂载的Volume,大约10s左右更新
selector label
- selector使用labels不使用name
- svc和rc的selector都是选择pod的label,svc不选择rc的label
- ingress-nginx规则基于service.name,不基于label
#检查svc端点
kubectl get endpoints svc-mysql7 -n xcrj-dev
#查看ingress-controller中配置的规则
kubectl get pod -n ingress-nginx
kubectl exec -it ingress-nginx-controller-87f56f98f-ktvrf -n ingress-nginx -- /bin/bash
cd /etc/nginx
cat nginx.conf | grep mysql
nfs-server
sudo su -
mkdir -p /root/data/mysql7/init
mkdir -p /root/data/mysql7/sql
mkdir -p /root/data/mysql7/data
#cd /root/data/mysql7
#chmod 777 init
#chmod 777 sql
#chmod 777 data
#加入的内容见下
vim /etc/exports
service nfs-kernel-server restart
/etc/exports 末尾加入内容
/root/data/mysql7 *(insecure,rw,async,no_root_squash)
初始化sql
下面的sql文件需要放入nfs-server的/root/data/mysql7/init
目录下
roleme.sql
DROP DATABASE IF EXISTS `roleme`;
CREATE DATABASE IF NOT EXISTS `roleme` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
use `roleme`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for roles
-- ----------------------------
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of roles
-- ----------------------------
INSERT INTO `roles` VALUES (1, 'admin');
INSERT INTO `roles` VALUES (2, 'common');
INSERT INTO `roles` VALUES (3, 'visitor');
SET FOREIGN_KEY_CHECKS = 1;
userme.sql
/*
Navicat Premium Data Transfer
Source Server : dddd
Source Server Type : MySQL
Source Server Version : 50741
Source Host : localhost:49157
Source Schema : userme
Target Server Type : MySQL
Target Server Version : 50741
File Encoding : 65001
Date: 24/02/2023 23:14:37
*/
DROP DATABASE IF EXISTS `userme`;
CREATE DATABASE IF NOT EXISTS `userme` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
use `userme`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES (1, 'xcrj1', 'pwd1');
INSERT INTO `users` VALUES (2, 'xcrj2', 'pwd2');
INSERT INTO `users` VALUES (3, 'xcrj3', 'pwd3');
SET FOREIGN_KEY_CHECKS = 1;
mysql-nodeport-ingress.yaml
#将mysql-nodeport-ingress.yaml文件放入master节点目录
kubectl apply -f mysql-nodeport-ingress.yaml
#修改windows下的 C:\Windows\System32\drivers\etc\hosts 文件
#加入 192.168.66.20 mysql.xcrj.com
#使用 命令行 连接测试 IP方式 域名方式
mysql -h192.168.66.20 -P32762 -uroot -p
mysql -hmysql.xcrj.com -P32762 -uroot -p
#使用 navicat 连接测试 IP方式 域名方式
mysql-nodeport-ingress.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: xcrj-dev
---
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: xcrj-dev
name: pv-mysql7
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /root/data/mysql7
server: 192.168.66.30
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
namespace: xcrj-dev
name: pvc-mysql7
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs
resources:
requests:
storage: 2Gi
---
kind: ConfigMap
apiVersion: v1
metadata:
namespace: xcrj-dev
name: cm-mysql7
data:
my.cnf: |
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
#log-bin=bin-log
max_connections=5000
default-time-zone='+8:00'
---
apiVersion: v1
kind: ReplicationController
metadata:
namespace: xcrj-dev
name: rc-mysql7
spec:
replicas: 1
selector:
app: lmysql7 #选择pod的label
template:
metadata:
name: mysql7
labels:
app: lmysql7
spec:
containers:
- name: mysql7
image: mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: xcrj_mysql_pwd
volumeMounts: # 1个pvc下 n个子路径
- name: data-mysql
subPath: data
mountPath: /var/lib/mysql
- name: data-mysql
subPath: sql
mountPath: /sql
- name: data-mysql
subPath: init
mountPath: /docker-entrypoint-initdb.d #docker容器首次执行时会运行这个目录下的所有sql文件
- name: cnf-mysql #volume使用configmap
#subPath: my.cnf #subPath方式使用configmap,cm的内容更新不会同步到挂在点
#mountPath: /etc/mysql/conf.d/my.cnf
mountPath: /etc/mysql/conf.d #conf.d是目录,不使用subPath方式,更新ConfigMap后,volumeMounts挂载的Volume,大约10s左右更新
volumes:
- name: data-mysql
persistentVolumeClaim:
claimName: pvc-mysql7 # pvc名称
- name: cnf-mysql
configMap:
name: cm-mysql7
items:
- key: my.cnf #自定义key
path: my.cnf #configMap下文件名
---
apiVersion: v1
kind: Service
metadata:
namespace: xcrj-dev
name: svc-mysql7
spec:
type: NodePort
selector:
app: lmysql7 #根据labels选择,注意 svc选择pod的label不是rc的label
ports:
- name: port-tcp
protocol: TCP #默认TCP
port: 3306 #k8s网络内部端口映射
targetPort: 3306 #需要暴露的目标端口
nodePort: 32762 #有效范围30000-32767
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: xcrj-dev
name: ingress-mysql7
spec:
rules:
- host: mysql.xcrj.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-mysql7
port:
number: 32762 #代理到nodePort
mysql-clusterIp-ingress.yaml
ReplicationController 引用clusterIp svc
todo(ingress-nginx-controller 32676 mysql.nacos.com 无法正常访问)
原因:ingress-nginx-controller 支持 headless svc http转发,支持nodeport svc tcp转发,不支持 headless svc tcp转发,不支持clusterIp svc tcp转发
---
apiVersion: v1
kind: Namespace
metadata:
name: xcrj-dev
---
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: xcrj-dev
name: pv-mysql7
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /root/data/mysql7
server: 192.168.66.30
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
namespace: xcrj-dev
name: pvc-mysql7
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs
resources:
requests:
storage: 2Gi
---
kind: ConfigMap
apiVersion: v1
metadata:
namespace: xcrj-dev
name: cm-mysql7
data:
my.cnf: |
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
#log-bin=bin-log
max_connections=5000
default-time-zone='+8:00'
---
apiVersion: v1
kind: ReplicationController
metadata:
namespace: xcrj-dev
name: rc-mysql7
spec:
replicas: 1
selector:
app: lmysql7 #选择pod的label
template:
metadata:
name: mysql7
labels:
app: lmysql7
spec:
containers:
- name: mysql7
image: mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: xcrj_mysql_pwd
volumeMounts: # 1个pvc下 n个子路径
- name: data-mysql
subPath: data
mountPath: /var/lib/mysql
- name: data-mysql
subPath: sql
mountPath: /sql
- name: data-mysql
subPath: init
mountPath: /docker-entrypoint-initdb.d #docker容器首次执行时会运行这个目录下的所有sql文件
- name: cnf-mysql #volume使用configmap
#subPath: my.cnf #subPath方式使用configmap,cm的内容更新不会同步到挂在点
#mountPath: /etc/mysql/conf.d/my.cnf
mountPath: /etc/mysql/conf.d #conf.d是目录,不使用subPath方式,更新ConfigMap后,volumeMounts挂载的Volume,大约10s左右更新
volumes:
- name: data-mysql
persistentVolumeClaim:
claimName: pvc-mysql7 # pvc名称
- name: cnf-mysql
configMap:
name: cm-mysql7
items:
- key: my.cnf #自定义key
path: my.cnf #configMap下文件名
---
apiVersion: v1
kind: Service
metadata:
namespace: xcrj-dev
name: svc-mysql7
spec:
type: ClusterIP #默认ClusterIP
selector:
app: lmysql7 #根据labels选择,注意 svc选择pod的label不是rc的label
ports:
- name: port-tcp
protocol: TCP #默认TCP
port: 32763 #内部端口映射
targetPort: 3306 #目标端口
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: xcrj-dev
name: ingress-mysql7
spec:
rules:
- host: mysql.xcrj.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-mysql7
port:
number: 32763
mysql-headless-ingress.yaml
StatefulSet 引用headless svc
todo(ingress-nginx-controller 32676 mysql.nacos.com 无法正常访问)
原因:ingress-nginx-controller 支持 headless svc http转发,支持nodeport svc tcp转发,不支持 headless svc tcp转发,不支持clusterIp svc tcp转发
---
apiVersion: v1
kind: Namespace
metadata:
name: xcrj-dev
---
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: xcrj-dev
name: pv-mysql7
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /root/data/mysql7
server: 192.168.66.30
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
namespace: xcrj-dev
name: pvc-mysql7
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs
resources:
requests:
storage: 2Gi
---
kind: ConfigMap
apiVersion: v1
metadata:
namespace: xcrj-dev
name: cm-mysql7
data:
my.cnf: |
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
#log-bin=bin-log
max_connections=5000
default-time-zone='+8:00'
---
apiVersion: v1
kind: Service
metadata:
namespace: xcrj-dev
name: svc-mysql7
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
selector:
app: lmysql7
clusterIP: None
ports:
- port: 3306
protocol: TCP
name: tcp-mysql
targetPort: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: xcrj-dev
name: ss-mysql7
spec:
serviceName: svc-mysql7 #statefulset引用headless svc
replicas: 1
selector:
matchLabels:
app: lmysql7 #选择pod的label
template:
metadata:
name: mysql7
labels:
app: lmysql7
spec:
containers:
- name: mysql7
image: mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: xcrj_mysql_pwd
volumeMounts: # 1个pvc下 n个子路径
- name: data-mysql
subPath: data
mountPath: /var/lib/mysql
- name: data-mysql
subPath: sql
mountPath: /sql
- name: data-mysql
subPath: init
mountPath: /docker-entrypoint-initdb.d #docker容器首次执行时会运行这个目录下的所有sql文件
- name: cnf-mysql #volume使用configmap
#subPath: my.cnf #subPath方式使用configmap,cm的内容更新不会同步到挂在点
#mountPath: /etc/mysql/conf.d/my.cnf
mountPath: /etc/mysql/conf.d #conf.d是目录,不使用subPath方式,更新ConfigMap后,volumeMounts挂载的Volume,大约10s左右更新
volumes:
- name: data-mysql
persistentVolumeClaim:
claimName: pvc-mysql7 # pvc名称
- name: cnf-mysql
configMap:
name: cm-mysql7
items:
- key: my.cnf #自定义key
path: my.cnf #configMap下文件名
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: xcrj-dev
name: ingress-mysql7
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: mysql.xcrj.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-mysql7
port:
number: 3306