本文探討傳統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 + 雲原生融合要點:
- 架構選型:根據規模選擇VM上K8s或Tanzu
- 漸進改造:先無狀態,後有狀態
- 存儲集成:使用vSphere CSI
- 多集羣互聯:組網軟件快速打通網絡
- 統一運維:監控、日誌、CI/CD全覆蓋
我的建議:
- 小規模:VM上部署K8s足夠
- 中大規模:考慮Tanzu或Rancher
- 多站點:先解決網絡互通問題
不要為了雲原生而云原生,根據實際需求選擇合適方案。
參考資料
- VMware vSphere with Tanzu官方文檔
- Kubernetes官方文檔
- vSphere CSI Driver
💡 實踐建議:先在測試環境搭建一套,跑通流程後再推廣到生產環境。