一. wordpress 示例:
- 使用 statefulset 编排运行 mysql,实例数为 1;
#创建mysql secret资源
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# cat 01-secret-mysql.yaml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: null
name: mysql-user-pass
data:
database.name: d3BkYg==
root.password: TUBnZUVkdQ==
user.name: d3B1c2Vy
user.password: bWFnZURVLmMwbQ==
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl apply -f 01-secret-mysql.yaml -n test
secret/mysql-user-pass created
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl get secret -n test
NAME TYPE DATA AGE
mysql-user-pass Opaque 4 8s
#创建mysql pvc资源
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# cat 02-pvc-mysql-data.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data-sts
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: nfs-csi
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl apply -f 02-pvc-mysql-data.yaml -n test
persistentvolumeclaim/mysql-data-sts created
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl get pvc -n test
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-data-sts Bound pvc-e33b1096-8d90-498f-9e40-c680be27f471 3Gi RWO nfs-csi 11s
#创建StatefulSet 的mysql资源
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# cat 04-deploy-mysql.yaml
---
apiVersion: v1
kind: Service
metadata:
name: mysql-sts
labels:
app: mysql-sts
spec:
clusterIP: None
ports:
- port: 3306
selector:
app: mysql-sts
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-sts
spec:
replicas: 1
selector:
matchLabels:
app: mysql-sts
serviceName: "mysql-sts"
template:
metadata:
labels:
app: mysql-sts
spec:
containers:
- image: mysql:8.0
name: mysql-sts
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: root.password
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.name
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.password
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: database.name
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql/
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-data-sts
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl apply -f 04-deploy-mysql.yaml -n test
service/mysql-sts created
deployment.apps/mysql-sts created
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl get svc -n test
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-sts ClusterIP None <none> 3306/TCP 14s
root@k8s-master01:~/learning-k8s/wordpress/mysql/mysql-sts# kubectl get pods -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-sts-0 1/1 Running 0 66s 10.244.2.196 k8s-node02 <none> <none>
#登录mysql pod验证,正常访问
root@k8s-node02:~# docker exec -it 0d2bc43029a1 /bin/sh
sh-4.4# env
MYSQL_PASSWORD=mageDU.c0m
HOSTNAME=mysql-sts-0
MYSQL_DATABASE=wpdb
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYSQL_ROOT_PASSWORD=M@geEdu
KUBERNETES_PORT=tcp://10.96.0.1:443
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.16
MYSQL_USER=wpuser
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
MYSQL_VERSION=8.0.32-1.el8
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
TERM=xterm
SHLVL=1
KUBERNETES_SERVICE_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST=10.96.0.1
MYSQL_SHELL_VERSION=8.0.32-1.el8
_=/usr/bin/env
sh-4.4# mysql -uwpuser -pmageDU.c0m
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| wpdb |
+--------------------+
3 rows in set (0.02 sec)
mysql>
- 换成使用 Operator 编排运行 mysql,实例数为 1+;
root@k8s-master01:~# kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml
customresourcedefinition.apiextensions.k8s.io/innodbclusters.mysql.oracle.com created
customresourcedefinition.apiextensions.k8s.io/mysqlbackups.mysql.oracle.com created
customresourcedefinition.apiextensions.k8s.io/clusterkopfpeerings.zalando.org created
customresourcedefinition.apiextensions.k8s.io/kopfpeerings.zalando.org created
root@k8s-master01:~# kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml
clusterrole.rbac.authorization.k8s.io/mysql-operator created
clusterrole.rbac.authorization.k8s.io/mysql-sidecar created
clusterrolebinding.rbac.authorization.k8s.io/mysql-operator-rolebinding created
clusterkopfpeering.zalando.org/mysql-operator created
namespace/mysql-operator created
serviceaccount/mysql-operator-sa created
deployment.apps/mysql-operator created
root@k8s-master01:~# kubectl get deployment -n mysql-operator mysql-operator
NAME READY UP-TO-DATE AVAILABLE AGE
mysql-operator 0/1 1 0 35s
root@k8s-master01:~# kubectl get pods -n mysql-operator
NAME READY STATUS RESTARTS AGE
mysql-operator-9897675fc-t5szv 1/1 Running 0 2m41s
root@k8s-master01:~# kubectl get pods -n mysql-operator -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-operator-9897675fc-t5szv 1/1 Running 0 2m52s 10.244.3.129 k8s-node03 <none> <none>
root@k8s-master01:~#
sh-4.4$ env
HOSTNAME=mysql-operator-9897675fc-t5szv
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
PWD=/
HOME=/mysqlsh
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
MYSQLSH_USER_CONFIG_HOME=/mysqlsh
TERM=xterm
SHLVL=1
KUBERNETES_SERVICE_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST=10.96.0.1
_=/usr/bin/env
- 将 mysql 以传统模型的主从复制的形式运行于 Kubernetes 外部,让运行在 Kubernetes 集群上的 wordpress 去访问外部的 MySQL 服务。
#在node2,node3上安装主从mysql
node2:192.168.6.102
node3:192.168.6.103
#操作命令需要在每个节点执行,这里只展示一个节点
#下载yaml源配置包
root@k8s-node03:~# wget https://repo.mysql.com//mysql-apt-config_0.8.24-1_all.deb
--2023-03-02 21:13:14-- https://repo.mysql.com//mysql-apt-config_0.8.24-1_all.deb
Resolving repo.mysql.com (repo.mysql.com)... 23.45.53.26
Connecting to repo.mysql.com (repo.mysql.com)|23.45.53.26|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18048 (18K) [application/x-debian-package]
Saving to: ‘mysql-apt-config_0.8.24-1_all.deb’
mysql-apt-config_0.8.24-1_all.deb 100%[=======================================================================================>] 17.62K --.-KB/s in 0s
2023-03-02 21:13:27 (202 MB/s) - ‘mysql-apt-config_0.8.24-1_all.deb’ saved [18048/18048]
#安装yaml源配置包
root@k8s-node03:~# dpkg -i mysql-apt-config_0.8.24-1_all.deb
Selecting previously unselected package mysql-apt-config.
(Reading database ... 109162 files and directories currently installed.)
Preparing to unpack mysql-apt-config_0.8.24-1_all.deb ...
Unpacking mysql-apt-config (0.8.24-1) ...
Setting up mysql-apt-config (0.8.24-1) ...
Warning: apt-key should not be used in scripts (called from postinst maintainerscript of the package mysql-apt-config)
OK
root@k8s-node03:~# apt update
Hit:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal InRelease
Hit:2 https://mirrors.aliyun.com/ubuntu focal InRelease
Hit:3 https://mirrors.aliyun.com/ubuntu focal-security InRelease
Get:4 http://repo.mysql.com/apt/ubuntu focal InRelease [12.9 kB]
Hit:5 https://mirrors.aliyun.com/ubuntu focal-updates InRelease
Hit:6 https://mirrors.aliyun.com/ubuntu focal-backports InRelease
Hit:7 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease
Get:8 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 Sources [963 B]
Get:9 http://repo.mysql.com/apt/ubuntu focal/mysql-apt-config amd64 Packages [565 B]
Get:10 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 Packages [8,530 B]
Get:11 http://repo.mysql.com/apt/ubuntu focal/mysql-tools amd64 Packages [6,193 B]
Fetched 29.1 kB in 3s (11.6 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
42 packages can be upgraded. Run 'apt list --upgradable' to see them.
#安装mysql server
root@k8s-node03:~# apt install mysql-server -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libmecab2 mecab-ipadic mecab-ipadic-utf8 mecab-utils mysql-client mysql-common mysql-community-client mysql-community-client-core mysql-community-client-plugins
mysql-community-server mysql-community-server-core
The following NEW packages will be installed:
libmecab2 mecab-ipadic mecab-ipadic-utf8 mecab-utils mysql-client mysql-common mysql-community-client mysql-community-client-core mysql-community-client-plugins
mysql-community-server mysql-community-server-core mysql-server
0 upgraded, 12 newly installed, 0 to remove and 42 not upgraded.
Need to get 42.9 MB of archives.
After this operation, 359 MB of additional disk space will be used.
Get:1 https://mirrors.aliyun.com/ubuntu focal/main amd64 libmecab2 amd64 0.996-10build1 [233 kB]
Get:2 https://mirrors.aliyun.com/ubuntu focal/main amd64 mecab-utils amd64 0.996-10build1 [4,912 B]
Get:3 https://mirrors.aliyun.com/ubuntu focal/main amd64 mecab-ipadic all 2.7.0-20070801+main-2.1 [6,714 kB]
Get:4 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-common amd64 8.0.32-1ubuntu20.04 [69.3 kB]
Get:5 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-community-client-plugins amd64 8.0.32-1ubuntu20.04 [1,275 kB]
Get:6 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-community-client-core amd64 8.0.32-1ubuntu20.04 [1,906 kB]
Get:7 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-community-client amd64 8.0.32-1ubuntu20.04 [3,496 kB]
Get:8 https://mirrors.aliyun.com/ubuntu focal/main amd64 mecab-ipadic-utf8 all 2.7.0-20070801+main-2.1 [4,380 B]
Get:9 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-client amd64 8.0.32-1ubuntu20.04 [68.1 kB]
Get:10 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-community-server-core amd64 8.0.32-1ubuntu20.04 [29.0 MB]
Get:11 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-community-server amd64 8.0.32-1ubuntu20.04 [79.1 kB]
Get:12 http://repo.mysql.com/apt/ubuntu focal/mysql-8.0 amd64 mysql-server amd64 8.0.32-1ubuntu20.04 [68.0 kB]
Fetched 42.9 MB in 20s (2,138 kB/s)
Preconfiguring packages ...
Selecting previously unselected package mysql-common.
(Reading database ... 109167 files and directories currently installed.)
Preparing to unpack .../00-mysql-common_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-common (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mysql-community-client-plugins.
Preparing to unpack .../01-mysql-community-client-plugins_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-community-client-plugins (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mysql-community-client-core.
Preparing to unpack .../02-mysql-community-client-core_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-community-client-core (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mysql-community-client.
Preparing to unpack .../03-mysql-community-client_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-community-client (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mysql-client.
Preparing to unpack .../04-mysql-client_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-client (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package libmecab2:amd64.
Preparing to unpack .../05-libmecab2_0.996-10build1_amd64.deb ...
Unpacking libmecab2:amd64 (0.996-10build1) ...
Selecting previously unselected package mysql-community-server-core.
Preparing to unpack .../06-mysql-community-server-core_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-community-server-core (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mysql-community-server.
Preparing to unpack .../07-mysql-community-server_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-community-server (8.0.32-1ubuntu20.04) ...
Selecting previously unselected package mecab-utils.
Preparing to unpack .../08-mecab-utils_0.996-10build1_amd64.deb ...
Unpacking mecab-utils (0.996-10build1) ...
Selecting previously unselected package mecab-ipadic.
Preparing to unpack .../09-mecab-ipadic_2.7.0-20070801+main-2.1_all.deb ...
Unpacking mecab-ipadic (2.7.0-20070801+main-2.1) ...
Selecting previously unselected package mecab-ipadic-utf8.
Preparing to unpack .../10-mecab-ipadic-utf8_2.7.0-20070801+main-2.1_all.deb ...
Unpacking mecab-ipadic-utf8 (2.7.0-20070801+main-2.1) ...
Selecting previously unselected package mysql-server.
Preparing to unpack .../11-mysql-server_8.0.32-1ubuntu20.04_amd64.deb ...
Unpacking mysql-server (8.0.32-1ubuntu20.04) ...
Setting up libmecab2:amd64 (0.996-10build1) ...
Setting up mysql-common (8.0.32-1ubuntu20.04) ...
update-alternatives: using /etc/mysql/my.cnf.fallback to provide /etc/mysql/my.cnf (my.cnf) in auto mode
Setting up mysql-community-server-core (8.0.32-1ubuntu20.04) ...
Setting up mecab-utils (0.996-10build1) ...
Setting up mysql-community-client-plugins (8.0.32-1ubuntu20.04) ...
Setting up mecab-ipadic (2.7.0-20070801+main-2.1) ...
Compiling IPA dictionary for Mecab. This takes long time...
reading /usr/share/mecab/dic/ipadic/unk.def ... 40
emitting double-array: 100% |###########################################|
/usr/share/mecab/dic/ipadic/model.def is not found. skipped.
reading /usr/share/mecab/dic/ipadic/Adnominal.csv ... 135
reading /usr/share/mecab/dic/ipadic/Postp.csv ... 146
reading /usr/share/mecab/dic/ipadic/Others.csv ... 2
reading /usr/share/mecab/dic/ipadic/Noun.proper.csv ... 27328
reading /usr/share/mecab/dic/ipadic/Noun.others.csv ... 151
reading /usr/share/mecab/dic/ipadic/Suffix.csv ... 1393
reading /usr/share/mecab/dic/ipadic/Noun.name.csv ... 34202
reading /usr/share/mecab/dic/ipadic/Noun.adverbal.csv ... 795
reading /usr/share/mecab/dic/ipadic/Symbol.csv ... 208
reading /usr/share/mecab/dic/ipadic/Postp-col.csv ... 91
reading /usr/share/mecab/dic/ipadic/Auxil.csv ... 199
reading /usr/share/mecab/dic/ipadic/Noun.demonst.csv ... 120
reading /usr/share/mecab/dic/ipadic/Adj.csv ... 27210
reading /usr/share/mecab/dic/ipadic/Noun.adjv.csv ... 3328
reading /usr/share/mecab/dic/ipadic/Prefix.csv ... 221
reading /usr/share/mecab/dic/ipadic/Conjunction.csv ... 171
reading /usr/share/mecab/dic/ipadic/Noun.place.csv ... 72999
reading /usr/share/mecab/dic/ipadic/Adverb.csv ... 3032
reading /usr/share/mecab/dic/ipadic/Noun.csv ... 60477
reading /usr/share/mecab/dic/ipadic/Verb.csv ... 130750
reading /usr/share/mecab/dic/ipadic/Filler.csv ... 19
reading /usr/share/mecab/dic/ipadic/Noun.verbal.csv ... 12146
reading /usr/share/mecab/dic/ipadic/Noun.number.csv ... 42
reading /usr/share/mecab/dic/ipadic/Interjection.csv ... 252
reading /usr/share/mecab/dic/ipadic/Noun.nai.csv ... 42
reading /usr/share/mecab/dic/ipadic/Noun.org.csv ... 16668
emitting double-array: 100% |###########################################|
reading /usr/share/mecab/dic/ipadic/matrix.def ... 1316x1316
emitting matrix : 100% |###########################################|
done!
update-alternatives: using /var/lib/mecab/dic/ipadic to provide /var/lib/mecab/dic/debian (mecab-dictionary) in auto mode
Setting up mysql-community-client-core (8.0.32-1ubuntu20.04) ...
Setting up mecab-ipadic-utf8 (2.7.0-20070801+main-2.1) ...
Compiling IPA dictionary for Mecab. This takes long time...
reading /usr/share/mecab/dic/ipadic/unk.def ... 40
emitting double-array: 100% |###########################################|
/usr/share/mecab/dic/ipadic/model.def is not found. skipped.
reading /usr/share/mecab/dic/ipadic/Adnominal.csv ... 135
reading /usr/share/mecab/dic/ipadic/Postp.csv ... 146
reading /usr/share/mecab/dic/ipadic/Others.csv ... 2
reading /usr/share/mecab/dic/ipadic/Noun.proper.csv ... 27328
reading /usr/share/mecab/dic/ipadic/Noun.others.csv ... 151
reading /usr/share/mecab/dic/ipadic/Suffix.csv ... 1393
reading /usr/share/mecab/dic/ipadic/Noun.name.csv ... 34202
reading /usr/share/mecab/dic/ipadic/Noun.adverbal.csv ... 795
reading /usr/share/mecab/dic/ipadic/Symbol.csv ... 208
reading /usr/share/mecab/dic/ipadic/Postp-col.csv ... 91
reading /usr/share/mecab/dic/ipadic/Auxil.csv ... 199
reading /usr/share/mecab/dic/ipadic/Noun.demonst.csv ... 120
reading /usr/share/mecab/dic/ipadic/Adj.csv ... 27210
reading /usr/share/mecab/dic/ipadic/Noun.adjv.csv ... 3328
reading /usr/share/mecab/dic/ipadic/Prefix.csv ... 221
reading /usr/share/mecab/dic/ipadic/Conjunction.csv ... 171
reading /usr/share/mecab/dic/ipadic/Noun.place.csv ... 72999
reading /usr/share/mecab/dic/ipadic/Adverb.csv ... 3032
reading /usr/share/mecab/dic/ipadic/Noun.csv ... 60477
reading /usr/share/mecab/dic/ipadic/Verb.csv ... 130750
reading /usr/share/mecab/dic/ipadic/Filler.csv ... 19
reading /usr/share/mecab/dic/ipadic/Noun.verbal.csv ... 12146
reading /usr/share/mecab/dic/ipadic/Noun.number.csv ... 42
reading /usr/share/mecab/dic/ipadic/Interjection.csv ... 252
reading /usr/share/mecab/dic/ipadic/Noun.nai.csv ... 42
reading /usr/share/mecab/dic/ipadic/Noun.org.csv ... 16668
emitting double-array: 100% |###########################################|
reading /usr/share/mecab/dic/ipadic/matrix.def ... 1316x1316
emitting matrix : 100% |###########################################|
done!
update-alternatives: using /var/lib/mecab/dic/ipadic-utf8 to provide /var/lib/mecab/dic/debian (mecab-dictionary) in auto mode
Setting up mysql-community-client (8.0.32-1ubuntu20.04) ...
Setting up mysql-client (8.0.32-1ubuntu20.04) ...
Setting up mysql-community-server (8.0.32-1ubuntu20.04) ...
update-alternatives: using /etc/mysql/mysql.cnf to provide /etc/mysql/my.cnf (my.cnf) in auto mode
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.
Setting up mysql-server (8.0.32-1ubuntu20.04) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
#配置mysql主从集群
#配置主数据库服务器
root@mysql-node2:~# vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
tmpdir = /tmp
binlog_format = ROW
max_binlog_size = 800M
sync_binlog = 1
expire-logs-days = 5
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/mysqld-slow.log
#重启主节点mysql
root@mysql-node2:~# systemctl restart mysql
#查看mysql状态
root@mysql-node2:~# systemctl status mysql
#主节点创建同步账号
root@mysql-node2:~# mysql -uroot -p123456
mysql> CREATE USER rsync@'%' IDENTIFIED BY 'rsync@2023';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE on *.* to rsync@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW GRANTS FOR rsync@'%';
+-----------------------------------------------+
| Grants for rsync@% |
+-----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `rsync`@`%` |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
#配置从数据库节点
root@mysql-node3:~# vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
log_bin = /var/log/mysql/mysql-bin.log
server-id = 2
read_only = 1
tmpdir = /tmp
binlog_format = ROW
max_binlog_size = 800M
sync_binlog = 1
expire-logs-days = 5
slow_query_log = 2
#重启从节点mysql
root@mysql-node3:~# systemctl restart mysql
#查看mysql状态
root@mysql-node3:~# systemctl status mysql
#查看主服务器状态,binlog和position,后面创建主从需要使用
root@mysql-node2:~# mysql -uroot -pygc@2023
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: binlog.000005
Position: 712
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#从服务器连接主服务器
root@mysql-node3:~# mysql -uroot -p123456
#停止从属线程
mysql> STOP SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#设置从服务器以复制主服务器
mysql> CHANGE MASTER TO MASTER_HOST='192.168.6.102', MASTER_USER='rsync', MASTER_PASSWORD='rsync@2023', MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=712,get_master_publiic_key=1;
Query OK, 0 rows affected, 9 warnings (0.03 sec)
#现在激活从服务器
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
#查询验证从服务器状态,Slave_IO_Running 和Slave_SQL_Running 两个进程都是yes状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.6.102
Master_User: rsync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000005
Read_Master_Log_Pos: 712
Relay_Log_File: k8s-node03-relay-bin.000002
Relay_Log_Pos: 323
Relay_Master_Log_File: binlog.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 712
Relay_Log_Space: 538
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: b92450e1-b6ac-11ed-b1e9-000c2937c613
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 1
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified
#主服务器上创建wordpress数据库
mysql> create database wordpress;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+
5 rows in set (0.01 sec)
#查看从服务器数据库
root@mysql-node3:~# mysql -uroot -p123456
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
#创建wordpress 数据库和账号
root@mysql-node2:~# mysql -uroot -p123456
mysql> create user 'wordpress'@'%' identified with mysql_native_password BY 'Wordpress@2023';
Query OK, 0 rows affected (0.02 sec)
mysql> grant all privileges on wordpress.* to 'wordpress'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
#修改mysql secret配置文件,把创建的dbname,user等以base64格式编码写入
root@k8s-master01:~/learning-k8s/wordpress/mysql# cat 01-secret-mysql.yaml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: null
name: mysql-user-pass
data:
database.name: d29yZHByZXNz
root.password: 4oCcMTIzNDU24oCd
user.name: d29yZHByZXNz
user.password: V29yZHByZXNzQDIwMjM=
#编辑mysql service 资源编排文件
root@k8s-master1:~/learning-k8s/wordpress/mysql# vi 03-service-mysql.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
subsets:
- addresses:
- ip: 192.168.6.102
ports:
- name: mysql
port: 3306
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
type: ClusterIP
#应用yaml文件
root@k8s-master1:~/learning-k8s/wordpress/mysql# kubectl apply -f 03-service-mysql.yaml -n ns-job
#查看创建的资源
root@k8s-master01:~/learning-k8s/wordpress/mysql# kubectl get svc,ep -n ns-job
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.107.119.111 <none> 3306/TCP 33s
NAME ENDPOINTS AGE
endpoints/mysql 192.168.6.102:3306 33s
#修改nginx service yaml文件,注意使用externalIPs:
root@k8s-master1:~/learning-k8s/wordpress# vi nginx/02-service-nginx.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- name: http-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
externalIPs:
- 192.168.6.100
#部署nginx
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl apply -f . -n ns-job
service/wordpress created
persistentvolumeclaim/wordpress-app-data created
deployment.apps/wordpress created
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl get svc,pvc,deployment -n ns-job
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.107.119.111 <none> 3306/TCP 2m17s
service/wordpress ClusterIP 10.111.224.30 <none> 9000/TCP 36s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/wordpress-app-data Bound pvc-0bd5d474-6ad2-4629-8a62-9b85044f2f79 10Gi RWX nfs-csi 36s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 1/3 3 1 36s
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl get svc,pvc,pods -n ns-job
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.107.119.111 <none> 3306/TCP 2m34s
service/wordpress ClusterIP 10.111.224.30 <none> 9000/TCP 53s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/wordpress-app-data Bound pvc-0bd5d474-6ad2-4629-8a62-9b85044f2f79 10Gi RWX nfs-csi 53s
NAME READY STATUS RESTARTS AGE
pod/wordpress-664cfb496b-rnv48 0/1 ContainerCreating 0 53s
pod/wordpress-664cfb496b-srlm7 0/1 ContainerCreating 0 53s
pod/wordpress-664cfb496b-xrhtd 1/1 Running 0 53s
root@k8s-master01:~/learning-k8s/wordpress/wordpress#
#验证和访问wordpress,正常
二. wordpress 实例扩展至多个,测试应用是否工作正常。
#wordpress deployment的yaml文件
root@k8s-master01:~/learning-k8s/wordpress/wordpress# cat 03-deployment-wordpress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wordpress
name: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:5.8-fpm
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.name
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.password
- name: WORDPRESS_DB_NAME
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: database.name
volumeMounts:
- name: wordpress-app-data
mountPath: /var/www/html/
volumes:
- name: wordpress-app-data
persistentVolumeClaim:
claimName: wordpress-app-data
#创建wordpress deployment资源
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl apply -f . -n blog
service/wordpress created
persistentvolumeclaim/wordpress-app-data created
deployment.apps/wordpress created
#查看wordpress pods信息
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl get pods -n blog
NAME READY STATUS RESTARTS AGE
mysql-97b69dcc8-trb2q 1/1 Running 0 2m51s
nginx-5b9c7b4c8f-xdg9s 1/1 Running 0 119s
wordpress-664cfb496b-ghbkj 1/1 Running 0 97s
wordpress-664cfb496b-ksx7x 1/1 Running 0 97s
wordpress-664cfb496b-w4pm7 1/1 Running 0 97s
#登录svc 地址,验证wordpress服务,正常。
三. Nginx 实例扩展至多个,测试应用是否工作正常;额外为 nginx 添加 https 虚拟主机。
#mysql cm,pvc,svc yaml同上面保持不变
root@k8s-master01:~/learning-k8s/wordpress/mysql# cat 01-secret-mysql.yaml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: null
name: mysql-user-pass
data:
database.name: d29yZHByZXNz
root.password: 4oCcMTIzNDU24oCd
user.name: d29yZHByZXNz
user.password: V29yZHByZXNzQDIwMjM=
root@k8s-master01:~/learning-k8s/wordpress/mysql# cat 02-pvc-mysql-data.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
root@k8s-master01:~/learning-k8s/wordpress/mysql# cat 03-service-mysql.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
subsets:
- addresses:
- ip: 192.168.6.102
ports:
- name: mysql
port: 3306
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql
spec:
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
type: ClusterIP
#kubectl apply应用上面三个资源
root@k8s-master01:~/learning-k8s/wordpress/mysql# kubectl apply -f 01-service-mysql.yaml -n test
root@k8s-master01:~/learning-k8s/wordpress/mysql# kubectl apply -f 02-pvc-mysql-data.yaml -n test
root@k8s-master01:~/learning-k8s/wordpress/mysql# kubectl apply -f 03-service-mysql.yaml -n test
#生成IP 自签名证书
root@k8s-master1:~# mkdir ssl
root@k8s-master1:~# cd ssl/
root@k8s-master1:~/ssl# openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout file.key \
-new \
-out file.crt \
-subj /CN=Hostname \
-reqexts SAN \
-extensions SAN \
-config <(cat /etc/ssl/openssl.cnf \
<(printf '[SAN]\nsubjectAltName=DNS:hostname,IP:192.168.6.100')) \
-sha256 \
-days 3650
#创建secret
root@k8s-master1:~/ssl# k create secret tls wordpress-ssl --key file.key --cert file.crt
secret/wordpress-ssl created
#修改nginx configmap资源编排文件
root@k8s-master1:~/learning-k8s/wordpress# cd nginx/
root@k8s-master1:~/learning-k8s/wordpress/nginx# vi 01-configmap-nginx-conf.yaml
apiVersion: v1
data:
nginx.conf: |
server {
listen 80;
listen 443 ssl;
server_name 192.168.6.100;
ssl_certificate /etc/ssl/tls.crt;
ssl_certificate_key /etc/ssl/tls.key;
index index.php index.html index.htm;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off; access_log off;
}
location = /robots.txt {
log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
kind: ConfigMap
metadata:
creationTimestamp: null
name: nginx-conf
#修改nginx service资源编排文件
root@k8s-master1:~/learning-k8s/wordpress/nginx# vi 02-service-nginx.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
spec:
ports:
- name: http-80
port: 80
protocol: TCP
targetPort: 80
- name: https-443
port: 443
protocol: TCP
targetPort: 443
selector:
app: nginx
type: NodePort
externalIPs:
- 192.168.6.100
#修改nginx deployment资源编排文件
root@k8s-master1:~/learning-k8s/wordpress/nginx# vi 03-deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 5
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: ngxconf
configMap:
name: nginx-conf
- name: wordpress-app-data
persistentVolumeClaim:
claimName: wordpress-app-data
- name: wordpress-ssl
secret:
secretName: wordpress-ssl
containers:
- image: nginx:1.20-alpine
name: nginx
volumeMounts:
- name: ngxconf
mountPath: /etc/nginx/conf.d/
- name: wordpress-app-data
mountPath: /var/www/html/
- name: wordpress-ssl
mountPath: /etc/ssl/
readOnly: true
#应用nginx 资源编排文件
root@k8s-master1:~/learning-k8s/wordpress# kubectl apply -f nginx/ -n test
configmap/nginx-conf configured
service/nginx configured
deployment.apps/nginx configured
#wordpress svc,pvc,deployment资源yaml文件
root@k8s-master01:~/learning-k8s/wordpress/wordpress# cat 01-service-wordpress.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
ports:
- name: fpm
port: 9000
protocol: TCP
targetPort: 9000
selector:
app: wordpress
root@k8s-master01:~/learning-k8s/wordpress/wordpress# cat 02-pvc-wordpress-app-data.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-app-data
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
root@k8s-master01:~/learning-k8s/wordpress/wordpress# cat 03-deployment-wordpress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wordpress
name: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:5.8-fpm
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.name
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: user.password
- name: WORDPRESS_DB_NAME
valueFrom:
secretKeyRef:
name: mysql-user-pass
key: database.name
volumeMounts:
- name: wordpress-app-data
mountPath: /var/www/html/
volumes:
- name: wordpress-app-data
persistentVolumeClaim:
claimName: wordpress-app-data
#应用wordpress svc,pvc,deployment yaml文件,生成资源
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl apply -f 01-service-wordpress.yaml -n test
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl apply -f 02-pvc-wordpress-app-data.yaml -n test
root@k8s-master01:~/learning-k8s/wordpress/wordpress# kubectl apply -f 03-deployment-wordpress.yaml -n test
#查看资源状态
root@k8s-master01:~/learning-k8s/wordpress/mysql# kubectl get pods,svc,pvc,cm,secret -n test
NAME READY STATUS RESTARTS AGE
pod/mysql-sts-0 0/1 ContainerCreating 0 3h55m
pod/nginx-5fb8fbcdf5-h9tgw 1/1 Running 0 50m
pod/nginx-5fb8fbcdf5-lcz6q 1/1 Running 0 51m
pod/nginx-5fb8fbcdf5-nfvgk 1/1 Running 0 45m
pod/nginx-5fb8fbcdf5-qbkm8 1/1 Running 0 51m
pod/nginx-5fb8fbcdf5-rqb4k 1/1 Running 0 49m
pod/nginx-5fb8fbcdf5-vtnsc 0/1 ContainerStatusUnknown 1 51m
pod/wordpress-664cfb496b-675zs 1/1 Running 0 64m
pod/wordpress-664cfb496b-bjll5 1/1 Running 0 66m
pod/wordpress-664cfb496b-xxjdj 1/1 Running 0 66m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql ClusterIP 10.111.9.100 <none> 3306/TCP 68m
service/mysql-sts ClusterIP None <none> 3306/TCP 7d22h
service/nginx NodePort 10.105.27.151 192.168.6.100 80:32666/TCP 3d
service/wordpress ClusterIP 10.108.39.245 <none> 9000/TCP 120m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-data Bound pvc-0291573d-ea9e-4775-b462-453519a8182d 10Gi RWO nfs-csi 68m
persistentvolumeclaim/mysql-data-sts Bound pvc-e33b1096-8d90-498f-9e40-c680be27f471 3Gi RWO nfs-csi 7d23h
persistentvolumeclaim/wordpress-app-data Bound pvc-f1b1f0f7-5183-463b-b536-0b900470b78b 10Gi RWX nfs-csi 120m
NAME DATA AGE
configmap/kube-root-ca.crt 1 7d23h
configmap/nginx-conf 1 73m
NAME TYPE DATA AGE
secret/mysql-user-pass Opaque 4 7d23h
secret/wordpress-ssl kubernetes.io/tls 2 79m
#访问wordpress服务,验证服务