VMware vSphere 与 Kubernetes 集成:通过 vSphere Cloud Provider 实现 Pod 挂载 vSAN 存储

在 Kubernetes(K8s)环境中,通过 vSphere Cloud Provider 集成 VMware vSphere,可以实现 Pod 动态挂载 vSAN 存储。vSAN 是 VMware 的软件定义存储解决方案,提供高性能、高可用的存储服务。这种集成允许 Kubernetes 自动管理 vSAN 卷的生命周期,简化存储配置。以下是逐步指南,帮助您实现此功能。

1. 前提条件

在开始前,确保满足以下环境要求:

  • Kubernetes 集群:版本 1.14 或更高,已部署在 vSphere 环境中。
  • vSphere 环境
    • VMware vCenter Server 版本 6.7 或更高。
    • vSAN 集群已配置并启用。
    • vSphere 用户账户:具有管理员权限,用于 Kubernetes 访问 vCenter。
  • 网络:Kubernetes 节点(包括 Master 和 Worker)与 vCenter 网络互通。
  • vSphere Cloud Provider 插件:已安装或可配置。通常,在创建 Kubernetes 集群时通过 kubeadm 或类似工具启用。
2. 配置 vSphere Cloud Provider

vSphere Cloud Provider 是 Kubernetes 的云控制器插件,负责与 vSphere 交互。配置步骤如下:

  1. 创建 vSphere 配置文件:在 Kubernetes Master 节点上,创建或编辑 /etc/kubernetes/vsphere.conf 文件。内容示例:

    [Global]
    user = "your-vcenter-username"        # vCenter 用户名
    password = "your-vcenter-password"    # vCenter 密码
    server = "vcenter-ip-or-fqdn"          # vCenter 地址
    port = 443                            # 默认端口
    insecure-flag = "1"                   # 如果使用自签名证书,设为 "1"
    
    [VirtualCenter "vcenter-ip-or-fqdn"]
    datacenters = "your-datacenter-name"  # vCenter 数据中心名称
    
    [Workspace]
    server = "vcenter-ip-or-fqdn"
    datacenter = "your-datacenter-name"
    default-datastore = "vsanDatastore"   # 指定 vSAN 存储为默认
    

  2. 启用 vSphere Cloud Provider

    • 如果使用 kubeadm 部署集群,在初始化时添加参数:
      kubeadm init --cloud-provider=vsphere
      

    • 对于现有集群,编辑 kubelet 配置(通常在 /var/lib/kubelet/config.yaml):
      cloudProvider: vsphere
      

      然后重启 kubelet 服务:
      sudo systemctl restart kubelet
      

  3. 验证配置

    • 运行命令检查云控制器状态:
      kubectl get pods -n kube-system | grep vsphere
      

      应看到类似 vsphere-cloud-controller-manager-xxxx 的 Pod 运行中。
3. 创建 StorageClass 使用 vSAN 存储

StorageClass 定义动态卷的存储后端。这里使用 vSAN 作为提供者。

  1. 创建 StorageClass YAML 文件:例如 vsan-storageclass.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: vsan-sc            # StorageClass 名称
    provisioner: kubernetes.io/vsphere-volume  # 指定 vSphere 卷提供者
    parameters:
      datastore: vsanDatastore   # vSAN 存储名称
      diskformat: thin            # 卷格式(thin、thick 等)
      fstype: ext4                # 文件系统类型
    reclaimPolicy: Delete         # 回收策略(Delete 或 Retain)
    volumeBindingMode: Immediate  # 卷绑定模式
    

    • 关键参数
      • datastore: 必须匹配 vSAN 存储名称(在 vCenter 中查看)。
      • diskformat: 推荐 thin 以节省空间。
      • fstype: 根据需求选择,如 ext4xfs
  2. 应用 StorageClass

    kubectl apply -f vsan-storageclass.yaml
    

    验证:

    kubectl get storageclass
    

    输出应显示 vsan-sc 状态为 Available

4. 创建 PersistentVolumeClaim (PVC)

PVC 是 Pod 请求存储的接口。基于 StorageClass 动态创建 vSAN 卷。

  1. 创建 PVC YAML 文件:例如 vsan-pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: vsan-pvc          # PVC 名称
    spec:
      storageClassName: vsan-sc  # 引用 StorageClass
      accessModes:
        - ReadWriteOnce        # 访问模式(单节点读写)
      resources:
        requests:
          storage: 5Gi         # 请求存储大小,例如 $5\text{Gi}$
    

  2. 应用 PVC

    kubectl apply -f vsan-pvc.yaml
    

    验证 PVC 状态:

    kubectl get pvc
    

    输出应显示 vsan-pvc 状态为 Bound,表示 vSAN 卷已动态创建。

5. 在 Pod 中挂载 PVC

创建 Pod 并使用 PVC 挂载 vSAN 存储。

  1. 创建 Pod YAML 文件:例如 vsan-pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: vsan-pod          # Pod 名称
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        volumeMounts:
        - name: vsan-volume   # 卷挂载点名称
          mountPath: /data    # 容器内挂载路径
      volumes:
      - name: vsan-volume
        persistentVolumeClaim:
          claimName: vsan-pvc  # 引用 PVC
    

  2. 应用 Pod

    kubectl apply -f vsan-pod.yaml
    

    验证 Pod 状态:

    kubectl get pods vsan-pod
    

    输出应显示 Running

6. 验证存储挂载

确保 Pod 成功挂载 vSAN 存储:

  • 检查 Pod 日志
    kubectl logs vsan-pod
    

    无错误表示运行正常。
  • 进入 Pod 测试写入
    kubectl exec -it vsan-pod -- /bin/bash
    touch /data/testfile        # 创建测试文件
    exit
    

  • 在 vCenter 中验证:登录 vCenter,检查 vSAN 存储中是否生成新卷(名称类似 k8s-volume-xxxx)。
7. 注意事项
  • 性能优化:vSAN 卷性能受网络和 vSAN 策略影响。建议在 vCenter 中配置存储策略(如 RAID 级别)。
  • 安全
    • 使用 Secret 存储 vCenter 凭据(避免明文密码)。例如,创建 Secret:
      apiVersion: v1
      kind: Secret
      metadata:
        name: vsphere-secret
      type: Opaque
      data:
        username: $(echo -n "your-username" | base64)
        password: $(echo -n "your-password" | base64)
      

      然后在 vsphere.conf 中引用 Secret。
  • 常见问题
    • 卷未绑定:检查 StorageClass 参数是否正确(如 datastore 名称)。
    • 权限错误:确保 vSphere 用户有足够权限管理存储。
    • 版本兼容性:确认 Kubernetes 和 vSphere 版本兼容(参考 VMware 官方文档)。
  • 最佳实践:定期备份 PVC 数据,使用监控工具(如 Prometheus)跟踪存储使用。

通过以上步骤,您可以高效地将 vSAN 存储集成到 Kubernetes Pod 中。如果遇到问题,提供更多细节(如错误日志)以便进一步诊断。

更多推荐