Hugo博客迁移到阿里云ACK Kubernetes集群完整方案

方案概述 本文档提供Hugo博客从传统服务器部署迁移到阿里云ACK Kubernetes集群的完整技术方案,包括容器化、K8s资源配置、CI/CD流程改造和实战部署步骤。 架构对比 当前架构(传统部署): 本地开发 → Git推送 → GitHub Actions构建 → rsync同步 → Nginx服务器 → 用户访问 目标架构(K8s部署): 本地开发 → Git推送 → GitHub Actions构建 → Docker镜像 → 阿里云ACR → K8s集群 → Ingress → 用户访问 核心变化 维度 传统部署 K8s部署 部署方式 SSH + rsync kubectl apply 运行环境 直接在服务器 Docker容器 负载均衡 单机Nginx K8s Service + Ingress 扩展性 手动扩容 自动扩缩容 更新策略 直接覆盖 滚动更新 回滚 手动恢复 kubectl rollout undo 成本 ¥0/月 ¥200-500/月 一、容器化方案 1.1 Dockerfile设计(多阶段构建) 创建 docker/Dockerfile: ...

2026-01-29 · maneng

RocketMQ云原生01:Kubernetes 部署实践 - 拥抱容器化时代

引言:云原生时代的 RocketMQ 传统物理机部署,扩容一台 Broker 需要 2 天:申请机器 → 装系统 → 装软件 → 配置 → 测试… Kubernetes 部署,扩容只需 30 秒:kubectl scale statefulset broker --replicas=5 云原生的优势: ✅ 秒级弹性伸缩 ✅ 自动故障恢复 ✅ 统一资源管理 ✅ 声明式配置 本文目标: 理解 RocketMQ 在 K8s 上的架构 掌握 StatefulSet 部署方法 实现持久化存储 配置服务发现和负载均衡 一、架构设计 1.1 K8s 部署架构 ┌─────────────────────────────────────────────────────┐ │ Kubernetes 集群 │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Namespace: rocketmq │ │ │ │ │ │ │ │ ┌────────────────────────────────────┐ │ │ │ │ │ StatefulSet: rocketmq-nameserver │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ │ │ ns-0 │ │ ns-1 │ │ │ │ │ │ │ └─────────┘ └─────────┘ │ │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌────────────────────────────────────┐ │ │ │ │ │ StatefulSet: rocketmq-broker │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ │ │ │ │ broker-0 │ │ broker-1 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌─PVC─┐ │ │ ┌─PVC─┐ │ │ │ │ │ │ │ │ │ 50Gi│ │ │ │ 50Gi│ │ │ │ │ │ │ │ └──┴─────┴─┘ └──┴─────┴─┘ │ │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────────────┐ │ │ │ │ │ Service: nameserver-svc │ │ │ │ │ │ ClusterIP / Headless │ │ │ │ │ └──────────────────────────┘ │ │ │ └─────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘ 二、部署准备 2.1 创建命名空间 # namespace.yaml apiVersion: v1 kind: Namespace metadata: name: rocketmq kubectl apply -f namespace.yaml 2.2 创建 ConfigMap # configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: rocketmq-broker-config namespace: rocketmq data: broker.conf: | brokerClusterName=DefaultCluster brokerName=broker-{{ .Ordinal }} brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH # 存储路径 storePathRootDir=/home/rocketmq/store storePathCommitLog=/home/rocketmq/store/commitlog # 网络配置 brokerIP1={{ .PodIP }} listenPort=10911 # NameServer 地址 namesrvAddr=rocketmq-nameserver-0.rocketmq-nameserver.rocketmq.svc.cluster.local:9876;rocketmq-nameserver-1.rocketmq-nameserver.rocketmq.svc.cluster.local:9876 kubectl apply -f configmap.yaml 三、NameServer 部署 3.1 StatefulSet 配置 # nameserver-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: rocketmq-nameserver namespace: rocketmq spec: serviceName: rocketmq-nameserver replicas: 2 selector: matchLabels: app: rocketmq-nameserver template: metadata: labels: app: rocketmq-nameserver spec: containers: - name: nameserver image: apache/rocketmq:5.0.0 imagePullPolicy: IfNotPresent command: - sh - mqnamesrv ports: - containerPort: 9876 name: nameserver env: - name: JAVA_OPT_EXT value: "-Xms512m -Xmx512m -Xmn256m" resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" livenessProbe: tcpSocket: port: 9876 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: tcpSocket: port: 9876 initialDelaySeconds: 10 periodSeconds: 5 3.2 Headless Service # nameserver-service.yaml apiVersion: v1 kind: Service metadata: name: rocketmq-nameserver namespace: rocketmq spec: clusterIP: None # Headless Service selector: app: rocketmq-nameserver ports: - port: 9876 targetPort: 9876 name: nameserver 3.3 部署 NameServer # 部署 StatefulSet kubectl apply -f nameserver-statefulset.yaml # 部署 Service kubectl apply -f nameserver-service.yaml # 查看 Pod 状态 kubectl get pods -n rocketmq -l app=rocketmq-nameserver # 输出: # NAME READY STATUS RESTARTS AGE # rocketmq-nameserver-0 1/1 Running 0 1m # rocketmq-nameserver-1 1/1 Running 0 1m # 查看 Service kubectl get svc -n rocketmq # 查看 DNS 记录 kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup rocketmq-nameserver.rocketmq.svc.cluster.local 四、Broker 部署 4.1 StorageClass 配置 # storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: rocketmq-storage provisioner: kubernetes.io/aws-ebs # 根据云厂商修改 parameters: type: gp3 fsType: ext4 volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true kubectl apply -f storageclass.yaml 4.2 Broker StatefulSet # broker-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: rocketmq-broker namespace: rocketmq spec: serviceName: rocketmq-broker replicas: 2 selector: matchLabels: app: rocketmq-broker template: metadata: labels: app: rocketmq-broker spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - rocketmq-broker topologyKey: "kubernetes.io/hostname" containers: - name: broker image: apache/rocketmq:5.0.0 imagePullPolicy: IfNotPresent command: - sh - mqbroker - -c - /etc/rocketmq/broker.conf ports: - containerPort: 10909 name: vip - containerPort: 10911 name: main - containerPort: 10912 name: ha env: - name: NAMESRV_ADDR value: "rocketmq-nameserver-0.rocketmq-nameserver.rocketmq.svc.cluster.local:9876;rocketmq-nameserver-1.rocketmq-nameserver.rocketmq.svc.cluster.local:9876" - name: JAVA_OPT_EXT value: "-Xms2g -Xmx2g -Xmn1g" volumeMounts: - name: broker-storage mountPath: /home/rocketmq/store - name: broker-config mountPath: /etc/rocketmq/broker.conf subPath: broker.conf resources: requests: memory: "2Gi" cpu: "500m" limits: memory: "4Gi" cpu: "2000m" livenessProbe: tcpSocket: port: 10911 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: tcpSocket: port: 10911 initialDelaySeconds: 20 periodSeconds: 5 volumes: - name: broker-config configMap: name: rocketmq-broker-config volumeClaimTemplates: - metadata: name: broker-storage spec: accessModes: [ "ReadWriteOnce" ] storageClassName: rocketmq-storage resources: requests: storage: 50Gi 4.3 Broker Service # broker-service.yaml apiVersion: v1 kind: Service metadata: name: rocketmq-broker namespace: rocketmq spec: clusterIP: None selector: app: rocketmq-broker ports: - port: 10909 targetPort: 10909 name: vip - port: 10911 targetPort: 10911 name: main - port: 10912 targetPort: 10912 name: ha 4.4 部署 Broker # 部署 StatefulSet kubectl apply -f broker-statefulset.yaml # 部署 Service kubectl apply -f broker-service.yaml # 查看 Pod kubectl get pods -n rocketmq -l app=rocketmq-broker -w # 查看 PVC kubectl get pvc -n rocketmq # 查看日志 kubectl logs -f rocketmq-broker-0 -n rocketmq # 进入 Pod 验证 kubectl exec -it rocketmq-broker-0 -n rocketmq -- sh > sh mqadmin clusterList -n rocketmq-nameserver-0.rocketmq-nameserver.rocketmq.svc.cluster.local:9876 五、客户端连接 5.1 内部访问 在 K8s 集群内部: ...

2025-11-15 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...