mysql是tcp连接,使用traefik2.5.7来进行tcp路由

注意每个资源的端口配置,理解这个很重要!!
这些都可随意配置,加深理解

本机host配置:127.0.0.1 mysql.cream.com
本机docker nginx容器:3312:3312(本机:nginx容器),nginx容器内服务监听3312端口,转发到k8s Node的4306端口
traefik Pod:3312:4306(traefik Pod:k8s Node),3312是traefik配置的mysql入口点的端口,4306是k8s Node的端口,traefik请求入口
mysql IngressRouteTcp:mysql(spec.entryPoints),HostSNI(`*`)(spec.routes.match),配置traefik的tcp路由规则
mysql Service:3307:3306(clusterIp:mysql Pod),3307是Service的集群ip暴露的端口,3306是mysql Pod的暴露端口
mysql Pod:3306,mysql服务启动的端口

1、镜像

docker pull mysql:8.0.27

2、tag

docker images | grep mysql
mysql    8.0.27    3218b38490ce   4 weeks ago     516MB

docker tag 3218b38490ce registry.cn-shenzhen.aliyuncs.com/hqyinfra/mysql:v8.0.27

3、推送

docker push registry.cn-shenzhen.aliyuncs.com/hqyinfra/mysql:v8.0.27

4、pvc.yaml

kubectl apply -f pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql
  namespace: app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

5、cm.yaml

kubectl apply -f cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
  namespace: app
data:
  my.cnf: |
    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    skip-character-set-client-handshake = 1
    default-storage-engine = INNODB
    max_allowed_packet = 500M
    explicit_defaults_for_timestamp = 1
    long_query_time = 10

6、dp.yaml

kubectl apply -f dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
  namespace: app
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: registry.cn-shenzhen.aliyuncs.com/hqyinfra/mysql:v8.0.27
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: xixi
        ports:
        - containerPort: 3306
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: pv
        - mountPath: /etc/mysql/conf.d/my.cnf
          subPath: my.cnf
          name: cm
      volumes:
        - name: pv
          persistentVolumeClaim:
            claimName: mysql
        - name: cm
          configMap:
            name: mysql

7、svc.yaml

kubectl apply -f svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: app
spec:
  ports:
    - port: 3307
      protocol: TCP
      targetPort: 3306
  selector:
    app: mysql

8、irt.yaml

kubectl apply -f irt.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: mysql
  namespace: app
spec:
  entryPoints:
    - mysql
  routes:
  - match: HostSNI(`*`)
    services:
    - name: mysql
      port: 3307

9、修改traefik的cm.yaml,增加mysql入口点
cm.yaml

kubectl apply -f cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: traefik
  namespace: kube-system
data:
  traefik.yaml: |-
    serversTransport:
      insecureSkipVerify: true
    api:
      insecure: true
      dashboard: true
      debug: true
    metrics:
      prometheus: ""
    entryPoints:
      web:
        address: ":8000"
      websecure:
        address: ":4443"
      mysql:
        address: ":3312"
    providers:
      kubernetesCRD: ""
      kubernetesingress: ""
    log:
      filePath: ""
      level: error
      format: json
    accessLog:
      filePath: ""
      format: json
      bufferingSize: 0
      filters:
        retryAttempts: true
        minDuration: 20
      fields:
        defaultMode: keep
        names:
          ClientUsername: drop
        headers:
          defaultMode: keep
          names:
            User-Agent: redact
            Authorization: drop
            Content-Type: keep

10、修改traefik的ds.yaml,增加mysql入口点端口映射
ds.yaml

kubectl apply -f ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  namespace: kube-system
  name: traefik
  labels:
    app: traefik
spec:
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
        - name: traefik
          image: registry.cn-shenzhen.aliyuncs.com/hqyinfra/traefik:v2.5.7
          args:
            - --configfile=/config/traefik.yaml
          volumeMounts:
            - mountPath: /config
              name: config
          ports:
            - name: web
              containerPort: 8000
              hostPort: 83
            - name: websecure
              containerPort: 4443
              hostPort: 4443
            - name: admin
              containerPort: 8080
            - name: mysql
              containerPort: 3312
              hostPort: 4306
      volumes:
        - name: config
          configMap:
            name: traefik

在这里插入图片描述在这里插入图片描述

11、增加用于转发mysql的tcp请求至traefik的本地nginx配置

docker run -d -p 3312:3312 -p 3313:3313 --name tcpnginx registry.cn-shenzhen.aliyuncs.com/hqyinfra/nginx:v1.21.5-alpine

进入docker容器修改nginx配置,增加stream块

docker exec -it tcpnginx sh

vi /etc/nginx/nginx.conf

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

stream {
    include /etc/nginx/tcpconf.d/*.conf;
}

增加mysql的转发配置

cd /etc/nginx
mkdir tcpconf.d
vi tcpconf.d/mysql.conf

mysql.conf

upstream mysql {
    server 192.168.65.4:4306;
}
server {
    listen 3312;
    proxy_connect_timeout 10s;
    proxy_timeout 300s;
    proxy_pass mysql;
}
nginx -s reload
exit

12、配置host

vi /etc/hosts
127.0.0.1 mysql.cream.com

13、连接mysql.cream.com:3312

user:root
password:xixi

在这里插入图片描述

Logo

开源、云原生的融合云平台

更多推荐