Portworx
Portworx is a software-defined persistent storage solution designed and purpose-built for applications deployed as containers, via container orchestrators such as Kubernetes. You can use Palette to install Portworx on the cloud or on-premises.
Versions Supported
- 2.11.x
- 2.10.x
- 2.9.x
- 2.8.x
- 2.6.x
- 2.11.2
- 2.10.0
- 2.9.0
- 2.8.0
- 2.6.1
Prerequisites
For deploying Portworx for Kubernetes, make sure to configure the properties in the pack:
- 
Have at least three nodes with the proper hardware, software, and network requirements. 
- 
Ensure you are using a supported Kubernetes version. 
- 
Identify and set up the storageType. 
Contents
The default installation of Portworx will deploy the following components in the Kubernetes cluster.
- 
Portworx 
- 
CSI Provisioner 
- 
Storage class making use of portworx-volume provisioner. 
Parameters
Manifests - Portworx
manifests:
  portworx:
    # The namespace to install Portworx resources
    namespace: "portworx"
    # Portworx storage type and size
    storageType: "type=zeroedthick,size=150"
    # Max storgae nodes per zone
    maxStorageNodesPerZone: 3
    # Node recovery timeout in seconds
    nodeRecoveryTimeout: 1500
    # Portworx storage class config
    storageClass:
      enabled: true
      isDefaultStorageClass: true
      allowVolumeExpansion: true
      reclaimPolicy: Retain
      volumeBindingMode: Immediate
      parameters:
        repl: "3"
        priority_io: "high"
        #sharedv4: true
    k8sVersion: "{{.spectro.system.kubernetes.version}}"
    templateVersion: "v4"
    # List of additional container args to be passed
    args:
      ociMonitor:
        #- "-dedicated_cache"
        #- "-a"
      storkDeployment:
        #- "--app-initializer=true"
      storkScheduler:
        #- "--scheduler-name=xyz"
      autoPilot:
      csiProvisioner:
      csiSnapshotter:
      csiSnapshotController:
      csiResizer:
    # The private registry from where images will be pulled from. When left empty, images will be pulled from the public registry
    # Example, imageRegistry: "harbor.company.com/portworx"
    imageRegistry: ""
Integration With External etcd
Starting Portworx v2.6.1, you can use the presets feature to toggle between the available ETCD options.
By default, Portworx is set to use internal KVDB. However, you can integrate Portworx to an external etcd server by following the steps below.
- 
Enable useExternalKvdbflag by setting it to true.
- 
Configure the external etcd endpoints in externalKvdb.endpoints.
If the external etcd server is configured to authenticate via certificates, additionally you may want to set up the following:
- 
Enable externalKvdb.useCertsForSSLflag by setting it to true.
- 
Setup certificate related configuration in externalKvdb.cacert,externalKvdb.cert, andexternalKvdb.key.
Make sure to follow the correct indentation style; otherwise, certs will not be imported correctly and will result in Portworx deployment failure.
Etcd Presets
These are the three types of Presets that can be selected and modified.
- Use Internal KVDB Preset
- Use Non-Secure KVDB Endpoints
- Use Certs Secured KVDB Endpoints
Use Internal KVDB
# ECTD selection
  useExternalKvdb: false
  # External kvdb related config
  externalKvdb:
    useCertsForSSL: false
vsphere-cloud-controller-manager:
  k8sVersion: '{{.spectro.system.kubernetes.version}}'
Use Non-Secure KVDB Endpoints
# External kvdb related config
    externalKvdb:
      # List of External KVDB endpoints to use with Portworx. Used only when useExternalKvdb is true
      endpoints:
        - etcd:http://100.26.199.167:2379
        - etcd:http://100.26.199.168:2379
        - etcd:http://100.26.199.169:2379
      useCertsForSSL: false
    useExternalKvdb: true
  vsphere-cloud-controller-manager:
    k8sVersion: '{{.spectro.system.kubernetes.version}}'
Use Certs Secured KVDB Endpoints
# External KVDB Related Configuration
 externalKvdb:
  # List of External KVDB endpoints to use with Portworx. Used only when useExternalKvdb is true
  endpoints:
    - etcd:https://100.26.199.167:2379
    - etcd:https://100.26.199.168:2379
    - etcd:https://100.26.199.169:2379
  useCertsForSSL: true
  # The CA cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below
  cacert: |-
    -----BEGIN CERTIFICATE-----
    MIIC3DCCAcQCCQCr1j968rOV3zANBgkqhkiG9w0BAQsFADAwMQswCQYDVQQGEwJV
    UzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NhbnRhIENsYXJhMB4XDTIwMDkwNDA1
    MzcyNFoXDTI1MDkwMzA1MzcyNFowMDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNB
    MRQwEgYDVQQHDAtTYW50YSBDbGFyYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
    AQoCggEBALt2CykKKwncWNQqB6Jg0QXd58qeDk40OF4Ti8DewZiZgpQOgA/+GYO7
    bx2/oQyAwjvhpTYjmMN5zORJpE3p9A+o57An1+B9D8gm1W1uABVEmwiKZhXpa+3H
    Zlon58GR+kAJPbMIpvWbjMZb4fxZM0BPo0PHzzITccoaTV4+HY4YoDNAVjfZ1cEn
    Hu2PUyN8M4RM+HdE4MOQVwqFDq/Fr6mLBMV0PdiwML0tjZ7GSGSjv1hme3mOLvKP
    qSWx4hCd5oTegEfneUKKnVhH3JLpSU1NaC6jU3vhyowRNOShi77/uJCnkx3mp9JG
    c4YruKrGc997wmUMsIv0owt49Y3dAi8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA
    kEXPdtpOURiZIi01aNJkzLvm55CAhCg57ZVeyZat4/LOHdvo+eXeZ2LHRvEpbakU
    4h1TQJqeNTd3txI0eIx8WxpwbJNxesuTecCWSIeaN2AApIWzHev/N7ZYJsZ0EM2f
    +rYVcX8mcOkLeyKDInCKySxIPok8kU4qQLTWytJbeRYhxh7mSMuZXu7mtSh0HdP1
    C84Ml+Ib9uY2lbr1+15MhfSKdpvmLVOibRIrdqQirNhl8uU9I1/ExDxXyR2NBMLW
    tzGgsz5dfFDZ4oMqAc8Nqm9LuvmIZYMCunMZedI2h7jGH3LVQXdM81iZCgJdTgKf
    i9CNyx+CcwUCkWQzhrHBQA==
    -----END CERTIFICATE-----
  # The cert to use for etcd authentication. Make sure to follow the same indentation style as given in the example below
  cert: |-
    -----BEGIN CERTIFICATE-----
    MIIDaTCCAlGgAwIBAgIJAPLC+6M3EezhMA0GCSqGSIb3DQEBCwUAMDAxCzAJBgNV
    BAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmEwHhcNMjAw
    OTA0MDUzODIyWhcNMjIxMjA4MDUzODIyWjA4MQswCQYDVQQGEwJVUzETMBEGA1UE
    CAwKQ2FsaWZvcm5pYTEUMBIGA1UEBwwLU2FudGEgQ2xhcmEwggEiMA0GCSqGSIb3
    DQEBAQUAA4IBDwAwggEKAoIBAQCycmCHPrX0YNk75cu3H5SQv/D1qND2+2rGvv0Z
    x28A98KR/Bdchk1QaE+UHYPWejsRWUtEB0Q0KreyxpwH1B4EHNKpP+jV9YqCo5fW
    3QRipWONKgvrSKkjVp/4U/NAAWCHfruB1d9u/qR4utY7sEKHE9AxmbyG+K19mOB2
    FJc7NOsTwN8d6uA5ZfFKmv3VtZzl0+Vq1qFSyIZT9zXYM22YjBAqXk9FVoI0FoQt
    zpymQrsajfS+hNX7lSUVKKv3IplpNqSOyTHRF7TWo5NOH+YRWJHLAgZoq2w/yaEi
    5IdjLdb1JXmVUyBgq590WcJZDakwD9SPOHrM9K1vTl9I41q7AgMBAAGjfjB8MEoG
    A1UdIwRDMEGhNKQyMDAxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UE
    BwwLU2FudGEgQ2xhcmGCCQCr1j968rOV3zAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
    8DAWBgNVHREEDzANggtleGFtcGxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAUOBn
    YdTif6WlRpQOj+3quGrafJSNL8TqHkpmgaInSpMVFwDsmPF/HoAVVpX+H3oMY8p7
    Ll4I1Q7szpGRnKpJuzMZp5+gNpmwAz2MdAr7Ae9wH/+o8c2avbfpaHFWVTJZJ6X1
    Q6m6jmXcU0QSS4zj+lyxDNKnXfwVL8hVp0mXRFfPpb4l5ZCBoj4IA2UgyeU7F/nn
    nvR5rmg781zc0lUL6X7HaSfQjtPDTSZYFqwE93vSe42JP7NWM96lZHy2IlfE88Wp
    jUvOOJjaFVuluaJ78uCydMGEkJmipxH+1YXicH47RQ30tD5QyXxGBi+8jw5z0RiR
    ptWD/oDFCiCjlffyzg==
    -----END CERTIFICATE-----
  # The key to use for etcd authentication. Make sure to follow the same indentation style as given in the example below
  key: |-
    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAsnJghz619GDZO+XLtx+UkL/w9ajQ9vtqxr79GcdvAPfCkfwX
    XIZNUGhPlB2D1no7EVlLRAdENCq3ssacB9QeBBzSqT/o1fWKgqOX1t0EYqVjjSoL
    60ipI1af+FPzQAFgh367gdXfbv6keLrWO7BChxPQMZm8hvitfZjgdhSXOzTrE8Df
    HergOWXxSpr91bWc5dPlatahUsiGU/c12DNtmIwQKl5PRVaCNBaELc6cpkK7Go30
    voTV+5UlFSir9yKZaTakjskx0Re01qOTTh/mEViRywIGaKtsP8mhIuSHYy3W9SV5
    lVMgYKufdFnCWQ2pMA/Ujzh6zPStb05fSONauwIDAQABAoIBAGHELIKspv/m993L
    Pttrn/fWUWwmO6a1hICzLvQqwfRjyeQ1m48DveQp4j+iFBM0EJymsYfp+0IhjVeT
    XPUlD/Ts3bYA384pouOEQbJkkPyC5JH40WLtAk3sLeTeCc2tc3eIxa6SwMGNHgtP
    QgSdwzVCc7RZKGNCZ7sCQSgwi9LRdyjHU0z0KW3lHqsMkK+yEg8zuH2DpIgvFej8
    KxjwF9ZEsnYDcERdd4TOu2NTEIl5N7F8E6di/CLP/wkfHazjX+qGcuBXjeGhPgdb
    fKCcrFxhbavaJRMGLqnOD99l/zvySnA+LUSZ35KB/2ZfLMv71Z9oABTlyiR+76GW
    0lcQjmECgYEA2Jrq2qe7IUZ8CURWJ6rDKgD83LGRCHAWZ+dYvFmdsyfAGMV4+p4V
    zKSidiTWAgl7ppiZdaEPu/2cH8uohDkdx2CTSUKPUM6+PBhE4hwSA42RlnIpGWbf
    YEqcZ/qeo1IFb1A1YslwdslCVLc3INEbWairBEGis8aAxUaoEiTiPTMCgYEA0ubQ
    05BijLK6XH6YfASDLxwRg6jxn3mBqh+pAwE4tVVJVI9yXnNzN4/WKJJM+mdSGfpv
    UcJy86ZcmHNzanZUPWh80U2pyRoVXvVQpY8hdMQ3neya60mc6+Nneba2LflkBVmd
    cdoNGO0zAcGb0FKDCF2H3fizDxcoOyUjeKlLnFkCgYABU0lWlyok9PpzUBC642eY
    TTM+4nNBuvXYIuk/FclKPFcHj8XCus7lVqiL0oPgtVAlX8+okZi4DMA0zZk1XegZ
    vTSJgTfBRdKSKY/aVlOh4+7dHcu0lRWO0EYOuNDZrPnNiY8aEKN4hpi6TfivYbgq
    H0cUmpY1RWSqUFlc6w7bUwKBgEMINctoksohbHZFjnWsgX2RsEdmhRWo6vuFgJSB
    6OJJrzr/NNysWSyJvQm8JldYS5ISNRuJcDvc3oVd/IsT/QZflXx48MQIVE6QLgfR
    DFMuonbBYyPxi7y11Ies+Q53u8CvkQlEwvDvQ00Fml6GOzuHbs2wZEkhlRnnXfTV
    6kBRAoGAP9NUZox5ZrwkOx7iH/zEx3X3qzFoN/zSI2iUi2XRWaglGbNAxqX5/ug8
    xJIi1Z9xbsZ/3cPEdPif2VMdvIy9ZSsBwIEuzRf8YNw6ZGphsO95FKrgmoqA44mm
    WsqUCBt5+DnOaDyvMkokP+T5tj/2LXemuIi4Q5nrOmw/WwVGGGs=
    -----END RSA PRIVATE KEY-----
  useExternalKvdb: true
vsphere-cloud-controller-manager:
  k8sVersion: '{{.spectro.system.kubernetes.version}}'
Environments
- vSphere
- AWS
vSphere Environment
For deploying Portworx storage on vSphere environments, make sure to configure the following properties in the pack:
- 
vSphere Configuration file 
- 
Storage Type 
- 
Kubernetes Version 
vSphere Manifest
Additional parameters for the manifest is as follows:
# VSphere cloud configurations
vsphereConfig:
  insecure: "true"
  host: ""
  port: "443"
  datastorePrefix: "datastore"
  installMode: "shared"
  userName: ""
  password: ""
  # Enter the name of the secret which has vsphere user credentials (Use keys VSPHERE_USER, VSPHERE_PASSWORD)
  userCredsSecret: ""
Using Secrets for vSphere User Credentials
Portworx pack values allow you to configure vSphere user credentials in two ways:
- 
Username & password - ( portworx.vsphereConfig.userNameandportworx.vsphereConfig.password).
- 
Secret - ( portworx.vsphereConfig.userCredsSecretis available with v2.6.1 and above).
If you chose the latter, make sure to create the secret in the target cluster manually or by bringing your own (BYO) manifest Add-on pack.
Until the secret is created in the cluster, Portworx deployments might fail to run. When secret is configured, reconciliation should recover Portworx.
Secret can be created using the spec below,
apiVersion: v1
kind: Secret
metadata:
  name: px-vsphere-secret
  namespace: kube-system
type: Opaque
data:
  VSPHERE_USER: "b64 encoded admin username"
  VSPHERE_PASSWORD: "b64 encoded admin password"
and this secret can be referenced in the Portworx pack values as shown below:
manifests:
  portworx:
    vsphereConfig:
      userCredsSecret: "px-vsphere-secret"
Ensure to follow the correct indentation style; otherwise, certificates will not be imported correctly and resulting in a Portworx deployment failure.
AWS Environment
Palette provisions Portworx in an AWS environment. The following are the packs supported:
Packs Supported
- 2.9
- 2.10
portworx-aws-2.9
portworx-aws-2.10
Prerequisites
To deploy Portworx in an AWS environment, have the following prerequisites in place.
- 
Ensure the Portworx Nodes have the TCP ports open at 9001-9022. 
- 
Ensure there is an open UDP port at 9002. 
- 
Apply the following policy to the User in AWS: 
{
  "Version": "2012-10-17",
  "Statement":
    [
      {
        "Sid": "<stmt-id>",
        "Effect": "Allow",
        "Action":
          [
            "ec2:AttachVolume",
            "ec2:ModifyVolume",
            "ec2:DetachVolume",
            "ec2:CreateTags",
            "ec2:CreateVolume",
            "ec2:DeleteTags",
            "ec2:DeleteVolume",
            "ec2:DescribeTags",
            "ec2:DescribeVolumeAttribute",
            "ec2:DescribeVolumesModifications",
            "ec2:DescribeVolumeStatus",
            "ec2:DescribeVolumes",
            "ec2:DescribeInstances",
            "autoscaling:DescribeAutoScalingGroups",
          ],
        "Resource": ["*"],
      },
    ],
}
AWS Manifest
manifests:
  portworx:
    # The namespace to install Portworx resources
    namespace: "portworx"
    # Portworx storage type and size
    storageType: "type=gp3,size=150"
    # Max storage nodes per zone
    maxStorageNodesPerZone: 3
    # Node recovery timeout in seconds
    nodeRecoveryTimeout: 1500
    # Portworx storage class config
    storageClass:
      enabled: true
      isDefaultStorageClass: true
      allowVolumeExpansion: true
      reclaimPolicy: Retain
      volumeBindingMode: Immediate
      parameters:
        repl: "3"
        priority_io: "high"
        #sharedv4: true
    # Kubernetes version.
    k8sVersion: "{{.spectro.system.kubernetes.version}}"
    templateVersion: "v4"
    # List of additional container args to be passed
    args:
      ociMonitor:
        #- "-dedicated_cache"
        #- "-a"
      storkDeployment:
        #- "--app-initializer=true"
      storkScheduler:
        #- "--scheduler-name=xyz"
      autoPilot:
      csiProvisioner:
      csiSnapshotter:
      csiSnapshotController:
      csiResizer:
    # The private registry from where images will be pulled from. When left empty, images will be pulled from the public registry
    # Example, imageRegistry: "harbor.company.com/portworx"
    imageRegistry: ""
    # ECTD selection
    useExternalKvdb: false
    # External kvdb related config
    externalKvdb:
      useCertsForSSL: false