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