注意

==可行方式 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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐