博客 / 詳情

返回

當雲原生遇見VMware:容器化改造與混合部署實戰

本文探討傳統VMware虛擬化環境如何擁抱雲原生,實現容器化改造與混合部署的融合創新方案。

前言

很多企業的現狀是:

  • 核心業務跑在VMware vSphere上,穩定運行多年
  • 新項目想用Kubernetes,享受雲原生的敏捷
  • 完全推倒重來?成本太高,風險太大

雲原生和VMware不是對立的,而是可以融合的。

今天來聊聊如何在VMware環境中落地雲原生,實現平滑過渡。


一、架構選型

1.1 三種融合方案

方案 説明 適用場景
VM上跑K8s 在虛擬機裏部署K8s節點 快速試水,資源隔離
vSphere with Tanzu VMware原生K8s支持 企業級,深度集成
混合架構 VM + 物理機/雲K8s混合 多雲多集羣

1.2 方案對比

方案1:VM上跑K8s(最常見)
┌─────────────────────────────────────────┐
│ vSphere集羣 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ VM-K8s │ │ VM-K8s │ │ VM-K8s │ │
│ │ Master │ │ Worker1 │ │ Worker2 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │
│ K8s Cluster │
└─────────────────────────────────────────┘

方案2:vSphere with Tanzu
┌─────────────────────────────────────────┐
│ vSphere 7.0+ │
│ ┌─────────────────────────────────┐ │
│ │ Supervisor Cluster │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ TKG │ │ vSphere │ │ │
│ │ │ Cluster │ │ Pods │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘


二、VM上部署K8s實戰

2.1 虛擬機規劃

Master節點:

  • CPU: 4 vCPU
  • 內存: 8GB
  • 磁盤: 100GB
  • 網絡: 固定IP
  • 數量: 3台(高可用)

Worker節點:

  • CPU: 8 vCPU
  • 內存: 16GB
  • 磁盤: 200GB
  • 網絡: 固定IP
  • 數量: 按需擴展

2.2 VM模板製作

# 基礎系統配置
# 1. 安裝CentOS/Ubuntu最小化
# 2. 關閉swap
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab

# 3. 關閉SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 4. 配置內核參數
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

# 5. 安裝containerd
apt install containerd -y
containerd config default > /etc/containerd/config.toml
systemctl enable containerd

# 6. 安裝kubeadm/kubelet/kubectl
# ... 根據官方文檔安裝

2.3 使用kubeadm部署

# Master初始化
kubeadm init \
  --apiserver-advertise-address=192.168.1.100 \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12

# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 安裝網絡插件(Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# Worker加入集羣
kubeadm join 192.168.1.100:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

2.4 vSphere CSI存儲集成

讓K8s使用vSphere的存儲:

# vsphere-csi-driver配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: vsphere-sc
provisioner: csi.vsphere.vmware.com
parameters:
  datastoreurl: "ds:///vmfs/volumes/datastore1/"
  fstype: ext4
reclaimPolicy: Delete
volumeBindingMode: Immediate

這樣Pod可以直接使用vSphere的存儲,數據持久化。


三、vSphere with Tanzu

3.1 架構優勢

vSphere 7.0+原生支持Kubernetes:

  • Supervisor Cluster:管理層K8s
  • TKG Cluster:業務K8s集羣
  • vSphere Pods:直接在ESXi上運行容器(無需VM)

3.2 部署要求

- vSphere 7.0 Update 1+
- vCenter Server
- NSX-T 或 vSphere分佈式交換機
- vSAN/NFS/iSCSI存儲
- 企業Plus許可證

3.3 啓用Workload Management

1. vCenter → Workload Management → 啓用
2. 選擇網絡模式(NSX-T或vDS)
3. 配置存儲策略
4. 設置控制平面大小
5. 等待Supervisor Cluster就緒

四、多集羣管理挑戰

4.1 常見場景

當K8s集羣分佈在多個位置時:

┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│   總部機房    │   │   分支機房    │   │   公有云     │
│  K8s集羣A    │   │  K8s集羣B    │   │  K8s集羣C   │
│  VMware環境  │   │  VMware環境  │   │   EKS/AKS   │
└──────────────┘   └──────────────┘   └──────────────┘

挑戰:

  • 網絡互通:各集羣網絡如何打通?
  • 統一管理:如何集中管理多集羣?
  • 服務發現:跨集羣服務如何調用?

4.2 網絡互聯方案

傳統方案:

  • 專線/MPLS:成本高
  • Site-to-Site VPN:配置複雜
  • SD-WAN:需要專業設備

輕量方案:

使用組網軟件(如星空組網)快速打通多集羣網絡:

# 場景:打通3個K8s集羣的網絡

# 在每個集羣選一台節點安裝組網客户端
# 總部節點:10.10.0.1
# 分支節點:10.10.0.2  
# 雲上節點:10.10.0.3

# 所有節點登錄同一賬號後自動組網
# 各集羣通過組網IP互通

效果:

# 從總部ping分支的K8s節點
ping 10.10.0.2
64 bytes from 10.10.0.2: icmp_seq=1 ttl=64 time=15.3 ms

# kubectl管理遠程集羣
kubectl --kubeconfig=remote-cluster.conf get nodes

4.3 多集羣管理工具

工具 特點
Rancher Web界面,易上手
KubeSphere 國產,功能全面
Lens 桌面客户端
kubectl + kubeconfig 原生方式

配合組網使用,可以在任何地點管理所有集羣。


五、容器化改造實踐

5.1 改造原則

1. 先易後難:先改無狀態應用
2. 漸進式:不要一次性全改
3. 保留回滾:VM和容器並行一段時間
4. 數據分離:有狀態服務謹慎處理

5.2 改造路徑

階段1:開發測試環境容器化
       ↓
階段2:無狀態應用(Web/API)容器化
       ↓
階段3:中間件容器化(有狀態,需要PV)
       ↓
階段4:核心系統評估(可能保留VM)

5.3 Dockerfile最佳實踐

# 多階段構建
FROM maven:3.8-jdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 運行鏡像
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar

# 非root用户
RUN useradd -r appuser
USER appuser

# 健康檢查
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8080/health || exit 1

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

5.4 K8s部署配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: registry.example.com/my-app:v1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10

六、混合架構運維

6.1 監控統一

# Prometheus聯邦,聚合多集羣監控
# prometheus-federation.yaml
scrape_configs:
  - job_name: 'federate-cluster-a'
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job=~".+"}'
    static_configs:
      - targets:
        - '10.10.0.1:9090'  # 集羣A Prometheus
        
  - job_name: 'federate-cluster-b'
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job=~".+"}'
    static_configs:
      - targets:
        - '10.10.0.2:9090'  # 集羣B Prometheus

6.2 日誌聚合

# 使用Loki聚合多集羣日誌
# 各集羣部署Promtail,推送到中心Loki

# promtail-config.yaml
clients:
  - url: http://10.10.0.1:3100/loki/api/v1/push
    external_labels:
      cluster: cluster-a

6.3 CI/CD跨集羣部署

# GitLab CI示例
stages:
  - build
  - deploy

deploy-to-all:
  stage: deploy
  script:
    # 部署到集羣A
    - kubectl --kubeconfig=$KUBE_CONFIG_A apply -f k8s/
    # 部署到集羣B
    - kubectl --kubeconfig=$KUBE_CONFIG_B apply -f k8s/

七、總結

VMware + 雲原生融合要點:

  1. 架構選型:根據規模選擇VM上K8s或Tanzu
  2. 漸進改造:先無狀態,後有狀態
  3. 存儲集成:使用vSphere CSI
  4. 多集羣互聯:組網軟件快速打通網絡
  5. 統一運維:監控、日誌、CI/CD全覆蓋

我的建議:

  • 小規模:VM上部署K8s足夠
  • 中大規模:考慮Tanzu或Rancher
  • 多站點:先解決網絡互通問題

不要為了雲原生而云原生,根據實際需求選擇合適方案。


參考資料

  1. VMware vSphere with Tanzu官方文檔
  2. Kubernetes官方文檔
  3. vSphere CSI Driver

💡 實踐建議:先在測試環境搭建一套,跑通流程後再推廣到生產環境。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.