hostpath存储类型及headlines类型的service与手动指定ip版mysql5.7部署并构建webstack

一、headlines类型的service版mysql构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-cm
namespace: dev
data:
my.cnf: |
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
## 同一局域网内注意要唯一
server-id=001
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

gtid_mode=on
enforce_gtid_consistency=on

relay-log=relay-log.log
binlog_format=ROW
#MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
#log_slave_updates=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
#replicate_do_db=tt
#MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组方式复制,提高复制的效率
slave_parallel_type=logical_clock
#开启通用查询日志
general_log=1
#设置通用日志的输出格式为文件和表
log_output=FILE,TABLE
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: dev
spec:
selector:
matchLabels:
app: mysql # has to match .spec.template.metadata.labels
serviceName: "mysql"
replicas: 1 # by default is 1 # 3副本
# minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: mysql # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/zznn/mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "root_password" # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_DATABASE
value: webstack # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_USER
value: webstack # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_PASSWORD
value: "root_password" # 设置根密码,建议使用 Secrets 存储
args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-storage
- name: config-map
mountPath: "/etc/mysql/my.cnf"
subPath: my.cnf
ports:
- containerPort: 3306
name: mysql
volumes:
# 定义 ConfigMap 类型的 Volume
- name: config-map
configMap:
name: mysql-cm # 引用名为 mysql-cm 的 ConfigMap
- name: mysql-storage
hostPath:
path: /opt/webstack_db # 宿主机目录
type: DirectoryOrCreate # 目录存在就使用,不存在就先创建后使用


---
apiVersion: v1
kind: Service
metadata:
name: service-mysql
namespace: dev
spec:
selector:
app: mysql
clusterIP: None # service的ip地址,如果不写,默认会生成一个 此中即为headline类型的service
type: ClusterIP
ports:
- port: 3306 # Service端口
targetPort: 3306 # pod端口

查看域名内部dns解析

1
2
3
4
5
6
7
kubectl exec -it mysql-0 -n dev   -- /bin/sh 
ls
# bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
cat /etc/resolv.conf
# search dev.svc.cluster.local svc.cluster.local cluster.local
# nameserver 10.96.0.10
# options ndots:5

备注:域名规则 svc名称+ns名称+写死部分svc.cluster.local 即此headliness类型的pod域名方式访问应该是

service-mysql.dev.svc.cluster.local

验证(宿主机执行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
dig @10.96.0.10 service-mysql.dev.svc.cluster.local 
// 返回
root@k8s:/opt/webstack# dig @10.96.0.10 service-mysql.dev.svc.cluster.local

; <<>> DiG 9.11.3-1ubuntu1.18-Ubuntu <<>> @10.96.0.10 service-mysql.dev.svc.cluster.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52747
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: dd22da56f562b801 (echoed)
;; QUESTION SECTION:
;service-mysql.dev.svc.cluster.local. IN A

;; ANSWER SECTION:
service-mysql.dev.svc.cluster.local. 30 IN A 172.16.0.9

;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Tue Dec 24 15:19:34 CST 2024
;; MSG SIZE rcvd: 127

root@k8s:/opt/webstack# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-0 1/1 Running 0 18m 172.16.0.9 k8s <none> <none>
qexo-0 1/1 Running 1 (64m ago) 77m 172.16.0.6 k8s <none> <none>

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/25/1/image_bbf96436226c61db3ef129199d2968e5.png

headlines类型的service集群之间通信直接使用svc名称

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/25/1/image_d98ea5eb38a20aaf13987b58ab40b280.png

二、webstack构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 构建webstack
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webstack
namespace: dev
spec:
replicas: 1 # 修改为3副本
selector:
matchLabels:
app: webstack # 必须与 .spec.template.metadata.labels 匹配
template:
metadata:
labels:
app: webstack # 必须与 .spec.selector.matchLabels 匹配
spec:
terminationGracePeriodSeconds: 10
containers:
- name: webstack
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:webstackv-1.2.2
env:
- name: LOGIN_COPTCHA
value: "false"
- name: DB_HOST
value: "service-mysql" # 此处为headlines类型的service版mysql的地址
- name: DB_DATABASE
value: webstack
- name: DB_USERNAME
value: root
- name: DB_PASSWORD
value: root_password
- name: APP_URL
value: "" # 空值明确写为 ""
ports:
- containerPort: 8000
name: webstack
command: ['/entrypoint.sh','serve']

# 暴露webstack端口
---
apiVersion: v1
kind: Service
metadata:
namespace: dev
name: webstack-service
spec:
selector:
app: webstack
ports:
- protocol: TCP
port: 8000
targetPort: 8000
sessionAffinity: ClientIP
type: NodePort # 将服务暴露为 NodePort 类型

成功!

三、扩展、clusterIP 手动指定IP版本部署MySQL与webstack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# mysql配置
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-cm
namespace: dev
data:
my.cnf: |
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
## 同一局域网内注意要唯一
server-id=001
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

gtid_mode=on
enforce_gtid_consistency=on

relay-log=relay-log.log
binlog_format=ROW
#MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
#log_slave_updates=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
sync_master_info=1
slave_parallel_workers=2
binlog_checksum=CRC32
master_verify_checksum=1
slave_sql_verify_checksum=1
binlog_rows_query_log_events=1
#replicate_do_db=tt
#MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组 方式复制,提高复制的效率
slave_parallel_type=logical_clock
#开启通用查询日志
general_log=1
#设置通用日志的输出格式为文件和表
log_output=FILE,TABLE

# mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: dev
spec:
selector:
matchLabels:
app: mysql # has to match .spec.template.metadata.labels
serviceName: "mysql"
replicas: 1 # by default is 1 # 3副本
# minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: mysql # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mysql
image: registry.cn-hangzhou.aliyuncs.com/zznn/mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "root_password" # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_DATABASE
value: webstack # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_USER
value: webstack # 设置根密码,建议使用 Secrets 存储
- name: MYSQL_PASSWORD
value: "root_password" # 设置根密码,建议使用 Secrets 存储
args:
- --character-set-server=utf8mb4
# - --collation-server=utf8mb4_unicode_ci
# - "--default-authentication-plugin=mysql_native_password"
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-storage
- name: config-map
mountPath: "/etc/mysql/my.cnf"
subPath: my.cnf
ports:
- containerPort: 3306
name: mysql
volumes:
# 定义 ConfigMap 类型的 Volume
- name: config-map
configMap:
name: mysql-cm # 引用名为 mysql-cm 的 ConfigMap
- name: mysql-storage
hostPath:
path: /opt/mysql # 宿主机目录
type: DirectoryOrCreate # 目录存在就使用,不存在就先创建后使用
# # 定义持久化存储 Volume
# - name: mysql-storage
# persistentVolumeClaim:
# claimName: mysql-pvc

# 使mysql ip固定
---
apiVersion: v1
kind: Service
metadata:
name: service-mysql
namespace: dev
spec:
selector:
app: mysql
clusterIP: 10.96.0.2 # service的ip地址,如果不写,默认会生成一个
type: ClusterIP
ports:
- port: 3306 # Service端口
targetPort: 3306 # pod端口

# 构建webstack
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webstack
namespace: dev
spec:
replicas: 1 # 修改为3副本
selector:
matchLabels:
app: webstack # 必须与 .spec.template.metadata.labels 匹配
template:
metadata:
labels:
app: webstack # 必须与 .spec.selector.matchLabels 匹配
spec:
terminationGracePeriodSeconds: 10
containers:
- name: webstack
image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:webstackv-1.2.2
env:
- name: LOGIN_COPTCHA
value: "false"
- name: DB_HOST
value: "10.96.0.2"
- name: DB_DATABASE
value: webstack
- name: DB_USERNAME
value: root
- name: DB_PASSWORD
value: root_password
- name: APP_URL
value: "" # 空值明确写为 ""
ports:
- containerPort: 8000
name: webstack
command: ['/entrypoint.sh','serve']

# 暴露webstack端口
---
apiVersion: v1
kind: Service
metadata:
namespace: dev
name: webstack-service
spec:
selector:
app: webstack
ports:
- protocol: TCP
port: 8000
targetPort: 8000
sessionAffinity: ClientIP
type: NodePort # 将服务暴露为 NodePort 类型