Install Stork
You can install Stork with or without Portworx Enterprise using the following methods:
Deployment method without Portworx Enterprise
To install Stork version 25.1.0 on your Kubernetes cluster without installing Portworx Enterprise, run the below commands:
-
Download the Stork deployment spec:
curl -fsL -o stork-spec.yaml "https://install.portworx.com/pxbackup?comp=stork&storkNonPx=true"
-
In the
stork-spec.yaml
, change the Stork version to 25.1.0 if the version differs.
If your application cluster is running in the IBM Cloud environment, ensure that the image repository path is set to icr.io/ext/portworx/stork:<supported-pxb-stork-version>
before applying the stork-spec.yaml
during Stork installation (without PXE).
-
Apply the
stork-spec.yaml
to install the latest Stork version:kubectl apply -f stork-spec.yaml
Deployment Method with Portworx Enterprise
If you have to install Stork along with Portworx Enterprise, you can opt-in for Daemonset installation or Portworx Operator installation:
Portworx DaemonSet installation
To install Stork using Daemonset installation method:
-
Fetch the Kubernetes version and then download
stork-spec.yaml
:KBVER=$(kubectl version --short | awk -Fv '/Server Version: /{print $3}')
curl -fsL -o stork-spec.yaml "https://install.portworx.com/pxbackup?kbver=${KBVER}&comp=stork" -
Apply the
stork-spec.yaml
with the below command:kubectl apply -f stork-spec.yaml
Portworx Operator installation
Stork fresh installation for Portworx Backup through web console
If Stork is not installed as part of Portworx deployment, perform the following steps:
-
From the home page, click Add cluster.
-
Choose your Kubernetes platform.
-
Provide cluster name and Kubeconfig details.
-
Click Px-cluster to copy the stork installation command.
-
Run the Stork installation command.
noteIf Stork is installed through PX Cluster option from the web console in a namespace other than the namespace where Portworx Enterprise is deployed, perform Step 6 or else go to Step 7.
-
Update the following key-value pairs in stork deployment's (
stork-spec.yaml
) environment variable section, using kubectl edit command.kubectl edit deployment stork -n <stork-namespace>
env:
- name: PX_NAMESPACE
value: <portworx-deployed-namespace>
- name: PX_SERVICE_NAME
value: portworx-api
- name: STORK-NAMESPACE
value: portworx -
Click Add Cluster.
Updating Stork deployment for Portworx Backup through web console
Perform the below steps to update Stork installation using Portworx operator option:
-
Edit the stc (Kubernetes resource):
kubectl edit stc -n <portworx-deployed-namespace>
-
Append the Stork image and version details in Stork section:
stork:
args:
webhook-controller: "true"
enabled: true
image: openstorage/stork:24.3.4 -
Save and exit.
Install Stork in air-gapped environments
- If your application cluster is air-gapped, then you must pull the following images before installing Stork:
- 2.8.3
- 2.8.2
- 2.8.1
- 2.8.0
Image | Version |
---|---|
openstorage/stork | 25.1.0 |
openstorage/cmdexecutor | 25.1.0 |
openstorage/kopiaexecutor | 1.2.17 |
openstorage/nfsexecutor | 1.2.17 |
Image | Version |
---|---|
openstorage/stork | 24.3.4 |
openstorage/cmdexecutor | 24.3.4 |
openstorage/kopiaexecutor | 1.2.16 |
openstorage/nfsexecutor | 1.2.16 |
Image | Version |
---|---|
openstorage/stork | 24.3.4 |
openstorage/cmdexecutor | 24.3.4 |
openstorage/kopiaexecutor | 1.2.16 |
openstorage/nfsexecutor | 1.2.16 |
Image | Version |
---|---|
openstorage/stork | 24.3.3.1 |
openstorage/cmdexecutor | 24.3.3.1 |
openstorage/kopiaexecutor | 1.2.15 |
openstorage/nfsexecutor | 1.2.15 |
-
Push the above images to your internal registry server, accessible by the air-gapped nodes.
-
After pushing the images, follow the instructions in How to install Stork based on your deployment methods to install your Stork version.
Sample Stork Spec for reference:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: stork-account
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
tier: control-plane
name: stork
namespace: kube-system
spec:
selector:
matchLabels:
name: stork
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
replicas: 3
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
name: stork
tier: control-plane
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "name"
operator: In
values:
- stork
topologyKey: "kubernetes.io/hostname"
hostPID: false
containers:
- name: stork
command:
- /stork
- --verbose
- --leader-elect=true
- --health-monitor-interval=120
- --webhook-controller=true
image: icr.io/ext/portworx/stork:25.1.0
imagePullPolicy: Always
resources:
requests:
cpu: '0.1'
serviceAccountName: stork-account
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: stork-scheduler-role
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "create", "update"]
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "watch"]
- apiGroups: ["", "events.k8s.io"]
resources: ["events"]
verbs: ["create", "patch", "update"]
- apiGroups: [""]
resourceNames: ["kube-scheduler"]
resources: ["endpoints"]
verbs: ["delete", "get", "patch", "update"]
- apiGroups: [""]
resources: ["nodes", "namespaces"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["delete", "get", "list", "watch"]
- apiGroups: [""]
resources: ["bindings", "pods/binding"]
verbs: ["create"]
- apiGroups: [""]
resources: ["pods/status"]
verbs: ["patch", "update"]
- apiGroups: [""]
resources: ["replicationcontrollers", "services"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps", "extensions"]
resources: ["replicasets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["statefulsets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["policy"]
resources: ["poddisruptionbudgets"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims", "persistentvolumes"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses", "csinodes"]
verbs: ["get", "list", "watch"]
- apiGroups: ["coordination.k8s.io"]
resources: ["leases"]
verbs: ["create", "update", "get", "list", "watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: stork-scheduler-role-binding
subjects:
- kind: ServiceAccount
name: stork-scheduler-account
namespace: kube-system
roleRef:
kind: ClusterRole
name: stork-scheduler-role
apiGroup: rbac.authorization.k8s.io
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: stork-snapshot-sc
provisioner: stork-snapshot
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: stork-role
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: stork-role-binding
subjects:
- kind: ServiceAccount
name: stork-account
namespace: kube-system
roleRef:
kind: ClusterRole
name: stork-role
apiGroup: rbac.authorization.k8s.io