- Deploy Portworx Operator + CSI driver via ArgoCD - Support both iSCSI block and NFS file storage from FlashArray - Integrate with 1Password External Secrets for FlashArray credentials - Include comprehensive deployment documentation and validation script - Storage classes: pure-block (iSCSI) and pure-file (NFS) - Talos Linux compatible with iSCSI/multipath configuration
323 lines
11 KiB
Markdown
323 lines
11 KiB
Markdown
# 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/<node>.yaml --nodes <node-ip>
|
|
talosctl reboot --nodes <node-ip>
|
|
```
|
|
- [ ] 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
|