以下是基于 多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. [SDOI2015] 序列统计 题解

    乘法并不容易用 FFT 或 NTT 维护,考虑在模意义下化乘为加. 化乘为加主要有两种方法:\(\log\) 和 \(\gamma\)(指标),由于在取模意义下,所以使用后者. 那剩下的部分就是快速幂 ...

  2. 记一次 Mybatis 一级缓存清理无效引起的源码走读

    今天对象在学习 Mybatis 时发现 org.apache.ibatis.session.SqlSession 对象的 clearCache() 方法并不能清理一级缓存, 同一 session 下相 ...

  3. 别再混淆了!JVM内存模型和Java内存模型的本质区别

    JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来 ...

  4. 【Matlab】cell 和cell array

    最近写matlab程序和处理数据,用到了cell 和struct ,简单记录一下. 从cell array 删除cell 用{}不能删除,要用(),赋予[]. >> s.a=1 s = 包 ...

  5. PPT-嵌入字体提示不可嵌入怎么办

    直接将不可嵌入的字体替换为可以嵌入的字体 开始->替换->替换字体

  6. mysql 表的创建,修改,删除

    查看数据库所有表 show tables 创建 create table 表名 ( 列名 类型 约束条件 ... ) 类型有整形: tinyint(1B) ,smallint(2B),mediumin ...

  7. 探秘Transformer系列之(13)--- FFN

    探秘Transformer系列之(13)--- FFN 目录 探秘Transformer系列之(13)--- FFN 0x00 概述 0x01 网络结构 1.1 数学表示 1.2 中间层比率 1.3 ...

  8. Go语言计算字符串长度——len()和RuneCountInString()

    Go 语言的内建函数 len(),可以用来获取切片.字符串.通道(channel)等的长度.下面的代码可以用 len() 来获取字符串的长度. tip1 := "genji is a nin ...

  9. IDA Pro 初步实践

    实践1 背景 某软件A,在非全屏显示时带有常规菜单,在全屏下没有常规菜单,但是有顶部工具条,工具条上有菜单和按钮.对于全屏和非全屏的切换可以通过菜单,也可以通过快捷键ctrl + alt + ente ...

  10. mysql 导出数据的命令

    博客地址:https://www.cnblogs.com/zylyehuo/ # 1.数据库备份与恢复 # mysqldump命令用于备份数据库数据 [root@localhost ~]# mysql ...