# Portworx CSI Implementation Summary ## Overview Successfully created a complete GitOps deployment for Portworx CSI driver to integrate Pure Storage FlashArray with Talos Linux Kubernetes cluster (fastpass). This implementation follows the homelab's established GitOps patterns and provides enterprise-grade block and file storage capabilities. ## What Was Created ### Directory Structure ``` cluster/platform/portworx-csi/ ├── application.yaml # ArgoCD Application manifest ├── operator-values.yaml # Helm values for Portworx Operator ├── storagecluster.yaml # StorageCluster CR for PX-CSI deployment ├── externalsecret.yaml # ExternalSecret for FlashArray credentials ├── storageclass-block.yaml # StorageClass for iSCSI block volumes ├── storageclass-file.yaml # StorageClass for NFS file storage ├── talos-config-reference.yaml # Talos configuration reference (not a K8s resource) ├── README.md # Complete deployment documentation ├── DEPLOYMENT-CHECKLIST.md # Step-by-step deployment checklist ├── QUICKREF.md # Quick reference for common operations └── validate-prereqs.sh # Pre-deployment validation script ``` **Total**: 11 files, ~1,922 lines of YAML and documentation ## Implementation Details ### 1. ArgoCD Application (`application.yaml`) - **Sync Wave**: 2 (after External Secrets Operator, before applications) - **Multi-source**: Helm chart from Portworx + local manifests from Git - **Auto-sync**: Enabled with prune and self-heal - **Namespace**: `portworx` ### 2. Portworx Operator (`operator-values.yaml`) - **Chart**: `px-operator` version 25.0.0 - **Deployment**: Single replica (sufficient for homelab) - **Resources**: Minimal (50m CPU, 128Mi memory) - **Tolerations**: Can run on control plane nodes ### 3. StorageCluster CR (`storagecluster.yaml`) - **Backend**: Pure Storage FlashArray - **Protocol**: iSCSI (can be changed to NVMe-oF) - **CSI Driver**: Enabled with PX-CSI 3.2.0 - **Secret**: References `px-pure-secret` (from ExternalSecret) - **Monitoring**: Prometheus metrics enabled - **Topology**: Disabled (can be enabled later for multi-zone) ### 4. FlashArray Credentials (`externalsecret.yaml`) - **Source**: 1Password via ClusterSecretStore - **Vault**: `homelab` - **Item**: `pure-flasharray-fastpass` - **Field**: `pure.json` (JSON configuration) - **Target Secret**: `px-pure-secret` in `portworx` namespace - **Refresh**: Hourly Expected 1Password `pure.json` format: ```json { "FlashArrays": [ { "MgmtEndPoint": "flasharray.mk-labs.cloud", "APIToken": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "NFSEndPoint": "flasharray-nfs.mk-labs.cloud" } ] } ``` ### 5. StorageClasses #### pure-block - **Provisioner**: `pxd.portworx.com` - **Backend**: FlashArray block volumes (iSCSI) - **Access Mode**: ReadWriteOnce (RWO) - **Filesystem**: ext4 - **Features**: Volume expansion, snapshots - **Use Case**: Databases, stateful applications #### pure-file - **Provisioner**: `pxd.portworx.com` - **Backend**: FlashArray File Services (NFS) - **Access Mode**: ReadWriteMany (RWX) - **Protocol**: NFS v4.1 - **Features**: Shared storage, volume expansion - **Use Case**: Multi-pod applications, shared data ### 6. Talos Configuration (`talos-config-reference.yaml`) **NOTE**: This is a reference document, NOT a Kubernetes resource. Must be applied via `talhelper` or `talosctl`. Required Talos patches: - **System Extensions**: `iscsi-tools`, `util-linux-tools` - **Kernel Modules**: `iscsi_tcp`, `dm_multipath`, `dm_round_robin` - **Multipath Config**: `/etc/multipath.conf` with Pure Storage settings - **udev Rules**: `/etc/udev/rules.d/99-pure-storage.rules` for queue tuning - **kubelet Mounts**: `/var/lib/iscsi` shared mount for iSCSI persistence ### 7. Documentation #### README.md (16KB) Comprehensive documentation including: - Architecture diagrams - Prerequisites (FlashArray, 1Password, Talos) - Step-by-step deployment instructions - Usage examples (PVCs, snapshots, expansion) - Monitoring setup - Troubleshooting guide - References and architecture decisions #### DEPLOYMENT-CHECKLIST.md (12KB) 8-phase deployment checklist: 1. FlashArray Preparation 2. 1Password Secret Configuration 3. Talos Node Configuration 4. GitOps Deployment 5. Deployment Verification 6. Functional Testing 7. Monitoring Setup 8. Documentation & Handoff Includes rollback plan and success criteria. #### QUICKREF.md (9KB) Quick reference for: - Status checks - Volume operations (create, expand, snapshot, restore) - Log viewing - Troubleshooting commands - Monitoring queries - Maintenance procedures - Useful aliases #### validate-prereqs.sh (7KB) Automated pre-deployment validation script that checks: - Kubernetes cluster connectivity - External Secrets Operator presence - ClusterSecretStore configuration - Talos nodes - Existing CSI drivers - StorageClass conflicts - ArgoCD setup - Required manifests in repository ## GitOps Workflow ### Deployment Flow ``` 1. Commit to Git (homelab repo) ↓ 2. ArgoCD detects changes ↓ 3. Wave 2 sync (after External Secrets) ↓ 4. Helm deploys Portworx Operator ↓ 5. Operator deploys PX-CSI components ↓ 6. StorageClasses become available ↓ 7. Applications can provision volumes ``` ### Dependencies - **Wave 1**: External Secrets Operator, 1Password Connect - **Wave 2**: Portworx CSI (this deployment) - **Wave 3+**: Applications using Pure storage ## Prerequisites Summary ### FlashArray Requirements 1. ✅ FlashArray accessible from cluster network 2. ✅ Storage admin user created with API token 3. ✅ iSCSI targets configured (for block storage) 4. ✅ File Services enabled (optional, for NFS) 5. ✅ NFS policy configured with user mapping disabled (optional) ### Kubernetes Requirements 1. ✅ Talos Linux cluster with kernel modules (iscsi_tcp, dm_multipath) 2. ✅ External Secrets Operator installed (wave 1) 3. ✅ ClusterSecretStore configured for 1Password 4. ✅ ArgoCD installed and operational 5. ✅ Multipath and udev rules configured on all nodes ### 1Password Requirements 1. ✅ Vault: `homelab` 2. ✅ Item: `pure-flasharray-fastpass` 3. ✅ Field: `pure.json` with FlashArray configuration ## Next Steps ### 1. Before Deployment - [ ] Create FlashArray storage admin user and API token - [ ] Add FlashArray credentials to 1Password - [ ] Apply Talos configuration to all worker nodes: ```bash cd ~/git/homelab/talos/talhelper # Add portworx-csi patches to talconfig.yaml talhelper genconfig talosctl apply-config --file clusterconfig/.yaml --nodes talosctl reboot --nodes ``` - [ ] Verify iSCSI and multipath on each node - [ ] Run validation script: `./validate-prereqs.sh` ### 2. Deploy ```bash cd ~/git/homelab git add cluster/platform/portworx-csi/ git commit -m "Add Portworx CSI driver for Pure FlashArray" git push origin main # ArgoCD will auto-sync (wave 2) # Or manually sync: argocd app sync portworx-csi ``` ### 3. Verify Deployment ```bash # Check ArgoCD application kubectl get application -n argocd portworx-csi # Verify pods kubectl get pods -n portworx # Check StorageCluster kubectl get storagecluster -n portworx # Test with sample PVC (see DEPLOYMENT-CHECKLIST.md Phase 6) ``` ### 4. Post-Deployment - [ ] Configure Prometheus/Grafana dashboards for Portworx metrics - [ ] Update homelab infrastructure documentation - [ ] Create runbook for common operations - [ ] Schedule follow-up review after 1 week ## Key Design Decisions ### Why Portworx CSI? - **Direct Access**: FlashArray volumes directly attached to pods (no aggregation layer) - **Native Integration**: Official Pure Storage support - **Feature Rich**: Snapshots, expansion, topology-aware provisioning - **Talos Compatible**: Works with Talos Linux after proper configuration ### Why iSCSI (vs NVMe-oF)? - **Broad Compatibility**: Works on all Talos nodes without special NICs - **Proven**: Mature protocol with extensive documentation - **Upgrade Path**: Can migrate to NVMe-oF later for performance - **Simpler Setup**: Fewer hardware dependencies ### Why Multi-Source ArgoCD Application? - **Consistency**: Follows homelab pattern (same as cert-manager, nfs-csi) - **Upstream Helm**: Use official Portworx chart, not custom forks - **Local Overrides**: StorageClasses and configs in Git - **GitOps Friendly**: All configuration is declarative ### Why Wave 2? - **Dependencies**: Needs External Secrets (wave 1) for credentials - **Before Apps**: Storage must be ready before applications deploy - **Parallel Safe**: Can deploy alongside other platform services ## Validation Results All YAML files validated successfully: - ✅ `application.yaml` - Valid YAML - ✅ `externalsecret.yaml` - Valid YAML - ✅ `operator-values.yaml` - Valid YAML - ✅ `storageclass-block.yaml` - Valid YAML - ✅ `storageclass-file.yaml` - Valid YAML - ✅ `storagecluster.yaml` - Valid YAML - ✅ `talos-config-reference.yaml` - Valid YAML ## Important Notes ### Talos Configuration ⚠️ **CRITICAL**: The `talos-config-reference.yaml` file is **NOT** a Kubernetes resource. It documents the required Talos patches that must be applied via `talhelper` or `talosctl`. Do not attempt to `kubectl apply` this file. ### Secret Management The FlashArray API token is stored in 1Password and synced to Kubernetes via External Secrets Operator. Never commit credentials to Git. ### Node Reboots Required After applying Talos configuration with kernel modules, nodes **must be rebooted** for modules to load. Schedule appropriately. ### iSCSI Initiator Names Each Talos node must have a **unique** iSCSI initiator name. Verify uniqueness across all nodes to avoid conflicts. ### Default StorageClass Neither `pure-block` nor `pure-file` is set as the default StorageClass. The existing `nfs-emporium` remains the default. Applications must explicitly request Pure storage by specifying `storageClassName`. ## Support and References ### Documentation - **Full Deployment Guide**: `cluster/platform/portworx-csi/README.md` - **Deployment Checklist**: `cluster/platform/portworx-csi/DEPLOYMENT-CHECKLIST.md` - **Quick Reference**: `cluster/platform/portworx-csi/QUICKREF.md` ### Official Documentation - [Portworx CSI Documentation](https://docs.portworx.com/portworx-csi/) - [FlashArray Preparation](https://docs.portworx.com/portworx-csi/install/prepare/flash-array) - [Talos Storage Guide](https://www.talos.dev/latest/kubernetes-guides/configuration/storage/) ### Troubleshooting If issues arise during deployment: 1. Check `DEPLOYMENT-CHECKLIST.md` for step-by-step verification 2. Review `QUICKREF.md` for troubleshooting commands 3. Run `validate-prereqs.sh` to check prerequisites 4. Consult Portworx CSI documentation for advanced scenarios ## Summary A complete, production-ready GitOps deployment for Portworx CSI driver has been created. The implementation: ✅ Follows homelab GitOps patterns ✅ Integrates with existing External Secrets Operator ✅ Supports both block (iSCSI) and file (NFS) storage ✅ Includes comprehensive documentation and validation tools ✅ Provides clear deployment checklist and troubleshooting guides ✅ Ready for deployment after FlashArray and Talos prerequisites are met **Total effort**: 11 files, ~1,922 lines, comprehensive documentation and tooling. **Ready for**: Git commit → ArgoCD deployment → Production use