K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站

打印 上一主题 下一主题

主题 1891|帖子 1891|积分 5673

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下是基于 多Master高可用Kubernetes集群 的企业级摆设详细步调,涵盖 Nginx Ingress + MySQL高可用集群 + Tomcat负载均衡 的完整流程:
一、前置条件准备

1. 节点规划


  • Master节点:3台(高可用控制平面,需奇数台)
  • Worker节点:至少2台
  • 操作体系:CentOS 7/8 或 Ubuntu 20.04+
  • 网络要求:所有节点间网络互通,禁用防火墙/SELinux
2. 配置主机名及剖析
  1. # 所有节点执行
  2. sudo hostnamectl set-hostname master1  # 按实际修改为master1, master2, master3, worker1等
  3. sudo vi /etc/hosts
  4. # 添加以下内容(替换实际IP):
  5. 192.168.1.101 master1
  6. 192.168.1.102 master2
  7. 192.168.1.103 master3
  8. 192.168.1.201 worker1
  9. 192.168.1.202 worker2
复制代码
3. 安装依赖工具
  1. # 所有节点执行
  2. sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common  # Ubuntu
  3. # 或
  4. sudo yum install -y yum-utils device-mapper-persistent-data lvm2  # CentOS
复制代码
二、摆设高可用Kubernetes集群

1. 安装Docker
  1. # 所有节点执行
  2. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  3. sudo systemctl enable docker && sudo systemctl start docker
复制代码
2. 安装kubeadm/kubelet/kubectl
  1. # 所有节点执行(以Ubuntu为例)
  2. sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
  3. 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
  4. sudo apt-get update
  5. sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
  6. sudo apt-mark hold kubelet kubeadm kubectl
复制代码
3. 初始化第一个Master节点
  1. # 在master1节点执行
  2. sudo kubeadm init \
  3.   --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
  4.   --upload-certs \
  5.   --image-repository registry.aliyuncs.com/google_containers \
  6.   --kubernetes-version v1.28.0 \
  7.   --service-cidr=10.96.0.0/12 \
  8.   --pod-network-cidr=192.168.0.0/16 \
  9.   --apiserver-advertise-address=192.168.1.101
  10. # 输出中会包含加入其他Master和Worker的命令,保存备用
  11. mkdir -p $HOME/.kube
  12. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  13. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码
4. 加入其他Master节点
  1. # 在master2和master3执行(使用上一步生成的命令,形如):
  2. sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
  3.   --token xxxx \
  4.   --discovery-token-ca-cert-hash sha256:xxxx \
  5.   --control-plane \
  6.   --certificate-key xxxx
复制代码
5. 加入Worker节点
  1. # 在所有Worker节点执行(使用kubeadm init输出的命令):
  2. sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token xxxx --discovery-token-ca-cert-hash sha256:xxxx
复制代码
6. 安装网络插件(Calico)
  1. kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
复制代码
三、配置存储(NFS示例)

1. 摆设NFS Server(可选)
  1. # 在存储节点执行(例如192.168.1.250)
  2. sudo apt-get install -y nfs-kernel-server  # Ubuntu
  3. sudo mkdir -p /data/nfs
  4. sudo chmod 777 /data/nfs
  5. sudo vi /etc/exports
  6. # 添加:
  7. /data/nfs *(rw,sync,no_root_squash)
  8. sudo exportfs -a
  9. sudo systemctl restart nfs-server
复制代码
2. 摆设NFS StorageClass
  1. # 使用Helm安装NFS Provisioner
  2. helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
  3. helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  4.   --set nfs.server=192.168.1.250 \
  5.   --set nfs.path=/data/nfs \
  6.   --set storageClass.name=nfs-sc
  7. # 验证StorageClass
  8. kubectl get storageclass
复制代码
四、摆设高可用MySQL集群

1. 创建Secret存储暗码
  1. kubectl create secret generic mysql-secret \
  2.   --from-literal=root_password=yourpassword \
  3.   --from-literal=replication_password=replpassword
复制代码
2. 摆设MySQL StatefulSet
  1. # mysql-ha.yaml
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5.   name: mysql
  6. spec:
  7.   serviceName: mysql
  8.   replicas: 3
  9.   selector:
  10.     matchLabels:
  11.       app: mysql
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: mysql
  16.     spec:
  17.       containers:
  18.       - name: mysql
  19.         image: mysql:8.0
  20.         env:
  21.         - name: MYSQL_ROOT_PASSWORD
  22.           valueFrom:
  23.             secretKeyRef:
  24.               name: mysql-secret
  25.               key: root_password
  26.         - name: MYSQL_REPLICATION_PASSWORD
  27.           valueFrom:
  28.             secretKeyRef:
  29.               name: mysql-secret
  30.               key: replication_password
  31.         args:
  32.         - "--server-id=$(expr $RANDOM % 100 + 1)"
  33.         - "--gtid-mode=ON"
  34.         - "--enforce-gtid-consistency=ON"
  35.         - "--log-bin=mysql-bin"
  36.         - "--binlog-format=ROW"
  37.         - "--relay-log=mysql-relay"
  38.         - "--innodb_flush_log_at_trx_commit=1"
  39.         - "--sync_binlog=1"
  40.         ports:
  41.         - containerPort: 3306
  42.         volumeMounts:
  43.         - name: mysql-data
  44.           mountPath: /var/lib/mysql
  45.   volumeClaimTemplates:
  46.   - metadata:
  47.       name: mysql-data
  48.     spec:
  49.       accessModes: [ "ReadWriteOnce" ]
  50.       storageClassName: "nfs-sc"
  51.       resources:
  52.         requests:
  53.           storage: 20Gi
复制代码
3. 摆设MySQL服务
  1. # mysql-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: mysql
  6. spec:
  7.   ports:
  8.   - port: 3306
  9.   clusterIP: None
  10.   selector:
  11.     app: mysql
复制代码
  1. kubectl apply -f mysql-ha.yaml
  2. kubectl apply -f mysql-service.yaml
复制代码
五、摆设Tomcat应用

1. 创建Tomcat Deployment
  1. # tomcat-deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: tomcat-app
  6. spec:
  7.   replicas: 3
  8.   selector:
  9.     matchLabels:
  10.       app: tomcat
  11.   strategy:
  12.     rollingUpdate:
  13.       maxSurge: 1
  14.       maxUnavailable: 0
  15.   template:
  16.     metadata:
  17.       labels:
  18.         app: tomcat
  19.     spec:
  20.       containers:
  21.       - name: tomcat
  22.         image: tomcat:9.0-jdk17
  23.         ports:
  24.         - containerPort: 8080
  25.         env:
  26.         - name: DATABASE_URL
  27.           value: "jdbc:mysql://mysql.default.svc.cluster.local:3306/appdb?useSSL=false"
  28.         resources:
  29.           requests:
  30.             cpu: "100m"
  31.             memory: "512Mi"
  32.           limits:
  33.             cpu: "500m"
  34.             memory: "1Gi"
  35.         livenessProbe:
  36.           httpGet:
  37.             path: /
  38.             port: 8080
  39.           initialDelaySeconds: 30
  40.           periodSeconds: 10
  41.         readinessProbe:
  42.           httpGet:
  43.             path: /
  44.             port: 8080
  45.           initialDelaySeconds: 20
  46.           periodSeconds: 5
复制代码
2. 创建Service
  1. # tomcat-service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: tomcat-service
  6. spec:
  7.   selector:
  8.     app: tomcat
  9.   ports:
  10.     - protocol: TCP
  11.       port: 80
  12.       targetPort: 8080
复制代码
  1. kubectl apply -f tomcat-deployment.yaml
  2. kubectl apply -f tomcat-service.yaml
复制代码
六、摆设Nginx Ingress Controller

1. 利用Helm安装
  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
  2. helm install ingress-nginx ingress-nginx/ingress-nginx \
  3.   --set controller.replicaCount=3 \
  4.   --set controller.service.type=LoadBalancer \
  5.   --set controller.service.externalTrafficPolicy=Local \
  6.   --set controller.nodeSelector."kubernetes\.io/os"=linux \
  7.   --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
  8.   --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux
复制代码
2. 配置Ingress路由规则
  1. # ingress-rule.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: Ingress
  4. metadata:
  5.   name: web-ingress
  6.   annotations:
  7.     nginx.ingress.kubernetes.io/rewrite-target: /
  8. spec:
  9.   ingressClassName: nginx
  10.   rules:
  11.   - host: example.com
  12.     http:
  13.       paths:
  14.       - path: /
  15.         pathType: Prefix
  16.         backend:
  17.           service:
  18.             name: tomcat-service
  19.             port:
  20.               number: 80
复制代码
  1. kubectl apply -f ingress-rule.yaml
复制代码
七、验证与维护

1. 查看集群状态
  1. kubectl get nodes -o wide
  2. kubectl get pods -A -o wide
  3. kubectl get svc,pv,pvc
复制代码
2. 测试数据库毗连
  1. 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. 访问测试
  1. # 获取Ingress外部IP
  2. kubectl get svc ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
  3. # 测试访问(替换实际IP)
  4. curl -H "Host: example.com" http://<INGRESS_IP>
复制代码
4. 配置HPA主动扩缩
  1. # hpa.yaml
  2. apiVersion: autoscaling/v2
  3. kind: HorizontalPodAutoscaler
  4. metadata:
  5.   name: tomcat-hpa
  6. spec:
  7.   scaleTargetRef:
  8.     apiVersion: apps/v1
  9.     kind: Deployment
  10.     name: tomcat-app
  11.   minReplicas: 2
  12.   maxReplicas: 10
  13.   metrics:
  14.   - type: Resource
  15.     resource:
  16.       name: cpu
  17.       target:
  18.         type: Utilization
  19.         averageUtilization: 80
复制代码
八、架构示意图

 
  1. 用户访问 -> 云厂商LB/Nginx Ingress (外部流量)
  2.         ↓
  3. K8S Ingress Controller (3副本)
  4.        ↓
  5. Tomcat Pods (HPA自动扩缩)
  6.         ↓
  7. MySQL Cluster (3节点StatefulSet)
  8.         ↓
  9. NFS/Ceph Persistent Volumes
复制代码
补充发起


  • 监控:摆设Prometheus + Grafana监控集群状态
  • 日记:利用EFK(Elasticsearch+Fluentd+Kibana)收集日记
  • 备份:利用Velero定期备份K8S资源
  • 安全:启用NetworkPolicy限制Pod间通信,利用Cert-Manager管理TLS证书
以上为完整的企业级高可用架构摆设流程,需根据现实环境调整IP地址、存储配置和域名信息。
    
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

温锦文欧普厨电及净水器总代理

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表