以下是基于 多Master高可用Kubernetes集群 的企业级部署详细步骤,涵盖 Nginx Ingress + MySQL高可用集群 + Tomcat负载均衡 的完整流程:


一、前置条件准备

1. 节点规划

  • Master节点:3台(高可用控制平面,需奇数台)

  • Worker节点:至少2台

  • 操作系统:CentOS 7/8 或 Ubuntu 20.04+

  • 网络要求:所有节点间网络互通,禁用防火墙/SELinux

2. 配置主机名及解析

# 所有节点执行
sudo hostnamectl set-hostname master1 # 按实际修改为master1, master2, master3, worker1等
sudo vi /etc/hosts
# 添加以下内容(替换实际IP):
192.168.1.101 master1
192.168.1.102 master2
192.168.1.103 master3
192.168.1.201 worker1
192.168.1.202 worker2

3. 安装依赖工具

# 所有节点执行
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common # Ubuntu
# 或
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # CentOS

二、部署高可用Kubernetes集群

1. 安装Docker

# 所有节点执行
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo systemctl enable docker && sudo systemctl start docker

2. 安装kubeadm/kubelet/kubectl

# 所有节点执行(以Ubuntu为例)
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl

3. 初始化第一个Master节点

# 在master1节点执行
sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=192.168.1.101 # 输出中会包含加入其他Master和Worker的命令,保存备用
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. 加入其他Master节点

# 在master2和master3执行(使用上一步生成的命令,形如):
sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
--token xxxx \
--discovery-token-ca-cert-hash sha256:xxxx \
--control-plane \
--certificate-key xxxx

5. 加入Worker节点

# 在所有Worker节点执行(使用kubeadm init输出的命令):
sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token xxxx --discovery-token-ca-cert-hash sha256:xxxx

6. 安装网络插件(Calico)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

三、配置存储(NFS示例)

1. 部署NFS Server(可选)

# 在存储节点执行(例如192.168.1.250)
sudo apt-get install -y nfs-kernel-server # Ubuntu
sudo mkdir -p /data/nfs
sudo chmod 777 /data/nfs
sudo vi /etc/exports
# 添加:
/data/nfs *(rw,sync,no_root_squash)
sudo exportfs -a
sudo systemctl restart nfs-server

2. 部署NFS StorageClass

# 使用Helm安装NFS Provisioner
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.250 \
--set nfs.path=/data/nfs \
--set storageClass.name=nfs-sc # 验证StorageClass
kubectl get storageclass

四、部署高可用MySQL集群

1. 创建Secret存储密码

kubectl create secret generic mysql-secret \
--from-literal=root_password=yourpassword \
--from-literal=replication_password=replpassword

2. 部署MySQL StatefulSet

# mysql-ha.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root_password
- name: MYSQL_REPLICATION_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: replication_password
args:
- "--server-id=$(expr $RANDOM % 100 + 1)"
- "--gtid-mode=ON"
- "--enforce-gtid-consistency=ON"
- "--log-bin=mysql-bin"
- "--binlog-format=ROW"
- "--relay-log=mysql-relay"
- "--innodb_flush_log_at_trx_commit=1"
- "--sync_binlog=1"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-sc"
resources:
requests:
storage: 20Gi

3. 部署MySQL服务

# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
clusterIP: None
selector:
app: mysql
kubectl apply -f mysql-ha.yaml
kubectl apply -f mysql-service.yaml

五、部署Tomcat应用

1. 创建Tomcat Deployment

# tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-app
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:9.0-jdk17
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
value: "jdbc:mysql://mysql.default.svc.cluster.local:3306/appdb?useSSL=false"
resources:
requests:
cpu: "100m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 20
periodSeconds: 5

2. 创建Service

# tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
selector:
app: tomcat
ports:
- protocol: TCP
port: 80
targetPort: 8080
kubectl apply -f tomcat-deployment.yaml
kubectl apply -f tomcat-service.yaml

六、部署Nginx Ingress Controller

1. 使用Helm安装

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--set controller.replicaCount=3 \
--set controller.service.type=LoadBalancer \
--set controller.service.externalTrafficPolicy=Local \
--set controller.nodeSelector."kubernetes\.io/os"=linux \
--set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."kubernetes\.io/os"=linux

2. 配置Ingress路由规则

# ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat-service
port:
number: 80
kubectl apply -f ingress-rule.yaml

七、验证与维护

1. 查看集群状态

kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get svc,pv,pvc

2. 测试数据库连接

kubectl exec -it mysql-0 -- mysql -uroot -p$(kubectl get secret mysql-secret -o jsonpath='{.data.root_password}' | base64 --decode) -e "CREATE DATABASE appdb;"

3. 访问测试

# 获取Ingress外部IP
kubectl get svc ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}' # 测试访问(替换实际IP)
curl -H "Host: example.com" http://<INGRESS_IP>

4. 配置HPA自动扩缩

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: tomcat-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: tomcat-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80

八、架构示意图

 
用户访问 -> 云厂商LB/Nginx Ingress (外部流量)

K8S Ingress Controller (3副本)

Tomcat Pods (HPA自动扩缩)

MySQL Cluster (3节点StatefulSet)

NFS/Ceph Persistent Volumes

补充建议

  1. 监控:部署Prometheus + Grafana监控集群状态

  2. 日志:使用EFK(Elasticsearch+Fluentd+Kibana)收集日志

  3. 备份:使用Velero定期备份K8S资源

  4. 安全:启用NetworkPolicy限制Pod间通信,使用Cert-Manager管理TLS证书

以上为完整的企业级高可用架构部署流程,需根据实际环境调整IP地址、存储配置和域名信息。

 
 
 
 

K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站的更多相关文章

  1. 美团点评MySQL数据库高可用架构从MMM到MHA+Zebra以及MHA+Proxy的演进

    本文介绍最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望. MMM ...

  2. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  3. Oracle Compute云快速搭建MySQL Keepalived高可用架构

    最近有个客户在测试Oracle Compute云,他们的应用需要使用MySQL数据库,由于是企业级应用一定要考虑高可用架构,因此有需求要在Oracle Compute云上搭建MySQL高可用集群.客户 ...

  4. mysql实现高可用架构之MHA

    一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...

  5. Nginx负载均衡高可用---架构

    1. Nginx负载均衡高可用 首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现w ...

  6. mysql mha高可用架构的安装

    MMM无法全然地保证数据的一致性,所以MMM适用于对数据的一致性要求不是非常高.可是又想最大程度的保证业务可用性的场景对于那些对数据一致性要求非常高的业务,非常不建议採用MMM的这样的高可用性架构.那 ...

  7. Ubuntu编译安装HAprox+Keepalived+MySQL负载高可用架构(结合Docker容器配置)

    系统环境:Ubuntu16.04(Docker容器) 架构环境: Keepalived/HAproxy MASTER: 172.17.0.4 Keepalived/HAproxy BACKUP: 17 ...

  8. centos6.6部署mysql mmm高可用架构

    一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...

  9. Nginx+Keepalived+Tomcat高可用负载均衡,Zookeeper集群配置,Mysql(MariaDB)搭建,Redis安装,FTP配置

    JDK 安装步骤 下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html rpm ...

  10. mysql mmm高可用架构设计

    项目概述:搭建主从,双主,安装Perl模块  安装配置mmm软件  测试 硬件环境:4台虚拟PC 软件环境:rehl6.5 MySQL-5.6.26 percona-xtrabackup-2.3.4 ...

随机推荐

  1. SparkRDD算子初识

    Spark 的核心是建立在统一的抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD)之上的,这使得 Spark 的各个组件可以无缝地进行集成,能够在同一个应用 ...

  2. 面试题30. 包含min函数的栈

    地址:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/ <?php /** 定义栈的数据结构,请在该类型中实现一 ...

  3. 【问题解决】Jenkins使用File的exists()方法判断文件存在,一直提示不存在的问题

    小剧场 最近为了给项目组提供一个能给Java程序替换前端.后端的增量的流水线,继续写上了声明式流水线. 替换增量是根据JSON配置文件去增量目录里去取再替换到对应位置的,替换前需要判断增量文件是否存在 ...

  4. C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  5. Linux 安装配置Anaconda

    下载地址 https://www.anaconda.com/download/success 选择系统版本,复制链接 wget https://repo.anaconda.com/archive/An ...

  6. es6 export和export default的区别

    相同点 export 与 export default 均可用于导出常量.函数.文件.模块 可在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其 ...

  7. Windows 提权-服务_弱服务权限

    本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行 ...

  8. 从零开始:基于 PyTorch 的图像分类模型

    摘要:本文详细记录了使用 PyTorch 从零搭建一个图像分类模型的过程,涵盖卷积神经网络(CNN).数据预处理.模型设计.训练调试与优化.通过对 CIFAR-10 数据集的处理实践,结合经典文献和 ...

  9. delphi 让子窗体显示最大化

    procedure TForm2.FormCreate(Sender: TObject); begin perform(WM_SIZE,SIZE_MAXIMIZED,0); end;

  10. BUUCTF---bbbbbras

    题目 p = 177077389675257695042507998165006460849 n = 3742182950988779627489716224936732940098864714561 ...