k8s部署tomcat

tomcat4.0.yaml 文件用于在 Kubernetes 集群中部署包含 Tomcat 应用和 Nginx 负载均衡器的应用环境,包含以下主要组成部分:

  • 命名空间:创建 fr-server 命名空间,用于资源隔离。
  • Tomcat StatefulSet:部署两个 Tomcat 实例,使用 tomcat:9.0.44 - jdk8 镜像,将物理机 /root/tomcat_server/webroot 目录挂载到容器 /usr/local/tomcat/webapps/fr 目录。同时使用 Pod 反亲和性策略,确保实例分布在不同节点。
  • Tomcat 服务:创建 ClusterIP 类型服务,将集群内部流量转发到 Tomcat Pod 的 8080 端口。
  • Nginx ConfigMap:存储 Nginx 的配置文件,配置 Nginx 将请求代理到 Tomcat 后端服务。
  • Nginx Deployment:部署一个 Nginx 实例,使用 nginx:1.21.6 镜像,将 ConfigMap 中的配置文件挂载到容器内。
  • Nginx 服务:创建 NodePort 类型服务,通过节点的 31437 端口将 Nginx 服务暴露给集群外部。 tomcat4.0.yaml 文件用于在 Kubernetes 集群中部署包含 Tomcat 应用和 Nginx 负载均衡器的应用环境,下面是其主要组成部分的简要介绍:
  • 命名空间:创建 fr-server 命名空间,用于资源隔离。
  • Tomcat StatefulSet:部署两个 Tomcat 实例,使用 tomcat:9.0.44 - jdk8 镜像,将物理机 /root/tomcat_server/webroot 目录挂载到容器 /usr/local/tomcat/webapps/fr 目录。同时使用 Pod 反亲和性策略,确保实例分布在不同节点。
  • Tomcat 服务:创建 ClusterIP 类型服务,将集群内部流量转发到 Tomcat Pod 的 8080 端口。
  • Nginx ConfigMap:存储 Nginx 的配置文件,配置 Nginx 将请求代理到 Tomcat 后端服务。
  • Nginx Deployment:部署一个 Nginx 实例,使用 nginx:1.21.6 镜像,将 ConfigMap 中的配置文件挂载到容器内。
  • Nginx 服务:创建 NodePort 类型服务,通过节点的 31437 端口将 Nginx 服务暴露给集群外部。
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
yum install -y unzip
docker pull nignix
docker pull tomcat:9.0.44-jdk8
docker pull redis

# 进入192.168.200.121
# 将webroot.zip解压到/root/tomcat_server/
unzip /root/webroot.zip -d /root/tomcat_server/

# 进入192.168.200.120
# 通过tomcat4.0.yaml部署
kubectl apply -f /root/tomcat_server/tomcat4.0.yaml

# 验证部署状态
kubectl get namespaces #查看命名空间
kubectl get pods -n fr-server #查看pod状态
kubectl get services -n fr-server #查看服务状态

# 排错相关
# 清除资源重新部署(备用)
kubectl delete -f /root/tomcat_server/tomcat4.0.yaml
kubectl apply -f /root/tomcat_server/tomcat4.0.yaml

# 进入Tomcat容器检查/usr/local/tomcat/webapps/fr目录是否有东西
kubectl exec -it tomcat-statefulset-0 -n fr-server -- ls /usr/local/tomcat/webapps/fr

# 验证负载均衡
# 查看Nginx日志
kubectl logs -n fr-server <nginx-pod-name>
# 预期输出
192.168.1.1 - - [timestamp] "GET /fr/decision HTTP/1.1" 200 ...
192.168.1.1 - - [timestamp] "GET /fr/decision HTTP/1.1" 200 ...
# 分别查看两个Tomcat的访问日志
kubectl logs -n fr-server tomcat-statefulset-0
kubectl logs -n fr-server tomcat-statefulset-1
# 应看到请求被均匀分配

访问tomcat
http://192.168.200.120:31437/fr/decision
http://192.168.200.121:31437/fr/decision
http://192.168.200.122:31437/fr/decision

mysql主从同步

mysql_stat.yaml 文件用于在 Kubernetes 集群中部署一个 MySQL 主从复制集群,包含以下组件:
主节点 (Master):提供数据库读写服务。
从节点 (Slave):实时同步主节点数据(基于 binlog 复制)。
存储:使用本地持久卷(PV/PVC)保存数据。
网络

  • Headless Service:用于集群内部 DNS 发现。
  • NodePort Service:暴露主节点到集群外部(端口 31306)。
    配置管理:通过 ConfigMap 管理 MySQL 配置文件。
    安全:Secret 存储 MySQL root 密码(示例密码为 root)。
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
# 在 k8snode1 创建主节点数据目录
mkdir -p /root/mysql_k8s/master/data
# 在 k8snode2 创建从节点数据目录
mkdir -p /root/mysql_k8s/slave/data

# 在 k8smaster中部署
cd mysql_server
kubectl apply -f mysql_stat.yaml

# 验证资源状态
# 检查命名空间
kubectl get ns mysql-server
# 检查 Pod 状态(等待状态为 Running)
kubectl get pods -n mysql-server
# 检查持久卷和声明
kubectl get pv,pvc -n mysql-server
# 检查服务
kubectl get svc -n mysql-server

# 主从复制验证
# 获取主节点状态(从 `mysql-source` Pod 中获取 binlog 位置):
kubectl exec -it mysql-source-0 -n mysql-server -- mysql -uroot -proot -e "SHOW MASTER STATUS;"
# 在从节点配置复制(替换 <MASTER_LOG_FILE> 和 <MASTER_LOG_POS> 为上条命令的查询结果)
kubectl exec -it mysql-replica-0 -n mysql-server -- mysql -uroot -proot

CHANGE MASTER TO
MASTER_HOST='mysql-source-headless.mysql-server.svc.cluster.local',
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;

# 验证复制状态
kubectl exec -it mysql-replica-0 -n mysql-server -- mysql -uroot -proot -e "SHOW SLAVE STATUS\G"
# 检查关键字段:
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes
# Seconds_Behind_Master: 0

测试数据同步

1
2
3
4
5
6
7
8
9
10
# 在主节点写入数据
kubectl exec -it mysql-source-0 -n mysql-server -- mysql -uroot -proot

CREATE DATABASE test;
USE test;
CREATE TABLE users (id INT, name VARCHAR(20));
INSERT INTO users VALUES (1, 'Tetuka');

# 从节点检查数据
kubectl exec -it mysql-replica-0 -n mysql-server -- mysql -uroot -proot -e "SELECT * FROM test.users;"