11. Managing Stateful Applications¶
Kubernetes is a framework for managing complex applications in a containerized environment. It provides various facilities for managing container placement, resource allocation, service discovery, load balancing, scaling, etc. Kubernetes does not, however, have a notion of what an application actually is, nor is there a Kubernetes resource called ‘application’.
On a Kubernetes cluster, the pod is the basic operational unit. Containers are grouped into pods and deployed as individual units, or they are deployed under the control of various resource controllers such as ReplicaSet, StatefulSet, Deployment, etc. How to define a set of related Kubernetes resources as a single unit is left for users to decide. Fortunately, a number of solutions that address this problem have evolved in recent times:
Helm Release |
Helm is a tool that streamlines the installation and management of Kubernetes applications. A Helm chart is a collection of specifications describing a related set of Kubernetes resources. A Helm release is a specific instance of a Helm chart which has been deployed to a Kubernetes cluster. |
Custom Operator |
Custom Operators are specialized controllers that automate complex tasks beyond the scope of what Kubernetes itself provides. They provide a way to extend the cluster’s behavior without making modifications to Kubernetes itself. Many ISVs have developed Operators that deploy their software on Kubernetes. |
Topics covered in this chapter:
|
Create an application |
|
Register a stateful application |
|
Unregister a stateful application |
|
Delete an application |
|
List applications |
|
Display detailed information about an app |
|
Display the status of the objects associated with an app |
|
Attach an external storage repo to an app |
|
Detaches a previously attached repo from an app |
|
Configures a snapshot schedule for an app |
|
Configures a backup schedule for an app |
|
Start an application instance |
|
Stop an application instance |
|
Restart an application instance |
|
Revert an app to the point-in-time of specified snapshot or backup |
|
Configure application parameters |
|
Upgrade an application |
|
Configure various attributes/schedules of an app |
|
Share an app with one or more tenant users |
|
Stop sharing an app with one or more tenant users |
|
List application shares |
|
Reassign ownership of an app |
|
Expand the size of a volume associated with an app |
11.1. Application life cycle management¶
The lack of a proper Application construct in Kubernetes poses a problem when it comes to managing the life cycle of a complex application made up of various Kubernetes resources. For example, how would one snapshot or clone an entire Helm release that spans PersistVolumeClaims, Secrets, ConfigMaps, SatefulSet, Pods, Services etc? Or how about snapshotting a web tier, app tier and database tier each deployed separately using three different kubectl manifest files?
11.2. Robin Applications¶
Robin provides a framework for managing stateful applications deployed on a Kubernetes cluster. All resources that together deliver a service to the end user are collected together into a single unit, which Robin calls an Application. Robin maintains metadata on each of the application’s associated resources in its configuration database. This allows Robin to perform life cycle management operations, such as snapshot, backup, restore, etc., that encompass all of an application’s data and metadata (state of each Kubernetes resource). Three types of applications can be managed by Robin:
11.2.1. ROBIN¶
Robin Platform provides the ability to deploy applications to a Kubernetes cluster using custom Application Bundles containing all specifications and resources necessary for application deployment. When Robin Platform deploys the application, it takes responsibility for creating all relevant Kubernetes resources, such as StatefulSets, PersistentVolumeClaims, etc. Robin Applications are automatically handled by the Robin Platform framework.
11.2.2. Helm¶
Helm provides the ability to deploy applications to a Kubernetes cluster using Helm charts containing all specifications and resources necessary for application deployment. When Helm deploys an application, it takes responsibility for creating all relevant Kubernetes resources. Helm Applications are not automatically known to Robin Platform. But they can be registered with the Robin Platform cluster. In order for this to work, all storage for the application must be from the Robin Platform. The application also needs to be registered with Robin Platform.
11.2.3. FlexApp¶
Robin Platform also provides a very flexible mechanism for
registering any set of Kubernetes resources as a Robin Application.
The FlexApp construct uses label selector rules to group the
resources together. For example, --select app=apache --select
app=mysql
would select Pods and PVCs for a web and database tier
together into a single FlexApp object. The command to create/register
a FlexApp, is detailed in the sections below.
11.3. Limits on Non-bundle Applications for Tenants and Users¶
Robin CNP allows you to set limits on non-bundle applications for tenant and tenant users at Resource pools and application levels. For more information, see here.
By default, the following configurations are enabled for setting limits for non-bundle applications:
robin config update cluster k8s_check_rpool_limits true|false
Note
If you disable this configuration, the set limits will not be applicable.
robin config update cluster k8s_auto_registration true|false
Note
If this configuration is disabled manually before the upgrade to Robin CNP 5.4.1, you must enable it manually for limits to be applicable for non-bundle applications.
The set limits will be applicable, and application registration on Robin CNP will succeed only if Kubernetes objects (Pods, Deployment, DaemonSet, Statefulset, and PVCs) have any one of the following labels:
app, release
app.kubernetes.io/instance, app.kubernetes.io/name
11.4. Robin Application Bundles¶
Robin Platform offers a new type of application deployment framework called “Application Bundles”, which is ideally suited for complex workloads such as Cloudera, Oracle RAC, Splunk, SAP HANA, etc. An Application Bundle contains all resources necessary to deploy an application to a Kubernetes cluster, such as:
The list of services offered by the application. For example, services offered by MongoDB include ConfigServer, QueryRouter, Shards, ReplicaSets.
Which image to pull for each service. Note that images can be vendor published images, or they can be custom images hosted on a local registry.
Optionally, application specific placement constraints can also be specified. For example, anti/affinity policies for services.
All application configuration information is contained in a YAML file, called the ‘manifest’ file. The manifest file, icon file, and any application-specific life cycle hook scripts are packaged into a single tar file and uploaded to the Robin Platform as an Application Bundle.
Robin Platform’s Application Bundles enable an App Store-like experience for deploying any Application, with a special focus on the needs of complex distributed data-heavy Big Data, NoSQL and Databases. Once a bundle has been uploaded, a user can use it when deploying an application with a single click from the UI, a single command from the CLI, or a single REST call programmatically.
The highly flexible and customizable Robin Application Bundle framework offers application developers freedom from the underlying infrastructure. You define the application once and deploy it anywhere, on-prem or public clouds like AWS, Azure and Google Cloud.
Robin Platform comes pre-packaged with ready-to-use Application Bundles for several applications including:
Big Data: HortonWorks, Cloudera, Spark, ElasticSearch, ELK, Splunk
NoSQL: MongoDB, Cassandra, CouchDB
Databases: Oracle, Oracle RAC, SAP HANA, Microsoft SQL Server, IBM DB2, Postgres, MySQL, MariaDB
AI / machine learning: TensorFlow, Caffe, Theano, R, Jupyter
Users can onboard any application or database that runs on Linux very quickly. Refer to the Robin Application Bundle Guide for instructions.
11.4.1. Upload a Robin Application Bundle¶
Add a bundle to the Robin cluster with the following command:
# robin bundle add <bundle_name> <bundle_version> <bundle_file_pathname>
An example of its usage is shown below:
# robin bundle add mysql docker-8.0 docker-mysql-8.0-416_master.tar.gz
File upload: 100% -- (79763/79763)
Job: 118 Name: BundleAdd State: VALIDATED Error: 0
Job: 118 Name: BundleAdd State: COMPLETED Error: 0
Note
For more details on the above command refer to the documentation provided here.
11.4.2. Listing Application Bundles¶
List all the bundles currently present on the Robin cluster with the following command:
# robin bundle list
An example of its usage is shown below:
# robin bundle list
Bundle Id | Type | Owner/Tenant | Name | Version | Zone Id | Content Id | Description | Group Id | #Templates | #Apps
----------+-------+----------------------+----------+------------+------------+----------------------------------+-------------+----------+------------+-------
1 | ROBIN | admin1/t1 | mysql2 | docker-8.0 | 1580884960 | f428eeefd6d08ddb7ea91f38e4755771 | - | 4 | 0 | 0
2 | ROBIN | robin/Administrators | postgres | docker-9.5 | 1580884960 | 91120e615901bab8947b9d8380b186a1 | - | 2 | 1 | 1
3 | HELM | admin1/t1 | mysql | helm-1.6.2 | 1580884960 | 00f4243a24cc74624d7272a6217d425f | - | 3 | 0 | 0
Note
For more details on the above command refer to the documentation provided here.
11.4.3. Create an Application from a Robin Application Bundle¶
Create a Robin bundle based application with the following command:
# robin app create from-bundle <app_name> <bundle_id> <path_to_template> --rpool <rpool_name>
An example of its usage is shown below:
# robin app create from-bundle pgsql 2 postgres_template.json --rpool default --wait
Job: 115 Name: ApplicationCreate State: VALIDATED Error: 0
Job: 115 Name: ApplicationCreate State: WAITING Error: 0
Job: 115 Name: ApplicationCreate State: COMPLETED Error: 0
Note
For more details on the above command refer to the documentation provided here.
11.4.4. Advanced placement policies for Robin Application Bundles¶
One advantage of using Robin Application Bundles is that the Robin Platform, as the orchestrator, can enforce multiple placement policies. This is not a feature available in native Kubernetes deployers, such as Helm. This gives users additional control over the placement of pods, affinity rules, etc. for their deployment. Also, these placement policies can be applied independently on each service or role within the application. This fine-grained control helps optimize application performance, cluster utilization, and allows the user to easily customize their deployment based on their cluster configuration.
The placement policies that Robin Platform offers are:
Round-robin placement of pods within different nodes, racks, and datacenters. This rule makes sure that every deployed pod is placed on an a different instance within the specified infrastructure component, depending on available resources. This will spread the compute aspect of an application as much as possible.
Prevent placing more than one pod on the same node, rack, or datacenter. This rule makes sure that every deployed pod is strictly placed on an a different instance within the specified infrastructure. If that is not possible, the application creation will fail. This ensures that the compute aspect of the application is not piled up on one infrastructure piece alone.
Enforce Storage and Compute for all pods to be on same node, rack, or datacenter. This rule makes sure that every deployed pod has storage and compute affinity. As a consequence, each container and its associated volume(s) will be associated with the same infrastructure piece. Performance will obviously benefit.
Restrict the placement of pods to nodes tagged with specific tags ([key:value, …]). This rule makes sure that every deployed pod is placed only on hosts tagged with the specified key-value pairs (either via Kubernetes or Robin Platform). This allows a user to control exactly where a set of pods are spawned and thus optimize cluster utilization.
Do not place pods for service <A> on a node, rack, or datacenter which is also running service <B>. This rule makes sure that every pod deployed for a particular role will never be hosted by an infrastructure piece that is hosting any pods from a different, specified service. For example, the compute aspect of two different roles of an application could always be placed on separate pieces of infrastructure.
Always place pods for service <A> on a node, rack, or datacenter which is also running service <B>. This rule makes sure that every pod deployed for a particular role will always be hosted by an infrastructure piece that is hosting any pods from a different, specified service. For example, the compute aspect of two different roles of an application could always be co-located.
11.5. Helm Releases¶
A Helm chart is a collection of specifications describing a related set of Kubernetes resources. A Helm release is a specific instance of a Helm chart deployed to a Kubernetes cluster. Robin Platform supports the registration of a Helm release as a HELM Application, which allows the application to be managed using Robin Platform’s life cycle management facilities. In order for this to work, all storage for the application must be from the Robin Platform. The application also needs to be deployed to the user’s assigned Kubernetes namespace.
Moreover Robin allows for the auto-registration of Helm releases
when the config attribute k8s_auto_registration
is set to true.
This results in any newly created instances of Helm charts being
exposed to the lifecycle management features Robin provides without
any user intervention. However there are certain caveats to utilizing this feature:
In order for an application to be auto registered there has to exist an underlying file collection with free space as a generic bundle for the release will be created and added.
Only Helm releases deployed in namespaces which are imported into Robin will be automatically registered.
One of the following combinations of labels must be present within the objects deployed by the release. Either both the
app
andrelease
labels must be present within the aforementioned objects or both theapp.kubernetes.io/name
andapp.kubernetes.io/instance
labels must be present.Releases that were created previously in namespaces that have since been imported into Robin will not be picked up immediately. As a result there will be an initial delay before the application is made visible to Robin users. Of course, one is always able to manually register the pre-existing application to hasten this process.
If two Helm releases with the same name are deployed in different imported namespaces, Robin CNP does not auto-register the second app with the same name. Instead it must be registered manually using the
robin app register
command as shown below.Note
If you want to use storage-compute-affinity and network-planning features using Robin annotations, do not use the nodeName field in the spec.
11.5.1. Register a Helm3 Release¶
As Helm3 is configured on all hosts within the Robin cluster as part of the Robin Platform installation, there is no need for any additional setup. Thus the following example showcases user1, who is a member of Tenant t1 with namespace t003-u000004, registering a deployed Helm3 release.
Log in as user1:
# robin login user1
Password: <user1_password>
User user1 is logged into t1 tenant
Get the current user context for user1:
The robin whoami
command returns useful information about the
current Robin Platform user. It includes a list of tenants the user is a
member of (user1 is only a member of one tenant) and which tenant
they are currently logged into. Additionally, the whoami output
includes the Kubernetes namespace that has been assigned to the user
for their current tenant. This is the namespace the Helm chart needs
to be installed into.
# robin whoami
username: user1
tenant: t1
tenants: ['t1']
namespace: t003-u000004
session_expires: 2020-01-24T11:53:02
Add the bitnami Helm repo for the current user:
# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
Install the bitnami/mysql Helm chart:
With respect to the helm command line below, note that
persistence.storageClass
is set equal to ‘robin’. Using Robin
Storage is a requirement for Helm release registration with Robin. Also note the inclusion of the current user’s assigned
namespace in the Helm command line. The --namespace
parameter specifies which Kubernetes namespace the application
resources will be bound to.
# helm install demo bitnami/mysql --set global.storageClass=robin --namespace t003-u000004
NAME: demo
LAST DEPLOYED: Thu Aug 19 22:23:54 2021
NAMESPACE: t003-u000004
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
mysqldb.t003-u000004.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace t003-u000004 mysqldb -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h mysqldb -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/mysqldb 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
Get the Helm3 release name:
# helm list --namespace t003-u000004
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysqldb t003-u000004 1 2020-10-06 03:37:21.126307438 +0000 UTC deployed mysql-1.6.7 5.7.30
Manually register Helm3 release as a HELM Application:
# robin app register mysqldb --app helm/mysqldb -n t003-u000004
Job: 114 Name: K8SAppRegister State: PREPARED Error: 0
Job: 114 Name: K8SAppRegister State: COMPLETED Error: 0
Note
If the k8s_auto_registration
config attribute is enabled and all of the aforementioned necessary conditions are met this step need not be performed.
Verify that the app is registered with Robin:
# robin app list
Helm/Flex Apps:
+----------+------+--------+----------------------+--------------+-----------+---------+
| Name | Type | State | Owner/Tenant | Namespace | Snapshots | Backups |
+----------+------+--------+----------------------+--------------+-----------+---------+
| mysqldb | helm | ONLINE | user1/t1 | t003-u000004 | 0 | 0 |
+----------+------+--------+----------------------+--------------+-----------+---------+
Get detailed information about the resulting application:
# robin app info mysqldb
Name : mysqldb
Kind : helm
State : ONLINE
Number of repos : 0
Number of snapshots : 0
Number of usable backups : 0
Number of archived/failed backups : 0
Query:
-------
{'apps': ['helm/mysqldb@t003-u000004'], 'namespace': 't003-u000004', 'selectors': [], 'resources': []}
11.5.2. Register a Helm2 Release¶
Note
Support for Helm 2 and Tiller is deprecated. As a result no native Robin commands are provided to facilitate the deployment of Helm 2 and the onus is on the user to ensure Helm 2/Tiller are deployed appropriately. However charts deployed via Helm 2 can still be registered with Robin.
Following is a step-by-step walkthrough, detailing how the Helm environment needs to configured for a Robin user, how to install a Helm chart that generates a Helm release suitable for registration with Robin Platform, and how to perform a Helm release registration. Note that the initial steps must be performed by a superadmin user. The remaining steps are to be performed by the Robin Platform user.
The following example assumes superadmin user admin is setting up the Helm environment for Robin Platform user user1 who is a member of Tenant t1.
Log in as the superadmin user:
# robin login admin
Password: <admin_password>
User admin is logged into Administrators tenant
Generate a list of Robin Platform users:
# robin user list
ID | Username | Full Name | Email | Tenants | Current Tenant | Current Role | Current Namespace | Authentication
---+----------+---------------+-------+----------------+----------------+--------------+-------------------+----------------
3 | admin | Robin Systems | | Administrators | Administrators | superadmin | t001-u000003 | local
4 | user1 | | | t1 | t1 | user | t003-u000004 | local
Note the Current Namespace for user1: t003-u000004. The Kubernetes resources associated with Tiller (ServiceAccount and RoleBinding) need to be deployed within this namespace.
Log in as user1:
# robin login user1
Password: <user1_password>
User user1 is logged into t1 tenant
After logging in, ensure that the necessary CA cert and user cert/key are present within the .helm directory present in the user’s HOME directory. Once this is completely Helm 2 needs to be initialized within this namespace via the helm2 init
command or otherwise in order to deploy Tiller into the user’s assigned namespace.
Wait for Tiller to be deployed:
The below command needs to be repeated until no errors are returned.
# helm2 list --tls --tiller-namespace=t003-u000004
Error: could not find tiller
Add the bitnami Helm repo for the current user:
# helm2 repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
Install the bitnami/mysql Helm chart:
With respect to the helm2 command line below, note that
persistence.storageClass
is set equal to ‘robin’. Using Robin
Storage is a requirement for Helm release registration with Robin
Platform. Also note the inclusion of the current user’s assigned
namespace in two places in the Helm command line. The --namespace
parameter specifies which Kubernetes namespace the application
resources will be bound to. The --tiller-namespace
parameter
tells Helm which namespace Tiller has been deployed to. The namespace
for both parameters must be the same and it must be the namespace
assigned to the user by Robin Platform.
# helm2 install bitnami/mysql --tls --set persistence.storageClass=robin --namespace t003-u000004 --tiller-namespace=t003-u000004
NAME: billowing-tortoise
LAST DEPLOYED: Wed Jan 22 21:55:24 2020
NAMESPACE: t003-u000004
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME AGE
billowing-tortoise-mysql-test 0s
==> v1/Deployment
NAME AGE
billowing-tortoise-mysql 0s
==> v1/PersistentVolumeClaim
NAME AGE
billowing-tortoise-mysql 0s
==> v1/Pod(related)
NAME AGE
billowing-tortoise-mysql-d4f976d96-89x5c 0s
==> v1/Secret
NAME AGE
billowing-tortoise-mysql 0s
==> v1/Service
NAME AGE
billowing-tortoise-mysql 0s
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
billowing-tortoise-mysql.t003-u000004.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace t003-u000004 billowing-tortoise-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h billowing-tortoise-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/billowing-tortoise-mysql 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
Get the Helm2 release name:
Note that the --tls
flag is required for all Helm commands
because Helm and Tiller were configured to require the user’s TLS
cert and key (coped to the .helm directory in a previous step).
# helm list --tls --tiller-namespace=t003-u000004
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
billowing-tortoise 1 Wed Jan 22 21:55:24 2020 DEPLOYED mysql-1.6.2 5.7.28 t003-u000004
Manually register Helm2 release as a HELM Application:
# robin app register mysql --app helm/billowing-tortoise -n robinapps
Job: 114 Name: K8SAppRegister State: PREPARED Error: 0
Job: 114 Name: K8SAppRegister State: COMPLETED Error: 0
Note
If the k8s_auto_registration
config attribute is enabled and all of the aforementioned necessary conditions are met this step need not be performed.
Get a listing of all Robin Platform applications:
Note that the Robin Platform CLI command to list applications returns two application groupings. It returns a list of applications that were deployed by Robin Platform from Application Bundles. It will also include a list of applications that were registered with the cluster (Helm releases and FlexApps).
Also note that RBAC control limits which applications a user is able to view. A user who has been assigned the user role (user1 in this example) will only be able to view applications they own (created/registered). A user who has been assigned the tenantadmin role will be able to view all applications created/registered by all members of their tenant. A user who has been assigned the superadmin role (admin in this example) will be able to see all applications created/registered by all users across the entire cluster (e.g., for all tenants). Note that a user can only be superadmin if they are logged into the Administrators tenant.
# robin app list
ROBIN Bundle Apps:
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
| Name | Owner/Tenant | Type | Parent | Resource Pool | Vnodes | CPU | GPU | Memory (GB) | Status | LastOpr | Health | Error |
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
Helm/Flex Apps:
+--------+------+--------+--------------+--------------+-----------+---------+
| Name | Type | State | Owner/Tenant | Namespace | Snapshots | Backups |
+--------+------+--------+--------------+--------------+-----------+---------+
| mysql | helm | ONLINE | user1/t1 | t003-u000004 | 0 | 0 |
+--------+------+--------+--------------+--------------+-----------+---------+
Get detailed information about the resulting application:
# robin app info mysql
Name : mysql
Kind : helm
State : ONLINE
Number of repos : 0
Number of snapshots : 0
Number of usable backups : 0
Number of archived/failed backups : 0
Query:
-------
{'namespace': 't003-u000004', 'apps': ['helm/billowing-tortoise'], 'resources': [], 'selectors': []}
11.6. Robin FlexApp Applications¶
Robin Platform provides a very flexible mechanism for registering any
set of Kubernetes resources as a Robin Application. The FlexApp
construct uses label selector rules to group the resources together.
For example, --select app=apache --select app=mysql
would select
Pods and PVCs for a web and database tier together into a single
FlexApp object. To create a FlexApp, use this command:
# robin app register <app-name>
--selector <label-name>=<label-value>
--resource <resource-type>/<resource-name>
--namespace <namespace>
--dry-run
|
Name to assign to FlexApp |
|
Resources with these Kubernetes labels would be selected to be part of this FlexApp |
|
Resources of the specified type and name would be selected to be part of this FlexApp |
|
Namespace in which the Kubernetes resources are deployed. |
|
Using this option would display the kind, name and status of the objects to be picked up. Note, this will not register the application. |
Selecting resources that have more than one matching label (AND condition):
This is achieved by comma-seperating label name=value pairs as
follows: --select tier=frontend,env=dev
will select resources
that have both tier = frontend
AND env = dev
labels on it.
Selecting resources that have at least one of the matching labels (OR condition):
This is achieved by specifying the --select
option multiple times.
For example: --select env=dev --select env=prod
will select any
resource that has either env = dev
or env = prod
labels on
it.
Selecting resources of a certain type with matching labels:
Let’s say one wants to select only PersistentVolumeClaims and
StatefulSelect type resources with matching labels. That is, any
other resource with a matching label should not be selected. This is
achieved by specifying the resource name as a prefix to the label
name as follows: --select pvc,statefulset:tier=database
Explicitly selecting certain resources:
The --resource
option is used to specify explicitly which
Kubernetes resources are to be made part of the FlexApp. The format
to specify this is as follows: --resource
<resource-type>/<resource-name>
, where <resource-name>
is any
of the resources (“Kind”) that the Kubernetes cluster recognizes,
such as PersistentVolumeClaims (pvc), StatefulSets, Services, etc.
Running
kubectl api-resources
would list all valid values of<resource-type>
Running
kubectl get <resource-type>
would list all valid<resource-name>
of that specific resource type
11.7. Create an Application¶
Robin supports the creation of applications from a number of sources:
from-bundle |
Create an application from a ROBIN Application Bundle or Helm Bundle |
from-snapshot |
Create a clone of an existing application from one of the application’s snapshots |
from-backup |
Create a new application instance from an application backup |
11.7.1. Create an application from a Bundle¶
An application instance can be created from either Robin Application or Helm based Bundle with the following command:
# robin app create from-bundle <app_name> <bundleid> [<template>]
--rpool <rpool_name>
--ip-pools <ip_pools>
--restart-attempts <restart_num>
--namespace <namespace>
--disable-hooks
--disable-auto-relocate
--genplan
|
Application instance name |
|
Unique ID of the Application Bundle |
|
For Robin Bundle based applications the template name or pathname of template file can be specified. If not specified the default template generated from the bundle manifest will be used. For Helm based bundles, this parameter should point to the |
|
Name of the resource pool to use. This is a mandatory parameter for Robin Application Bundle based applications |
|
Name of IP pools from which to allocated IP addresses for the application |
|
Number of restart attempts when the app is in a failed state |
|
Kubernetes namespace in which the application will be deployed. If not specified, the application will be deployed within the users current namespace |
|
Disable hook scripts such that they do not run |
|
Disable auto relocate upon failure |
|
Only generate a plan for an application instead of deploying it |
Note
The following parameters are only applicable to Robin Application Bundle based applications: --rpool
, --ip-pools
, --restart-attempts
, --disable-hooks
, --disable-auto-relocate
, and --genplan
.
Example 1 (Creating a Robin Application Bundle based application):
# robin app create from-bundle mysql-a 1 mysql_template.json --rpool default --wait
Job: 178 Name: ApplicationCreate State: VALIDATED Error: 0
Job: 178 Name: ApplicationCreate State: WAITING Error: 0
Job: 178 Name: ApplicationCreate State: COMPLETED Error: 0
Example 2 (Creating a Helm bundle based application):
# robin app create from-bundle mysql-hb1 3 --wait
Job: 105 Name: K8SApplicationCreateHelm State: VALIDATED Error: 0
Job: 105 Name: K8SApplicationCreateHelm State: WAITING Error: 0
Job: 105 Name: K8SApplicationCreateHelm State: COMPLETED Error: 0
Creates an application instance from a Bundle.
End Point: /api/v3/robin_server/apps
Method: POST
URL Parameters: None
Data Parameters:
kind: ROBIN
- This mandatory field within the payload specifies that a Robin Bundle based application is to be created.name: <app_name>
- This mandatory field within the payload specifies the name of the application to be created.bundleid: <bundle_id>
- This mandatory field within the payload specifies the ID of the bundle from which the application will be created.rpool: <rpool_name>
- This mandatory field within the payload specifies the name of the resource pool in which the application will be created.template_json: <template>
- Utilizing this parameter within the payload, by specifying a dictionary representing the template in JSON format, results in the provided template and the parameters contained within it being used when the application is deployed. For Helm based bundles, this should be the JSON equivalent of thevalues.yaml
file for the chart. In order to indicate that the implicitly generated default template or default values of the bundle should be used specify an empty dictionary.template: <template_name>
- Utilizing this parameter within the payload, by specifying a string representing a template name, results in the template associated with the name being used during application deployment.ip_pools: <list_of_ippools>
- Utilizing this parameter within the payload, by specifying a comma seperated list of IP Pool names, results in an IP address being allocated from each specified IP Pool for the application.namespace: <namespace>
- Utilizing this parameter within the payload, by specifying a string representing a namespace name, results in the application being deployed in the aforementioned namespace. If not specified, the application will be deployed within the users current namespace.restart_num: <restart_num>
- Utilizing this parameter within the payload, by specifying an integer, results in the number of restart attempts in the case of application failure being set to the specified value. The default value is 15.auto_relocate: true
- Utilizing this parameter within the payload, by specifying a boolean value, determines whether or not the auto relocate functionality is enabled for the application in the case of failure. By default it is enabled.disable_hooks: true
- Utilizing this parameter within the payload, by specifying a boolean value, determines whether or not the hook scripts are enabled to be run during life cycle operations. By default hook scripts are enabled.genplan: true
- Utilizing this parameter within the payload results in only a plan being generated and returned for the application instead of an actual deployment taking place.
Note
The following parameters are only applicable to Robin Application Bundle based applications: rpool
, template
, ip_pools
, restart_num
, disable_hooks
, auto_relocate
, and genplan
.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error), 409 (Duplicate Resource Error)
Example Response:
Output
{
"plan":{
"enable_hooklogs":true,
"zoneid":1599768542,
"from_template":null,
"input_json":{
},
"roles":[
{
"multinode":true,
"restart_on_qoscfg":true,
"vnodes":[
{
"enable_hooklogs":true,
"enable_metrics":true,
"env":{
"ENABLE_SSH":{
"type":"boolean",
"value":true
},
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
}
},
"cpu":{
"min":0,
"reserve":false,
"max":1
},
"name":"demo-test.server.01",
"multinode":true,
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"gpu":{
"min":0,
"max":0
},
"mem":{
"hugepages_2m":0,
"size":209715200,
"hugepages_1g":0
},
"network":[
{
"ippool":"robin-default",
"name":"robin-default"
}
],
"enable_portmapping":true,
"storage":[
{
"compression":"disabled",
"stordriver":{
"media":"SSD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"disk_tags":{
},
"faultdomain":"host",
"workload":0,
"type":"data",
"pvcpolicy":"create",
"snapshot_space_limit":214748365,
"size":1073741824,
"replication":1,
"fstype":"ext4",
"media":"SSD",
"lvm_vol_count":"0",
"name":"none_server01_data01",
"snap_reserved":20,
"encryption":"none",
"blocksize":4096,
"protection":0,
"lvm_type":"None",
"layout":"round-robin",
"path":"\/data"
},
{
"compression":"disabled",
"stordriver":{
"media":"SSD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"disk_tags":{
},
"faultdomain":"host",
"workload":0,
"type":"block",
"pvcpolicy":"create",
"snapshot_space_limit":214748365,
"size":1073741824,
"replication":1,
"fstype":"raw",
"media":"SSD",
"lvm_vol_count":"0",
"name":"none_server01_block01",
"snap_reserved":20,
"encryption":"none",
"blocksize":4096,
"protection":0,
"lvm_type":"None",
"layout":"round-robin",
"path":"\/dev\/rda"
}
]
}
],
"image":{
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"init_mode":false,
"version":"7",
"engine":"docker"
},
"name":"server",
"display_name":"server",
"qgroups":{
"data":{
"wr_min_window":500,
"enabled":false,
"wr_weight":1,
"rd_weight":1,
"rd_min_iops":0,
"rd_min_window":500,
"wr_min_iops":0,
"wr_max_iops":2000000,
"priority":1,
"rd_max_iops":2000000
},
"block":{
"wr_min_window":500,
"enabled":false,
"wr_weight":1,
"rd_weight":1,
"rd_min_iops":0,
"rd_min_window":500,
"wr_min_iops":0,
"wr_max_iops":2000000,
"priority":1,
"rd_max_iops":2000000
}
}
}
],
"kind":"ROBIN",
"rpool":"default",
"name":"demo-test",
"content_id":"2de2c0c8a93db5b68943f85c8b382e46",
"snapshot":"enabled",
"pvcpolicy":"create",
"robin_version":"5.3.0-225",
"enable_metrics":true,
"rpoolid":1,
"version":"7",
"restart_num":15,
"auto_relocate":true,
"namespace":"random",
"tenant":"Administrators",
"username":"robin",
"bundleid":"1",
"app_ns":"random",
"clone":"enabled"
},
"jobid":547
}
11.7.2. Create an application from a snapshot¶
In addition to providing for disaster recovery, application snapshots allow for the creation of an exact copy, or clone of an application instance. Creating a clone of an existing application instance can be very useful. For example, it allows for reports to be run on a database without affecting the source database application, for UAT tests, for validating patches before applying them to the production database, etc.
Cloning an application has typically required significant manual or
scripting work and coordination across the storage layer and the
application metadata layer (Kubernetes Pod, StatefulSet, PVC, Service
etc). With Robin one can clone an entire application or application
stack with one single command robin app create from-snapshot
. Running this
command creates a clone of an entire application from a previously
taken application snapshot. Once complete the application is ready
for use right away.
Changes made to the clone are not visible in the parent application from which the clone was created. Similarly, any changes made to the parent application are not visible to the clone. At the storage layer, Robin’s thin cloning technology is leveraged. Which means that a cloned PersistentVolume is not a physical copy of the source volume. Instead, it is a virtual copy, where only metadata is physically copied with the actual data being shared between the clone and the source. Changes made to either the clone or the source are localized into their own writable data streams, whereas any common unmodified data is shared.
A clone of an existing application instance can be created from an application snapshot with the following command:
# robin app create from-snapshot <app_name> <snapshotid>
--rpool <rpool_name>
--ip-pools <ip_pools>
--role-ip-pools <role_pools>
--role-vnode-hostnames <role_vnode_hosts>
--role-cpus <role_cpus>
--role-gpus <role_gpus>
--role-mem <role_mem>
|
Application instance name |
|
Unique ID of the application snapshot |
|
Name of the resource pool to use. This is a mandatory parameter for clones of Robin Bundle based applications and does not apply to Helm based applications |
|
Name of IP pool from which to allocate IP address of clone. This parameter only applies to clones of Robin Bundle based applications |
|
Comma separated list of IP Pools for a role in the format: |
|
Comma separated list of vnode hostnames for a role in the format: |
|
CPU count for a role in the format: |
|
GPU count for a role in the format: |
|
Memory for a role in the format: |
Note
All of the role specific parameters can be specified multiple times for different roles.
Example 1 (Create a clone of a Robin app from a snapshot):
# robin app create from-snapshot mysql-c1 ec2bdeba447211eaa2028d14cd0bbca6 --rpool default --wait
Job: 187 Name: ApplicationClone State: VALIDATED Error: 0
Job: 187 Name: ApplicationClone State: WAITING Error: 0
Job: 187 Name: ApplicationClone State: FINALIZED Error: 0
Job: 187 Name: ApplicationClone State: COMPLETED Error: 0
Example 2 (Create a clone (FLEX app) of a HELM app from a snapshot):
# robin app create from-snapshot mysql1-c1 d17d19f044ba11ea8e7831d18d69fbab --wait
Job: 198 Name: K8SApplicationClone State: PREPARED Error: 0
Job: 198 Name: K8SApplicationClone State: AGENT_WAIT Error: 0
Job: 198 Name: K8SApplicationClone State: COMPLETED Error: 0
Clones an existing application instance using a snapshot of the aformentioned application.
End Point: /api/v3/robin_server/apps/<snapshot_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: clone
- This mandatory field within the payload specifies that the clone operation should be performed.clonename: <app_name>
- This mandatory field within the payload specifies the name of the clone to be created.rpool: <rpool_name>
- This mandatory field within the payload specifies the name of the resource pool in which the clone will be created.cloneconfig: <clone_config>
- This mandatory field within the payload specifies the base configuration of the clone. Within each role of the configuration one can edit thevnode_hostnames
section, and within each vnode for the role the following attributes can be updated:network
, the max value ofcpu
, the max value ofgpu
, and the size value ofmem
.
Note
The base config of the clone is the JSON spec file associated with the respective snapshot.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"enable_hooklogs":true,
"snapname":"snapshot-1602011804",
"zoneid":"1599768542",
"from_template":null,
"planid":6,
"app_ns":"t001-u000005",
"roles":[
{
"name":"server",
"multinode_min":1,
"qgroups":{
"data":{
"wr_min_window":500,
"enabled":false,
"wr_min_iops":0,
"wr_weight":1,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"priority":1,
"rd_max_iops":2000000
},
"root_fs":{
"wr_min_window":500,
"enabled":false,
"wr_min_iops":0,
"wr_weight":1,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"priority":1,
"rd_max_iops":2000000
},
"block":{
"wr_min_window":500,
"enabled":false,
"wr_min_iops":0,
"wr_weight":1,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"priority":1,
"rd_max_iops":2000000
}
},
"vnodes":[
{
"enable_hooklogs":true,
"role_name":"server",
"restart_num":15,
"state":"STARTED",
"host_ip":"172.21.19.191",
"jobid":165,
"rpoolid":1,
"name":"demo-clone.server.01",
"gpu":{
"type":"",
"max":0,
"count":0
},
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
],
"kubernetes.io\/os":[
"linux"
]
},
"calico_inuse":true,
"enable_portmapping":true,
"utime":1600437863,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1599768866069\/1600437790650\/centos-7",
"allocated":{
"zonename":"default",
"nodename":"vnode-95-18",
"zoneid":1599768542,
"nodeid":3
},
"cpu":{
"min":0,
"max":1,
"reserve":false,
"nonisol":true
},
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSJtWucW0WsDJkGDdcov6bUGiZlPvMyREwWYS6V1H+bl1B7cql4E7KPC4A9M0TZGKpvaczcsW8wkGl1Xh70O8uVShpn45nQERLI\/P2teNB4CXhQFny1IvW3Jahv+XgvuSC9ZmoZu1E\/LPYXMsZ7CtfVzCduVtPpp7YeL8ybndPD9RuMLFWfKEKBocym7b95+2CKiNT4adQhUqMqAk4SUvLZLIWhqyFnuMnykzXrqobYKkdaRPgHf0JXYSBaqMbzwkld8UhMkv5RymueFnzsIebc0goy3MnbxEV+nVQ77BUh025jr+4MfseCSRexbedtQ3vp3ODy\/+pcU0TxqbfPuN3 root@vnode-95-42.robinsystems.com"
],
"service_ports":[
],
"bundle_object_id":"2de2c0c8a93db5b68943f85c8b382e46",
"appname":"demo",
"env":{
"ENABLE_SSH":{
"type":"boolean",
"value":true
},
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
}
},
"allocated_host_type":"physical",
"bundleid":"1",
"k8s_provider":"robin",
"vnodehookargs":{
"postcreate":[
]
},
"allocated_host_public_hostname":"vnode-95-18.robinsystems.com",
"engine":"docker",
"role":"server",
"disable_vnodehooks":false,
"enable_metrics":true,
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000005.svc.cluster.local",
"allocated_host_public_ip":"10.9.95.18",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"id":1,
"mem":{
"hugepages_2m":0,
"size":2013265920,
"hugepages_1g":0
},
"network":[
{
"name":"robin-default",
"interfaces":1,
"driver":"calico",
"allocated_prefix":16,
"allocated_names":[
"eth0"
],
"subnet":"172.21.0.0",
"allocated_ip":"172.21.19.191",
"ippool":"robin-default",
"allocated_by":"system",
"allocated_netmask":"255.255.0.0"
}
],
"appid":1,
"desired_status":"ONLINE",
"storage":[
{
"device":"\/dev\/sdc",
"volgrp_name":"demo.server.01.72.1.d98c2f1d-bed6-46a1-a1b8-5df11f5e5289",
"type":"data",
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"fstype":"ext4",
"media":"HDD",
"name":"demo-clone.server.01.data.1.41da8189-b80b-44e2-ab7e-19c28a9d48ef",
"snap_reserved":20,
"lvm_vol_count":"0",
"protection":0,
"pvcpolicy":"create",
"k8s_name":"demo-server-01-data-1-55121b5e",
"lvm_type":"None",
"parent_vol":{
"current_snapshot":"active_snap",
"vtype":0,
"partitions":0,
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"params":{
},
"name":"demo.server.01.data.1.55121b5e-ca30-47f5-9be8-3b80a2c837e1",
"block_size":4096,
"appid":1,
"protection":0,
"next_backupid":1,
"priority":2,
"resource_poolid":1,
"compression":0,
"current_snapshotid":1,
"next_snapshotid":2,
"size":1073741824,
"replication":1,
"qgroupid":3,
"appname":"default",
"slice_size":1073741824,
"snapshot_space_limit":536870912,
"snapname":"snapshot-1602011804",
"volumeid":"4",
"genkey":1600437814337784,
"media":72,
"grpid":3,
"multinode_mounting":false
},
"compression":"0",
"disk_tags":{
},
"faultdomain":"host",
"encryption":"none",
"size":1073741824,
"vol_ns":"t001-u000005",
"replication":1,
"workload":0,
"snapshot_space_limit":536870912,
"blocksize":4096,
"layout":"round-robin",
"path":"\/data",
"snapname":"snapshot-1602011804"
},
{
"device":"\/dev\/sdd",
"volgrp_name":"demo.server.01.72.1.388f1aaf-fd51-43d6-be0b-4461d5f44063",
"type":"block",
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"fstype":"raw",
"media":"HDD",
"name":"demo-clone.server.01.block.1.496cdedc-cd44-4984-b75f-dac9c55bea13",
"snap_reserved":20,
"lvm_vol_count":"0",
"protection":0,
"pvcpolicy":"create",
"k8s_name":"demo-server-01-block-1-cddb023c",
"lvm_type":"None",
"parent_vol":{
"current_snapshot":"active_snap",
"vtype":0,
"partitions":0,
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"params":{
},
"name":"demo.server.01.block.1.cddb023c-f1c4-4d1d-9973-c0548510617f",
"block_size":4096,
"appid":1,
"protection":0,
"next_backupid":1,
"priority":2,
"resource_poolid":1,
"compression":0,
"current_snapshotid":1,
"next_snapshotid":2,
"size":1073741824,
"replication":1,
"qgroupid":2,
"appname":"default",
"slice_size":1073741824,
"snapshot_space_limit":536870912,
"snapname":"snapshot-1602011804",
"volumeid":"3",
"genkey":1600437814328082,
"media":72,
"grpid":4,
"multinode_mounting":false
},
"compression":"0",
"disk_tags":{
},
"faultdomain":"host",
"encryption":"none",
"size":1073741824,
"vol_ns":"t001-u000005",
"replication":1,
"workload":0,
"snapshot_space_limit":536870912,
"blocksize":4096,
"layout":"round-robin",
"path":"\/dev\/rda",
"snapname":"snapshot-1602011804"
},
{
"device":"\/dev\/sde",
"volgrp_name":"demo.server.01.72.1.84a67da9-3839-49db-a967-0c7ed3f191d2",
"type":"root_fs",
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"fstype":"xfs",
"media":"HDD",
"name":"demo-clone.server.01.root_fs.1.72719c18-04f6-4f9b-b2a9-8284afa14516",
"snap_reserved":20,
"lvm_vol_count":"0",
"protection":0,
"pvcpolicy":"create",
"k8s_name":"demo-server-01-root-fs-1-03999d04",
"lvm_type":"None",
"parent_vol":{
"current_snapshot":"active_snap",
"vtype":0,
"partitions":0,
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"nofd",
"protection":"0"
},
"params":{
},
"name":"demo.server.01.root_fs.1.03999d04-597d-4db9-9f02-3571a816eca6",
"block_size":4096,
"appid":1,
"protection":0,
"next_backupid":1,
"priority":2,
"resource_poolid":1,
"compression":0,
"current_snapshotid":1,
"next_snapshotid":2,
"size":1073741824,
"replication":1,
"qgroupid":4,
"appname":"default",
"slice_size":1073741824,
"snapshot_space_limit":536870912,
"snapname":"snapshot-1602011804",
"volumeid":"5",
"genkey":1600437814342977,
"media":72,
"grpid":5,
"multinode_mounting":false
},
"compression":"0",
"disk_tags":{
},
"faultdomain":"host",
"encryption":"none",
"size":1073741824,
"vol_ns":"t001-u000005",
"replication":1,
"workload":0,
"snapshot_space_limit":536870912,
"blocksize":4096,
"layout":"round-robin",
"path":"\/",
"snapname":"snapshot-1602011804"
}
],
"restart_on_qoscfg":true,
"service_uids":[
],
"ctime":1600437863,
"vnodeid":1,
"image":{
"name":"robinsys\/centos",
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"registry_port":"",
"init_mode":false,
"registry_name":"Docker Hub",
"engine":"docker"
},
"allocated_host":"vnode-95-18.robinsystems.com",
"sidecar_info":{
"gpu":0,
"hugepages_2m":0,
"mem":0,
"containers":[
],
"cpu":0,
"hugepages_1g":0
}
}
],
"restart_on_qoscfg":true,
"elastic_ip_enabled":false,
"multinode_max":256,
"image":{
"name":"robinsys\/centos",
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"registry_port":"",
"init_mode":false,
"registry_name":"Docker Hub",
"engine":"docker"
},
"multinode":true,
"display_name":"server",
"scaleout":"enabled"
}
],
"local_avail":true,
"enable_metrics":true,
"stordriver":"das",
"rpool":"default",
"name":"demo-clone",
"id":1,
"namespace":"t001-u000005",
"from_backup":false,
"snapshot":"enabled",
"original_app_owner":5,
"pvcpolicy":"create",
"parent_last_known_state":6,
"content_id":"2de2c0c8a93db5b68943f85c8b382e46",
"rpoolid":1,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1599768866069\/1600437790650\/centos-7",
"version":"7",
"restart_num":15,
"bundle_object_id":"2de2c0c8a93db5b68943f85c8b382e46",
"auto_relocate":true,
"original_app_tenant":1,
"op_clone":true,
"clone":"enabled",
"tenant":"Administrators",
"username":"robin",
"bundleid":"1",
"master_name":"demo",
"desc":{
},
"parentid":4
},
"jobid":552
}
11.7.3. Create an application from a backup¶
A application instance can be created from an application backup with the following command:
# robin app create from-backup <app_name> <backupid> --rpool <rpool_name> --ip-pools <ip_pools> --restart-attempts <restart_num> --namespace <namespace> --media <media> --disable-hooks --same-name-namespace --disable-auto-relocate --genplan --start-hydration
app_name
Application instance name
backupid
Unique ID of the Application backup
--rpool <rpool_name>
Name of the resource pool to use. This is a mandatory parameter for Robin Bundle based applications and is not applicable to Helm based applications
--ip-pools <ip_pools>
Name of IP pools from which to allocated IP addresses for the imported application. Note this option is only valid for Robin Bundle based applications
--restart-attempts <restart_num>
Number of restart attempts when the app is in a failed state. Note this option is only valid for Robin Bundle based applications
--namespace <namespace>
Kubernetes namespace in which the application will be deployed
--media <media>
Specify the media type to be used for the volumes of the imported app. Valid values include: ‘HDD’, ‘SSD’. Note this option is only valid for Robin Bundle based applications
--disable-hooks
Disable hook scripts such that they do not run. Note this option is only valid for Robin Bundle based applications
--same-name-namespace
Keep original helm app name and namespace. Note: When you use the
--same-name-namespace
option, you must use the--namesapce
option as well and provide same namespace name and app name as the source cluster. This is required even when you create applications in thedefault
namespace.
--disable-auto-relocate
Disable auto relocate upon failure. Note this option is only valid for Robin Bundle based applications
--genplan
Only generate a plan for an application instead of deploying it. Note this option is only valid for Robin Bundle 3ased applications
Example 1 (Create a Robin app from a backup):
# robin app create from-backup mysql-b2 ee529688447211eabaf85b58e9f190fd --rpool default --wait Job: 182 Name: ApplicationCreate State: VALIDATED Error: 0 Job: 182 Name: ApplicationCreate State: WAITING Error: 0 Job: 182 Name: ApplicationCreate State: COMPLETED Error: 0Example 2 (Create a FLEX app from the backup of a Helm app):
# robin app create from-backup mysql1-b2 952f3738447211ea99cee7cd7390d6c9 --wait Job: 181 Name: K8SApplicationCreate State: PREPARED Error: 0 Job: 181 Name: K8SApplicationCreate State: AGENT_WAIT Error: 0 Job: 181 Name: K8SApplicationCreate State: COMPLETED Error: 0
Example 3 (create a helm app from the helm app backup):
You can create an application from the helm backup using the following command.
Note
When you use the
--same-name-namespace
option, you must use the--namesapce
option as well and provide same namespace name and app name as the source cluster. This is required even when you create applications in thedefault
namespace.# robin app create from-backup postgres1 3beae40a310311eeb54edb39ed734caf --same-name-namespace --namespace default --start-hydration
Imports an application instance from a backup. Note this is a two step process as outlined by the example API requests detailed below.
Retrieving the backup config
End Point: /api/v3/robin_server/storage_repo
Method: GET
URL Parameters:
sub-command: get-backup-info
- This mandatory parameter within the url specifies that detailed information about the backup should be retrieved.backupid: <backupid>
- This mandatory parameter within the url specifies the ID of the backup for which to retrieve the configuration of.
Data Parameters: NonePort: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error), 404 (Not Found Error)
Example Response:
Output
{ "data":[ { "zoneid":1599768542, "bundle_name":"centos-7", "backupname":"demo_backup-1602011804", "bundle_object_id":"2de2c0c8a93db5b68943f85c8b382e46", "backup_kind":"robin-platform-backup", "size":369098752, "config":{ "enable_hooklogs":true, "parentid":1, "zoneid":"1599768542", "from_template":null, "username":"user1", "parent_last_known_state":6, "enable_metrics":true, "stordriver":"das", "rpoolid":1, "desc":{ }, "namespace":"t001-u000005", "content_id":"2de2c0c8a93db5b68943f85c8b382e46", "snapshot":"enabled", "pvcpolicy":"create", "bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1599768866069\/1600437790650\/centos-7", "version":"7", "auto_relocate":true, "rpool":"default", "name":"none", "tenant":"Administrators", "app_ns":"t001-u000005", "bundleid":1, "roles":[ { "multinode_max":256, "vnodes":[ { "enable_hooklogs":true, "role_name":"server", "host_ip":"172.21.19.191", "jobid":165, "name":"demo.server.01", "calico_inuse":true, "env":{ "ENABLE_SSH":{ "type":"boolean", "value":true }, "ROOT_PASSWORD":{ "type":"password", "value":"" }, "DOCKER_OPTS":{ "type":"text", "value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN" } }, "service_ports":[ ], "cpu":{ "min":0, "reserve":false, "max":1, "nonisol":true }, "k8s_provider":"robin", "engine":"docker", "allocated_host_public_hostname":"vnode-95-18.robinsystems.com", "disable_vnodehooks":false, "enable_metrics":true, "allocated_host_public_ip":"10.9.95.18", "vnodehooks":{ "postcreate":"bash postcreate.sh" }, "mem":{ "hugepages_2m":0, "size":2013265920, "hugepages_1g":0 }, "network":[ { "ippool":"robin-default" } ], "enable_portmapping":true, "desired_status":"ONLINE", "storage":[ { "device":"\/dev\/sdc", "type":"data", "workload":0, "fstype":"ext4", "media":"HDD", "lvm_vol_count":"0", "name":"demo.server.01.data.1.55121b5e-ca30-47f5-9be8-3b80a2c837e1", "snap_reserved":20, "import_app":true, "stordriver":{ "media":"HDD", "type":"das", "faultdomain":"nofd", "protection":"0" }, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "compression":"0", "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "vol_ns":"t001-u000005", "replication":1, "import_data_source":{ "zoneid":"1599768542", "backup_path_prefix":"1599768542\/demo_1\/None", "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"4", "backupid":1, "appname":"default" }, "snapshot_space_limit":536870912, "blocksize":4096, "layout":"round-robin", "path":"\/data", "snapname":"snapshot-1602011804" }, { "device":"\/dev\/sdd", "type":"block", "workload":0, "fstype":"raw", "media":"HDD", "lvm_vol_count":"0", "name":"demo.server.01.block.1.cddb023c-f1c4-4d1d-9973-c0548510617f", "snap_reserved":20, "import_app":true, "stordriver":{ "media":"HDD", "type":"das", "faultdomain":"nofd", "protection":"0" }, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "compression":"0", "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "vol_ns":"t001-u000005", "replication":1, "import_data_source":{ "zoneid":"1599768542", "backup_path_prefix":"1599768542\/demo_1\/None", "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"3", "backupid":1, "appname":"default" }, "snapshot_space_limit":536870912, "blocksize":4096, "layout":"round-robin", "path":"\/dev\/rda", "snapname":"snapshot-1602011804" }, { "device":"\/dev\/sde", "type":"root_fs", "workload":0, "fstype":"xfs", "media":"HDD", "lvm_vol_count":"0", "name":"demo.server.01.root_fs.1.03999d04-597d-4db9-9f02-3571a816eca6", "snap_reserved":20, "import_app":true, "stordriver":{ "media":"HDD", "type":"das", "faultdomain":"nofd", "protection":"0" }, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "compression":"0", "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "vol_ns":"t001-u000005", "replication":1, "import_data_source":{ "zoneid":"1599768542", "backup_path_prefix":"1599768542\/demo_1\/None", "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"5", "backupid":1, "appname":"default" }, "snapshot_space_limit":536870912, "blocksize":4096, "layout":"round-robin", "path":"\/", "snapname":"snapshot-1602011804" } ], "restart_on_qoscfg":true, "service_uids":[ ], "gpu":{ "type":"", "max":0, "count":0 }, "sidecar_info":{ "gpu":0, "hugepages_2m":0, "mem":0, "containers":[ ], "cpu":0, "hugepages_1g":0 } } ], "volume_groups":[ ], "multinode_min":1, "image":{ "name":"robinsys\/centos", "version":"7", "registry_hostname":"", "entrypoint":"entry.sh", "engine":"docker", "init_mode":false, "registry_name":"Docker Hub", "registry_port":"" }, "name":"server", "display_name":"server", "multinode":true, "scaleout":"enabled", "elastic_ip_enabled":false, "restart_on_qoscfg":true, "qgroups":{ "data":{ "wr_min_window":500, "enabled":false, "wr_weight":1, "rd_min_iops":0, "wr_max_iops":2000000, "rd_weight":1, "wr_min_iops":0, "rd_min_window":500, "priority":1, "rd_max_iops":2000000 }, "root_fs":{ "wr_min_window":500, "enabled":false, "wr_weight":1, "rd_min_iops":0, "wr_max_iops":2000000, "rd_weight":1, "wr_min_iops":0, "rd_min_window":500, "priority":1, "rd_max_iops":2000000 }, "block":{ "wr_min_window":500, "enabled":false, "wr_weight":1, "rd_min_iops":0, "wr_max_iops":2000000, "rd_weight":1, "wr_min_iops":0, "rd_min_window":500, "priority":1, "rd_max_iops":2000000 } } } ], "master_name":"demo", "clone":"enabled", "snapname":"snapshot-1602011804" }, "repo_name":"demo-backup", "appname":"demo" } ] }
Note
The
config
section within the above detailed response will be used when creating the application.Creating the application
End Point: /api/v3/robin_server/apps
Method: POST
URL Parameters: None
Data Parameters:
name: <app_name>
- This mandatory field within the payload specifies the name of the application to be created.rpool: <rpool_name>
- This mandatory field within the payload specifies the name of the resource pool in which the application will be created.ip_pools: <list_of_ippools>
- Utilizing this parameter within the payload, by specifying a comma seperated list of IP Pool names, results in an IP address being allocated from each specified IP Pool for the application.namespace: <namespace>
- Utilizing this parameter within the payload, by specifying a string representing a namespace name, results in the application being deployed in the aforementioned namespace. If not specified, the application will be deployed within the users current namespace.restart_num: <restart_num>
- Utilizing this parameter within the payload, by specifying an integer, results in the number of restart attempts in the case of application failure being set to the specified value. The default value is 15.auto_relocate: false
- Utilizing this parameter within the payload, by specifying a boolean value, determines whether or not the auto relocate functionality is enabled for the application in the case of failure. By default it is enabled.disable_hooks: true
- Utilizing this parameter within the payload, by specifying a boolean value, determines whether or not the hook scripts are enabled to be run during life cycle operations. By default hook scripts are enabled.genplan: true
- Utilizing this parameter within the payload results in only a plan being generated and returned for the application instead of an actual deployment taking place.
Note
The main body of the request should be the config of the respective backup with the above parameters updated within the dictionary.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error), 409 (Duplicate Resource Error)
Example Response:
Output
{ "plan":{ "enable_hooklogs":true, "repo_name":"demo-backup", "from_template":null, "app_ns":"random", "roles":[ { "multinode_max":256, "vnodes":[ { "enable_hooklogs":true, "host_ip":"172.21.19.191", "calico_inuse":true, "disable_vnodehooks":false, "enable_metrics":true, "jobid":165, "allocated_host_public_ip":"10.9.95.18", "vnodehooks":{ "postcreate":"bash postcreate.sh" }, "gpu":{ "type":"", "max":0, "count":0 }, "sidecar_info":{ "gpu":0, "hugepages_2m":0, "mem":0, "containers":[ ], "cpu":0, "hugepages_1g":0 }, "network":[ { "ippool":"robin-default", "name":"robin-default" } ], "enable_portmapping":true, "desired_status":"ONLINE", "storage":[ { "device":"\/dev\/sdc", "compression":"0", "type":"data", "workload":0, "fstype":"ext4", "media":"HDD", "lvm_vol_count":"0", "name":"demo-backup.server.data.1.b8eb9993-eba6-4f1d-af2c-fa358d9aa072", "import_app":true, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "snap_reserved":20, "stordriver":{ "media":"HDD", "protection":"0", "faultdomain":"nofd", "type":"das" }, "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "blocksize":4096, "vol_ns":"t001-u000005", "replication":1, "snapshot_space_limit":536870912, "import_data_source":{ "zoneid":"1599768542", "backupid":1, "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"4", "backup_path_prefix":"1599768542\/demo_1\/7e5ff5e4080811eba645317fc88a69a0", "appname":"default" }, "layout":"round-robin", "path":"\/data", "snapname":"snapshot-1602011804" }, { "device":"\/dev\/sdd", "compression":"0", "type":"block", "workload":0, "fstype":"raw", "media":"HDD", "lvm_vol_count":"0", "name":"demo-backup.server.block.1.54037c86-96c0-4d60-8c47-279c87afe957", "import_app":true, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "snap_reserved":20, "stordriver":{ "media":"HDD", "protection":"0", "faultdomain":"nofd", "type":"das" }, "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "blocksize":4096, "vol_ns":"t001-u000005", "replication":1, "snapshot_space_limit":536870912, "import_data_source":{ "zoneid":"1599768542", "backupid":1, "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"3", "backup_path_prefix":"1599768542\/demo_1\/7e5ff5e4080811eba645317fc88a69a0", "appname":"default" }, "layout":"round-robin", "path":"\/dev\/rda", "snapname":"snapshot-1602011804" }, { "device":"\/dev\/sde", "compression":"0", "type":"root_fs", "workload":0, "fstype":"xfs", "media":"HDD", "lvm_vol_count":"0", "name":"demo-backup.server.root_fs.1.3be39c61-ce26-424b-b0b2-a6baddeb6065", "import_app":true, "protection":0, "lvm_type":"None", "pvcpolicy":"create", "snap_reserved":20, "stordriver":{ "media":"HDD", "protection":"0", "faultdomain":"nofd", "type":"das" }, "disk_tags":{ }, "faultdomain":"host", "encryption":"none", "size":1073741824, "blocksize":4096, "vol_ns":"t001-u000005", "replication":1, "snapshot_space_limit":536870912, "import_data_source":{ "zoneid":"1599768542", "backupid":1, "appid":1, "blocksize":4096, "current_snapshotid":1, "volumeid":"5", "backup_path_prefix":"1599768542\/demo_1\/7e5ff5e4080811eba645317fc88a69a0", "appname":"default" }, "layout":"round-robin", "path":"\/", "snapname":"snapshot-1602011804" } ], "service_ports":[ ], "service_uids":[ ], "cpu":{ "min":0, "reserve":false, "max":1, "nonisol":true }, "restart_on_qoscfg":true, "mem":{ "hugepages_2m":0, "size":2013265920, "hugepages_1g":0 }, "role_name":"server", "name":"demo-backup.server.01", "env":{ "ENABLE_SSH":{ "type":"boolean", "value":true }, "ROOT_PASSWORD":{ "type":"password", "value":"" }, "DOCKER_OPTS":{ "type":"text", "value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN" } }, "k8s_provider":"robin", "allocated_host_public_hostname":"vnode-95-18.robinsystems.com", "engine":"docker" } ], "volume_groups":[ ], "name":"server", "multinode_min":1, "image":{ "name":"robinsys\/centos", "version":"7", "registry_hostname":"", "entrypoint":"entry.sh", "engine":"docker", "init_mode":false, "registry_name":"Docker Hub", "registry_port":"" }, "multinode":true, "display_name":"server", "scaleout":"enabled", "elastic_ip_enabled":false, "restart_on_qoscfg":true, "qgroups":{ "data":{ "wr_min_window":500, "enabled":false, "wr_min_iops":0, "wr_weight":1, "rd_weight":1, "rd_min_window":500, "rd_min_iops":0, "wr_max_iops":2000000, "priority":1, "rd_max_iops":2000000 }, "root_fs":{ "wr_min_window":500, "enabled":false, "wr_min_iops":0, "wr_weight":1, "rd_weight":1, "rd_min_window":500, "rd_min_iops":0, "wr_max_iops":2000000, "priority":1, "rd_max_iops":2000000 }, "block":{ "wr_min_window":500, "enabled":false, "wr_min_iops":0, "wr_weight":1, "rd_weight":1, "rd_min_window":500, "rd_min_iops":0, "wr_max_iops":2000000, "priority":1, "rd_max_iops":2000000 } } } ], "enable_metrics":true, "stordriver":"das", "rpoolid":1, "namespace":"random", "zoneid":1599768542, "parentid":1, "snapshot":"enabled", "pvcpolicy":"create", "content_id":"2de2c0c8a93db5b68943f85c8b382e46", "bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1599768866069\/1600437790650\/centos-7", "version":"7", "restart_num":15, "auto_relocate":true, "parent_last_known_state":6, "name":"demo-backup", "clone":"enabled", "tenant":"Administrators", "username":"robin", "rpool":"default", "bundleid":1, "master_name":"demo", "desc":{ }, "snapname":"snapshot-1602011804" }, "jobid":556 }
11.8. Register a Stateful Application¶
Run this command to register a stateful application with Robin Platform:
# robin app register <appname>
--app <stateful_app>
--resource <resource>
--selector <selector>
--namespace <namespace>
--dry-run
--specs
|
The name to assign to this app in Robin Platform. To make it easy to associate with a specific Helm release that this app refers to, it is best to use a name that matches the helm release name |
|
Helm or operator based applications. Ex: helm/<release_name> |
|
Kubernetes native objects. Ex: pvc/<name> or pod/<name> |
|
Kubernetes selectors. Ex: release=mongo-1.0,heritage=tiller |
|
Kubernetes namespace in which the application exists |
|
Show the kind, name and status of the objects to be picked up. Note this will not register the application |
|
Show the spec files of the objects to be picked up. Note this will not register the application |
Note
Only one of the --describe
and --dry_run
options can be specified at a time.
Example 1 (Install Helm chart stable/postgresql and register the resulting Helm release):
# helm install --tls --name pgsql stable/postgresql --set persistence.storageClass=robin --namespace t003-u000004 --tiller-namespace t003-u000004
# robin app register pgsql --app helm/pgsql --namespace t003-u000004
Note
More than one helm release can be tracked in a single app by
specifying --app
command line option twice. For example, $
robin app register myblog --app helm/apache --app helm/mysql
would track two different helm releases – (1) apache
and (2)
mysql
as a single unit named myblog
in Robin Platform.
Register a stateful application with Robin Platform.
End Point: /api/v3/robin_server/k8s_app
Method: PUT
URL Parameters: None
Data Parameters:
action: register
- This mandatory field within the payload specifies that the register operation is to be performed.name: <app_name>
- This mandatory field within the payload specifies the name of the application to be registered.namespace: <namespace>
- This mandatory field within the payload specifies the namespace in which the underlying Kubernetes objects for the application are spawned.app_type: operator
- This mandatory field within the payload specifies the type of application being registered.describe: true
- Utilizing this parameter results in the spec files of the objects to be picked up being returned. Note this will not register the application.dry_run: true
- Utilizing this parameter results in the kind, name and status of the objects to be picked up being returned. Note this will not register the application.query: <dict_of_query_params>
– This mandatory field within the payload specifies the set of query parameters to use when discovering Kubernetes objects to register as part of the applicationselectors: <list_of_selectors>
- This mandatory field within the dictionary specifies a list of strings representing a group of specific Kubernetes resources in the format ‘<resource-type>/<resource-name>’ to be registered. To indicate no resources, specify an empty list.selectors: <list_of_selectors>
- This mandatory field within the dictionary specifies a list of strings representing a set of selectors in the format ‘<label-name>=<label-value>’ to query Kubernetes objects with. To indicate no selectors, specify an empty list.apps: <list_of_helm_releases>
- This mandatory field within the dictionary specifies a list of strings in the format ‘helm/<release_name>’ and represents the helm charts to register as part of the application. To indicate no Helm releases, specify an empty list.namespace: <namespace>
- This mandatory field within the dictionary specifies the namespace in which the underlying Kubernetes objects for the application are spawned.
Note
Only one of the describe
and dry_run
parameters can be specified at a time.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":248
}
11.9. Unregister a Stateful Application¶
Issue the following command to unregister a stateful application from Robin Platform:
# robin app unregister <appname>
|
The name of a previously registered stateful application. |
Example:
# robin app unregister mysql1 --wait
This will remove application 'mysql1' from the cluster. Do you want to continue [y/n] ? y
Job: 169 Name: K8SAppUnregister State: PROCESSED Error: 0
Job: 169 Name: K8SAppUnregister State: COMPLETED Error: 0
Note
If the app being unregistered is a Helm release previously registered on the Robin Platform cluster, it will only be removed from the cluster. The underlying Helm release will be left intact.
Unregister a stateful application from Robin Platform.
End Point: /api/v3/robin_server/k8s_app
Method: PUT
URL Parameters: None
Data Parameters:
action: unregister
- This mandatory field within the payload specifies that the unregister operation is to be performed.name: <app_name>
- This mandatory field within the payload specifies the name of the application to be unregistered.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":178
}
11.10. Delete an Application¶
Issue the following command to delete an application from a Robin Platform cluster:
# robin app delete <appname>
--force
|
Application instance name |
|
Force the deletion of the application and all associated Kubernetes objects. |
When you run the robin app delete --force <k8s_app/helm_app>
command, starting from Robin 5.3.5 HF3 runs a new
job: K8SVolumeDeleteHelmRelease
to reclaim storage space after the K8SApplicationDeleteHelm
job.
Example:
# robin app delete mysql1 --wait -y
Job: 153 Name: K8SApplicationDeleteHelm State: VALIDATED Error: 0
Job: 153 Name: K8SApplicationDeleteHelm State: COMPLETED Error: 0
Note
An application that was created from a Robin Bundle can be
deleted in its entirety. That means that all of the objects
associated with the application that were created in the
Kubernetes cluster will be deleted along with the application
instance record in the Robin Platform cluster. By default, robin
app delete
will fail, however, for any stateful application that
was registered with Robin Platform. To override this behavior,
include --force
on the command line. If the desire is to
remove the application from Robin Platform but leave the
Kubernetes objects intact, then use the robin app unregister
command.
Delete an application from a Robin Platform cluster
End Point: /api/v6/robin_server/apps/<app_name>
Method: DELETE
URL Parameters:
force=true
: Utilizing this parameter results in the ungraceful termination of an application, which includes not running any relevant hook scripts.del_snaps=true
: Utilizing this parameter results in both the application and its associated snapshots being deleted.
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"enable_metrics":true,
"auto_relocate":true,
"pvcpolicy":"create",
"enable_hooklogs":true,
"zoneid":1597147518,
"planid":710,
"content_id":"64495e524cbc9f133d4b92bcc04e1f94",
"name":"test-ds-1",
"roles":[
{
"name":"server",
"volume_groups":[
],
"vnodes":[
{
"allocated_host":"cscale-82-140.robinsystems.com",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN8WYsAfs0+a1zzAIWIVV5MrZUaur688E08BL7fm+1uBFjBRPEevwrYrNFL7ebjJxYuB1R3WR+IX8Mmz7CiMDvfEiAQL1Ihj4GZ32WSqzZ7MN15UJK4DQWY7sU++VIusyPUj5goVS2mPj0k4zhheNOlC8XaaHgyUq+NjHHDZF5B4mX7huWfM+kC4u5nCvajoHdfeOse4e1n5RlXtlKRqzBbIma6w8Ej32qFxRLvp4lUXzCylYHBLGH42CKWvtxvETwJUb1kIW9DExSnD+u5fd4Dc2D98\/SY79OO4+aa7GA7JV7412S5kWbtq5cpnkDlvhon\/XzLVQlIqIiAJ6ukVmx root@cscale-82-140"
],
"pod_ns":"t001-u000003",
"hostname":"test-ds-1-server-01.t001-u000003.svc.cluster.local",
"k8s_provider":"robin",
"appid":46,
"vnodehookargs":{
"postcreate":[
]
},
"numa_allocations":{
"0":{
"isol_shared_cores_used":0,
"gpu_used":0,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"mem_used":209715200,
"non_isol_cores_used":1,
"isol_dedicated_cores_used":0
}
},
"enable_portmapping":true,
"storage":[
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"disk_tags":{
},
"encryption":"none",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"ext4",
"protection":0,
"workload":0,
"name":"test-ds-1.server.01.data.1.e5506da8-8c25-460d-926b-146ab4b2c9c8",
"blocksize":4096,
"compression":"disabled",
"type":"data",
"media":"HDD",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"159",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"test-ds-1.server.01.data.1.e5506da8-8c25-460d-926b-146ab4b2c9c8",
"next_snapshotid":2,
"qgroupid":158,
"priority":2,
"genkey":1597453455641718,
"appname":"default",
"grpid":158,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"resource_poolid":1
},
"replication":1,
"snap_reserved":20,
"device":"\/dev\/sde",
"path":"\/data",
"layout":"round-robin",
"volgrp_name":"test-ds-1.server.01.72.1.100e29ae-e508-4f21-a253-e3c912fcc242",
"k8s_name":"test-ds-1-server-01-data-1-e5506da8"
},
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"disk_tags":{
},
"encryption":"none",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"raw",
"protection":0,
"workload":0,
"name":"test-ds-1.server.01.block.1.fa7b93eb-46f5-4830-b664-4428ed4088e9",
"blocksize":4096,
"compression":"disabled",
"type":"block",
"media":"HDD",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"158",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"test-ds-1.server.01.block.1.fa7b93eb-46f5-4830-b664-4428ed4088e9",
"next_snapshotid":2,
"qgroupid":159,
"priority":2,
"genkey":1597453455638742,
"appname":"default",
"grpid":159,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"resource_poolid":1
},
"replication":1,
"snap_reserved":20,
"device":"\/dev\/sdf",
"path":"\/dev\/rda",
"layout":"round-robin",
"volgrp_name":"test-ds-1.server.01.72.1.18e90f5c-d221-4a5b-8fe9-4abc80a84776",
"k8s_name":"test-ds-1-server-01-block-1-fa7b93eb"
}
],
"id":79,
"utime":1597453464,
"host_ip":"172.21.27.101",
"restart_on_qoscfg":true,
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"network":[
{
"name":"robin-default",
"allocated_ip":"172.21.27.101",
"allocated_names":[
"eth0"
],
"allocated_by":"system",
"interfaces":1,
"ippool":"robin-default",
"driver":"calico",
"allocated_prefix":16,
"allocated_netmask":"255.255.0.0",
"subnet":"172.21.0.0"
}
],
"bundle_object_id":"64495e524cbc9f133d4b92bcc04e1f94",
"enable_metrics":true,
"bundleid":7,
"appname":"test-ds-1",
"allocated":{
"zonename":"default",
"nodeid":1,
"zoneid":1597147518,
"nodename":"cscale-82-140"
},
"restart_num":15,
"volume_groups":[
{
"volumes":[
"test-ds-1.server.01.data.1.e5506da8-8c25-460d-926b-146ab4b2c9c8"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"test-ds-1.server.01.72.1.100e29ae-e508-4f21-a253-e3c912fcc242.0.b93bfd54-808f-4839-abf4-c56143f05737",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":167772160,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"state":"READY",
"role":"Storage"
}
],
"stormgr_id":234
}
],
"name":"test-ds-1.server.01.72.1.100e29ae-e508-4f21-a253-e3c912fcc242",
"stormgr_id":158
},
{
"volumes":[
"test-ds-1.server.01.block.1.fa7b93eb-46f5-4830-b664-4428ed4088e9"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"test-ds-1.server.01.72.1.18e90f5c-d221-4a5b-8fe9-4abc80a84776.0.2eb1b314-7f19-4cb8-8627-d652544194d9",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":167772160,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"state":"READY",
"role":"Storage"
}
],
"stormgr_id":235
}
],
"name":"test-ds-1.server.01.72.1.18e90f5c-d221-4a5b-8fe9-4abc80a84776",
"stormgr_id":159
}
],
"rpoolid":1,
"sidecar_info":{
"mem":0,
"cpu":0,
"containers":[
],
"hugepages_1g":0,
"hugepages_2m":0,
"gpu":0
},
"role":"server",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"engine":"docker",
"desired_status":"ONLINE",
"allocated_host_type":"physical",
"state":"STARTED",
"name":"test-ds-1.server.01",
"enable_hooklogs":true,
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"pod_name":"test-ds-1-server-01",
"jobid":1887,
"cpu":{
"min":0,
"max":1,
"reserve":false
},
"role_name":"server",
"vnodeid":79,
"allocated_host_public_ip":"10.9.82.140",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597452431325\/k8s-test-10.0",
"root_fs":"\/usr\/local\/robin\/instances\/test-ds-1-server-01.t001-u000003.svc.cluster.local",
"mem":{
"size":209715200,
"hugepages_1g":0,
"hugepages_2m":0
},
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"env":{
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"ROBINHOST":"cscale-82-140.robinsystems.com",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ENABLE_SSH":true,
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"POD_NAME":"test-ds-1-server-01",
"POD_NS":"t001-u000003",
"ROOT_PASSWORD":"",
"K8S_NODE":"cscale-82-140"
},
"ENABLE_SSH":{
"value":true,
"type":"boolean"
}
},
"ctime":1597453464,
"service_uids":[
],
"calico_inuse":true,
"gpu":{
"min":0,
"max":0
}
}
],
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"display_name":"server",
"qgroups":{
"data":{
"wr_weight":1,
"wr_min_window":500,
"rd_min_window":500,
"enabled":false,
"rd_max_iops":2000000,
"wr_min_iops":0,
"wr_max_iops":2000000,
"priority":1,
"rd_weight":1,
"rd_min_iops":0
},
"block":{
"wr_weight":1,
"wr_min_window":500,
"rd_min_window":500,
"enabled":false,
"rd_max_iops":2000000,
"wr_min_iops":0,
"wr_max_iops":2000000,
"priority":1,
"rd_weight":1,
"rd_min_iops":0
}
},
"restart_on_qoscfg":true
}
],
"from_template":null,
"bundle_object_id":"64495e524cbc9f133d4b92bcc04e1f94",
"apphooks":{
"postdestroy":"python3 postdestroy.py",
"allocated":{
"postdestroy":"python3 postdestroy.py",
"postcreate":"python3 postcreate.py",
"precreate":"python3 precreate.py"
},
"postcreate":"python3 postcreate.py",
"precreate":"python3 precreate.py"
},
"bundleid":7,
"snapshot":"enabled",
"id":46,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597452431325\/k8s-test-10.0",
"robin_version":"5.3.1-182",
"restart_num":15,
"clone":"enabled",
"version":"7",
"namespace":"t001-u000003",
"rpool":"default",
"rpoolid":1,
"username":"robin",
"tenant":"Administrators",
"app_ns":"t001-u000003"
},
"jobid":1891
}
11.11. List all Applications¶
The following command will list all applications created or registered with Robin Platform:
# robin app list --app-kind <app_kind>
--app-types <app_type_list>
|
Filter by application kind (valid choices are ‘robin’, ‘helm’, and ‘flexapp’) |
|
Filter by application type (valid choices are’MASTER’ and ‘CLONE’) |
Example 1 (Listing all Applications):
# robin app list
ROBIN Bundle Apps:
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
| Name | Owner/Tenant | Type | Parent | Resource Pool | Vnodes | CPU | GPU | Memory (GB) | Status | LastOpr | Health | Error |
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
| mysql | admin1/t1 | MASTER | - | default | 1 | 4 | 0 | 4 | Ready | ONLINE | Unhealthy | 0 |
| pgsql | admin1/t1 | MASTER | - | default | 1 | 1 | 0 | 1 | Ready | ONLINE | Unknown | 0 |
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
Helm/Flex Apps:
+-----------+---------+-------------+--------------+--------------+-----------+---------+
| Name | Type | State | Owner/Tenant | Namespace | Snapshots | Backups |
+-----------+---------+-------------+--------------+--------------+-----------+---------+
| mysql1 | helm | ONLINE | admin1/t1 | t003-u000004 | 1 | 1 |
| mysql-hb1 | helm | ONLINE | admin1/t1 | t003-u000004 | 0 | 0 |
| mysql2 | helm | ONLINE | admin1/t1 | t003-u000004 | 0 | 0 |
| mysql1-b1 | flexapp | INITIALIZED | admin1/t1 | t003-u000004 | 0 | 0 |
+-----------+---------+-------------+--------------+--------------+-----------+---------+
Example 2 (Listing only Robin Applications):
# robin app list --app-kind robin
ROBIN Bundle Apps:
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
| Name | Owner/Tenant | Type | Parent | Resource Pool | Vnodes | CPU | GPU | Memory (GB) | Status | LastOpr | Health | Error |
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
| mysql | admin1/t1 | MASTER | - | default | 1 | 4 | 0 | 4 | Ready | ONLINE | Unhealthy | 0 |
| pgsql | admin1/t1 | MASTER | - | default | 1 | 1 | 0 | 1 | Ready | ONLINE | Unknown | 0 |
+-------+--------------+--------+--------+---------------+--------+-----+-----+-------------+--------+---------+-----------+-------+
Returns information on all applications within a cluster including details on their statuses (from Robin’s perspective), resource consumption, and their owners.
End Point: /api/v6/robin_server/appsview
Method: GET
URL Parameters:
atype=[MASTER,CLONE]
: Utilizing this parameter filters the results by the type specified. Valid values include MASTER and CLONE.akind=[robin,helm,flexapp]
: Utilizing this parameter filters the results by the kind specified. Valid values include robin, helm and flexapp.
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error)
Example Response:
Output
{
"robin":{
"tenants":[
{
"name":"Administrators",
"id":1
}
],
"rpools":[
{
"name":"default",
"id":1
}
],
"zones":[
{
"zoneid":1597969746,
"name":"default",
"id":1
}
],
"vnodes":[
{
"nodeid":1,
"mem":4194304,
"userid":3,
"zoneid":null,
"cpu":1,
"role":"dsbundle",
"gpu":0,
"hugepages_1g":0,
"utime":1598343982,
"hugepages_2m":0,
"hostname":"test-app-new-dsbundle-01.t001-u000003.svc.cluster.local",
"name":"test-app-new.dsbundle.01",
"status":"ONLINE",
"pod_name":"test-app-new-dsbundle-01",
"appid":12,
"engine":"docker",
"tenantid":1,
"state":"STARTED",
"id":12,
"desired_status":"ONLINE",
"pod_ns":"t001-u000003"
},
{
"nodeid":1,
"mem":1283457024,
"userid":3,
"zoneid":null,
"cpu":1,
"role":"nginx",
"gpu":0,
"hugepages_1g":0,
"utime":1598453564,
"hugepages_2m":0,
"hostname":"demo-nginx-01.t001-u000003.svc.cluster.local",
"name":"demo.nginx.01",
"status":"ONLINE",
"pod_name":"demo-nginx-01",
"appid":13,
"engine":"docker",
"tenantid":1,
"state":"STARTED",
"id":13,
"desired_status":"ONLINE",
"pod_ns":"t001-u000003"
}
],
"users":[
{
"email":null,
"tenantid":1,
"firstname":"Robin",
"id":3,
"username":"robin",
"lastname":"Systems"
}
],
"nodes":[
{
"rpoolid":1,
"memory_used":0,
"nvnodes":0,
"k8s_node_name":"cscale-82-140",
"zoneid":1,
"cpu":40,
"mem":33555701760,
"mem_for_storage":1073741824,
"cpu_prov_factor":10,
"name":"cscale-82-140.robinsystems.com",
"cpu_cores_present":40,
"state":"ONLINE",
"id":1,
"cores_used":0,
"services":"{\"update_time\":1598470070.8638851643,\"services\":{\"stormgr-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:43.555551\",\"MainPID\":2275,\"Id\":\"stormgr-server\"},\"consul-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:49.778591\",\"MainPID\":566,\"Id\":\"consul-server\"},\"consul_members\":[{\"Port\":29460,\"Status\":1,\"DelegateMax\":5,\"ProtocolMin\":1,\"Tags\":{\"segment\":\"\",\"bootstrap\":\"1\",\"vsn_min\":\"2\",\"build\":\"0.9.4:40f243a+\",\"vsn_max\":\"3\",\"vsn\":\"2\",\"raft_vsn\":\"2\",\"role\":\"consul\",\"dc\":\"consul\",\"id\":\"9d550700-9fac-4de6-b6bc-1b957e82bda9\",\"wan_join_port\":\"29461\",\"port\":\"29459\"},\"Name\":\"cscale-82-140.robinsystems.com\",\"DelegateMin\":2,\"ProtocolCur\":2,\"DelegateCur\":4,\"Addr\":\"10.9.82.140\",\"ProtocolMax\":5}],\"robin-auth-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:10.587576\",\"MainPID\":1007,\"Id\":\"robin-auth-server\"},\"robin-node-monitor\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:31.387560\",\"MainPID\":1245,\"Id\":\"robin-node-monitor\"},\"robin-watchdog\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:54.388588\",\"MainPID\":867,\"Id\":\"robin-watchdog\"},\"sherlock-server\":{\"ActiveState\":\"inactive\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":0,\"MainPID\":0,\"Id\":\"sherlock-server\"},\"httpd\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:46.799549\",\"MainPID\":2590,\"Id\":\"httpd\"},\"robin-file-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:15.559572\",\"MainPID\":1074,\"Id\":\"robin-file-server\"},\"robin-event-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:15.088572\",\"MainPID\":1041,\"Id\":\"robin-event-server\"},\"consul-client\":{\"ActiveState\":\"inactive\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":0,\"MainPID\":0,\"Id\":\"consul-client\"},\"gui-cli\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:46.964548\",\"MainPID\":2622,\"Id\":\"gui-cli\"},\"robin-agent\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:38.987554\",\"MainPID\":1716,\"Id\":\"robin-agent\"},\"robin-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-26 12:27:39.201277\",\"MainPID\":15116,\"Id\":\"robin-server\"},\"iomgr-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 12:51:14.290049\",\"MainPID\":29172,\"Id\":\"iomgr-server\"},\"monitor-server\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:29:47.114548\",\"MainPID\":2662,\"Id\":\"monitor-server\"},\"postgresql-9.6\":{\"ActiveState\":\"active\",\"Type\":\"simple\",\"ExecMainStartTimestamp\":\"2020-08-20 10:28:52.396589\",\"MainPID\":662,\"Id\":\"postgresql-9.6\"},\"consul_dns\":true}}"
}
],
"bundles":[
{
"version":"1.0",
"name":"nginx",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":1
},
{
"version":"1.0",
"name":"tolerations",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":2
},
{
"version":"1.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":3
},
{
"version":"2.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":4
},
{
"version":"3.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":5
},
{
"version":"4.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":6
},
{
"version":"10.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":7
},
{
"version":"11.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":8
},
{
"version":"12.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":9
},
{
"version":"15.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":10
},
{
"version":"new",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":11
},
{
"version":"20.0",
"name":"dsbundle",
"share_with_all_tenants":false,
"tenantid":1,
"userid":3,
"zoneid":1,
"limitperbundle":0,
"id":12
}
],
"apps":[
{
"rpoolid":1,
"nvnodes":1,
"zoneid":1,
"mem":4194304,
"atype":"MASTER",
"name":"test-app-new",
"status":"Ready",
"hugepages_1g":0,
"tenantid":1,
"error":0,
"utime":1598343982,
"parentid":null,
"userid":3,
"cpu":1,
"gpu":0,
"bundleid":12,
"hugepages_2m":0,
"health":"Unknown",
"ctime":1598343982,
"unique_id":"a54ef254e6ac11eaa97cc972afea67da",
"state":"ONLINE",
"id":12,
"parent_app":""
},
{
"rpoolid":1,
"nvnodes":1,
"zoneid":1,
"mem":1283457024,
"atype":"MASTER",
"name":"demo",
"status":"Ready",
"hugepages_1g":0,
"tenantid":1,
"error":0,
"utime":1598453574,
"parentid":null,
"userid":3,
"cpu":1,
"gpu":0,
"bundleid":1,
"hugepages_2m":0,
"health":"Unknown",
"ctime":1598453564,
"unique_id":"ba9df9e8e7ab11eaa8012d67016161bd",
"state":"ONLINE",
"id":13,
"parent_app":""
}
]
},
"k8s":[
{
"backup_schedule":{
},
"id":"da5f043ae7d211ea8ed2b5f75df49f21",
"query":"{\"namespace\":\"t001-u000003\",\"resources\":[],\"selectors\":[],\"apps\":[\"helm\\\/ideal-giraffe\"]}",
"kind":"helm",
"tenant":"Administrators",
"snapshot_schedule":{
},
"namespace":"t001-u000003",
"name":"demo-helm",
"state":"ONLINE",
"num_snapshots":0,
"username":"robin",
"num_backups":0
}
]
}
11.12. Show information about a specific Application¶
Issue the following command to get detailed information about a specific application instance:
# robin app info <app_name>
--namespace <namespace>
--services
--network
--hooks
--appjson
--appini
--volmap
--events
--storage
--status
--networkpolicies
|
Application instance name |
|
If there are multiple applications of the same name but in different namespaces this option can be used to distinguish them |
|
Display information about services for an application |
|
Display network information for an application |
|
Display application and vnode hook scripts |
|
Display the application JSON file contents. For non Robin Bundle based applications, the Kubernetes YAML file for each of the objects associated with the application is displayed |
|
Display the appini file contents |
|
Display the mapping between the application’s volumes and the respective disk from which they are allocated |
|
Display the events assosciated with the specified application |
|
Display the storage statistics associated with the application |
|
Display the status of the Kubernetes objects associated with the application |
|
Display the Kubernetes Ingress/Egress Network Policies associated with the application |
Example 1 (Showing information about a Robin app):
# robin app info mysql
Name: mysql
Bundle Info: mysql docker-8.0
Autopilot: Enabled
ROLE mysql (vnodes: 1)
HPA: Not Configured
VNODE 1:mysql.mysql.01 : mysql-mysql-01 (4 cores) (0 GPUs) (4G) (Hugepages-2m: -) (Hugepages-1g: -) (SSD: -) (HDD: 12G) (SVC ports: -) ONLINE
Volume | MntPoint | Size (GB) | SnapSize (GB) | Layout | Media
-----------------------------------------------------------+----------------+-----------+---------------+-------------+-------
mysql.mysql.01.data.1.da86f291-f60a-4d82-82ea-d6e5f7e4e9d1 | /var/lib/mysql | 10 | 2 | round-robin | HDD
App Hooks: Enabled
Vnode Hooks: Enabled
Example 2 (Showing information about a HELM app):
# robin app info mysql1
Backups:
Name : mysql1
Kind : helm
State : ONLINE
Number of repos : 1
Number of snapshots : 1
Number of usable backups : 0
Number of archived/failed backups : 1
Query:
-------
{'apps': ['helm/trendy-crocodile'], 'namespace': 't003-u000004', 'resources': [], 'selectors': []}
Repos:
+----------+-----------------------+----------+------------+
| Name | Bucket | Path | Permission |
+----------+-----------------------+----------+------------+
| testrepo | testbucket-1029384756 | dev/tom/ | readwrite |
+----------+-----------------------+----------+------------+
Snapshots:
+----------------------------------+----------------------------+-------------+--------+----------------------+
| Id | Name | Description | State | Creation Time |
+----------------------------------+----------------------------+-------------+--------+----------------------+
| 327ab8b447b111eaae7f0f55d6e44d6c | mysql1_snapshot-1580863693 | - | ONLINE | 04 Feb 2020 16:48:19 |
+----------------------------------+----------------------------+-------------+--------+----------------------+
Archived/Failed Backups:
+----------------------------------+--------------------------+-------------+-----------------+----------------------+
| Id | Name | Description | State | Creation Time |
+----------------------------------+--------------------------+-------------+-----------------+----------------------+
| 36b7c9de47b111eaaf8deb154706dccd | mysql1_backup-1580863693 | - | Deleted locally | 04 Feb 2020 16:48:24 |
+----------------------------------+--------------------------+-------------+-----------------+----------------------+
Example 3 (Showing information about all K8S services for an application):
# robin app info nginx-app --services
App Name: nginx-app
Services:
+-------------------------+--------------+-----------+---------------+----------------+-------------+
| Service Name | Type | Ports | Service Level | Cluster IP | External IP |
+-------------------------+--------------+-----------+---------------+----------------+-------------+
| nginx-app-nginx-cl-0 | ClusterIP | 80 | Role | 172.19.88.109 | N/A |
| nginx-app-nginx-lb-0 | LoadBalancer | 80:32742 | Role | 172.19.149.207 | None |
| nginx-app-nginx-01-np-0 | NodePort | 80:30486 | VNode | 172.19.219.189 | N/A |
+-------------------------+--------------+-----------+---------------+----------------+-------------+
Example 4 (Showing network information for an application):
# robin app info nginx-app --network
App Name: nginx-app
Network Info:
+--------------------+--------------+-----------------+
| Vnode | IP Addrs | Number of Intfs |
+--------------------+--------------+-----------------+
| nginx-app.nginx.01 | 172.21.27.0 | 1 |
+--------------------+--------------+-----------------+
Example 5 (Showing network policies attached to an application):
# robin app info nginx-app --networkpolicies
App Name: nginx-app
App Configured K8S Ingress/Egress Network Policies:
+-------------------------------------------+----------------------------------------------+--------------+
| Network Policy | Network Policy Type | Namespace |
+-------------------------------------------+----------------------------------------------+--------------+
| np-allow-intra-ns-pods-t001-u000003 | Allow Intra-Namespace Ingress/Egress traffic | t001-u000003 |
| tp-allow-intra-tenant-pods-t001-u000003-1 | Allow Intra-Tenant Ingress/Egress traffic | t001-u000003 |
| up-allow-intra-user-pods-t001-u000003-3 | Allow Intra-User Ingress/Egress traffic | t001-u000003 |
+-------------------------------------------+----------------------------------------------+--------------+
Returns detailed information about an application, such as the volumes serving as storage, the resource breakdown and status of each container for every role.
End Point: /api/v6/robin_server/apps/<appname>?info=true&details=vnodes
Method: GET
URL Parameters: None
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error)
Example Response:
Output
{
"error":0,
"updates_available":false,
"disk":2147483648,
"zoneid":1596601846,
"bundle_version":"1.5",
"bundle_name":"RIC",
"ctime":1596663233,
"owner":{
"last_name":"Systems",
"tenant_id":1,
"username":"robin",
"first_name":"Robin",
"tenant_name":"Administrators",
"email":null,
"user_id":3
},
"ainstances":[
{
"id":6,
"role":"server",
"memory":209715200,
"events":[
],
"vnc_port":null,
"utime":1596663233,
"user":"robin",
"state":"STARTED",
"name":"test-RIC-1.server.01",
"ctime":1596663233,
"public_ips":[
],
"image_format":"UNKNOWN",
"hugepages_2m":0,
"storage":[
{
"size":1073741824,
"media":"HDD",
"state":"ONLINE",
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"id":"8"
},
{
"size":1073741824,
"media":"HDD",
"state":"ONLINE",
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"id":"9"
}
],
"bundle":{
"pathname":"\/usr\/local\/robin\/collections\/file-collection-1596578146092\/1596663217668\/RIC-1.5",
"description":"-",
"tenants":[
"Administrators"
],
"create_time":"August 05, 2020 14:33:37",
"content_id":"f972a5725d1bfe2671a79d61856f872a",
"zoneid":1596601846,
"share_with_all_tenants":false,
"user":"robin",
"type":"ROBIN",
"name":"RIC",
"nchildren":0,
"version":"1.5",
"file_object_id":1596663217668,
"bundleid":3,
"ntemplates":1,
"tenant":"Administrators",
"collection_id":1596578146092,
"napps":1,
"parent":"",
"groupid":3
},
"image":{
"version":"",
"file":"",
"name":""
},
"network_bandwidth":null,
"app":"test-RIC-1",
"status":"ONLINE",
"cpu_cores":1,
"config":{
"restart_num":15,
"service_uids":[
],
"appname":"test-RIC-1",
"allocated_host":"cscale-82-140.robinsystems.com",
"allocated_host_public_ip":"10.9.82.140",
"cpu":{
"max":1,
"min":0,
"reserve":false
},
"sidecar_info":{
"hugepages_1g":0,
"mem":0,
"hugepages_2m":0,
"containers":[
],
"cpu":0,
"gpu":0
},
"id":6,
"role_name":"server",
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"pod_name":"test-ric-1-server-01",
"role":"server",
"rpoolid":1,
"network":[
{
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_ip":"172.21.26.94",
"allocated_prefix":16,
"allocated_names":[
"eth0"
],
"interfaces":1,
"driver":"calico",
"allocated_netmask":"255.255.0.0",
"ippool":"robin-default",
"name":"robin-default"
}
],
"storage":[
{
"volgrp_name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c",
"media":"HDD",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"workload":0,
"type":"data",
"snapshot_space_limit":214748365,
"faultdomain":"host",
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"blocksize":4096,
"layout":"round-robin",
"disk_tags":{
},
"allocated":{
"media":72,
"volumeid":"8",
"priority":2,
"genkey":1596663220770472,
"grpid":8,
"partitions":0,
"snapshot_space_limit":214748365,
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"current_snapshot":"active_snap",
"params":{
},
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"next_backupid":1,
"appname":"default",
"vtype":0,
"resource_poolid":1,
"current_snapshotid":1,
"block_size":4096,
"size":1073741824,
"replication":1,
"multinode_mounting":false,
"appid":1,
"next_snapshotid":2,
"protection":0,
"compression":0,
"slice_size":1073741824,
"qgroupid":8
},
"pvcpolicy":"create",
"fstype":"ext4",
"snap_reserved":20,
"size":1073741824,
"lvm_vol_count":"0",
"lvm_type":"None",
"encryption":"none",
"protection":0,
"compression":"disabled",
"vol_ns":"t001-u000003",
"replication":1,
"path":"\/data",
"k8s_name":"test-ric-1-server-01-data-1-382f1ad5"
},
{
"volgrp_name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a",
"media":"HDD",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"workload":0,
"type":"block",
"snapshot_space_limit":214748365,
"faultdomain":"host",
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"blocksize":4096,
"layout":"round-robin",
"disk_tags":{
},
"allocated":{
"media":72,
"volumeid":"9",
"priority":2,
"genkey":1596663220787432,
"grpid":9,
"partitions":0,
"snapshot_space_limit":214748365,
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"current_snapshot":"active_snap",
"params":{
},
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"next_backupid":1,
"appname":"default",
"vtype":0,
"resource_poolid":1,
"current_snapshotid":1,
"block_size":4096,
"size":1073741824,
"replication":1,
"multinode_mounting":false,
"appid":1,
"next_snapshotid":2,
"protection":0,
"compression":0,
"slice_size":1073741824,
"qgroupid":9
},
"pvcpolicy":"create",
"fstype":"raw",
"snap_reserved":20,
"size":1073741824,
"replication":1,
"lvm_type":"None",
"encryption":"none",
"protection":0,
"compression":"disabled",
"vol_ns":"t001-u000003",
"lvm_vol_count":"0",
"path":"\/dev\/rda",
"k8s_name":"test-ric-1-server-01-block-1-1053eaeb"
}
],
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgHRR3k5onnh+hjqpoW\/oLkr37GOs2f8FQVDJUHHrDeB+\/cn9c\/nez4lu9J0FkCe+mQwhnuiCicunZEjVZOWpIvjxblbw6Lh7ZkN+o5mOkcxCayrp3fDFnR1PerJJhRPnJU60zxFYbAGPrQtCywQ+b7J9hLtNaqCBf9eAwVWiLSEcFs0SkrjXjFjXOTCaq8b45AWSYc6ZxhzMsFTkTF3C37rTmEGIijmDvUbq1HRGXtQ2YZrlo\/yjJqn8wk8E+cw+Sh\/PEsudaVzoZRqyQ\/lsWBt\/+0nFON8pYttyXPZjKhuGDB5QNtUZ4kgvzDfr1TF1XEXHfo2PdsswRkQ4rU8bF root@cscale-82-140"
],
"env":{
"ENABLE_SSH":{
"value":true,
"type":"boolean"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"K8S_NODE":"cscale-82-140",
"ROBINHOST":"cscale-82-140.robinsystems.com",
"POD_NAME":"test-ric-1-server-01",
"ROOT_PASSWORD":"",
"ENABLE_SSH":true,
"ROBINHOST_TAG_ROBINRPOOL":"default",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"POD_NS":"t001-u000003",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
}
},
"appid":6,
"root_fs":"\/usr\/local\/robin\/instances\/test-ric-1-server-01.t001-u000003.svc.cluster.local",
"enable_hooklogs":true,
"bundle_object_id":"f972a5725d1bfe2671a79d61856f872a",
"numa_allocations":{
"0":{
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"gpu_used":0,
"isol_shared_cores_used":0,
"non_isol_cores_used":1,
"mem_used":209715200,
"isol_dedicated_cores_used":0
}
},
"utime":1596663233,
"volume_groups":[
{
"layout":"round-robin",
"volumes":[
"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5"
],
"media":"HDD",
"device_sets":[
{
"devices":[
{
"tags":{
},
"pused":1107296256,
"allocated_slices":2,
"type":"HDD",
"state":"READY",
"aslices":29,
"slices":77,
"stormgr_id":1,
"max_throughput_intensive_vols_per_disk":1,
"write_unit":4096,
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"reattachable":0,
"score":84,
"psize":107374182400,
"max_volumes_per_disk":10,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"capacity":107374182400,
"hostname":"cscale-82-140.robinsystems.com",
"max_latency_sensitive_vols_per_disk":2
}
],
"name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c.0.1e8feb41-fd42-4409-b8c1-751331febdc1",
"stormgr_id":8
}
],
"rpoolid":1,
"name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c",
"replicas":1,
"stormgr_id":8
},
{
"layout":"round-robin",
"volumes":[
"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead"
],
"media":"HDD",
"device_sets":[
{
"devices":[
{
"tags":{
},
"pused":1107296256,
"allocated_slices":2,
"type":"HDD",
"state":"READY",
"aslices":29,
"slices":77,
"stormgr_id":1,
"max_throughput_intensive_vols_per_disk":1,
"write_unit":4096,
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"reattachable":0,
"score":84,
"psize":107374182400,
"max_volumes_per_disk":10,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"capacity":107374182400,
"hostname":"cscale-82-140.robinsystems.com",
"max_latency_sensitive_vols_per_disk":2
}
],
"name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a.0.5bf728c4-ea26-4e0f-82d7-c584fcf0bd9a",
"stormgr_id":9
}
],
"rpoolid":1,
"name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a",
"replicas":1,
"stormgr_id":9
}
],
"bundleid":3,
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"mem":{
"size":209715200,
"hugepages_1g":0,
"hugepages_2m":0
},
"enable_portmapping":true,
"state":"STARTED",
"name":"test-RIC-1.server.01",
"k8s_provider":"robin",
"ctime":1596663233,
"vnodeid":6,
"allocated":{
"zoneid":1596601846,
"nodename":"cscale-82-140",
"nodeid":1,
"zonename":"default"
},
"image":{
"init_mode":false,
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"engine":"docker",
"registry_port":""
},
"calico_inuse":true,
"enable_metrics":true,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1596578146092\/1596663217668\/RIC-1.5",
"vnodehookargs":{
"postcreate":[
]
},
"pod_ns":"t001-u000003",
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"allocated_host_type":"physical",
"hostname":"test-ric-1-server-01.t001-u000003.svc.cluster.local",
"host_ip":"172.21.26.94",
"restart_on_qoscfg":true,
"engine":"docker",
"gpu":{
"max":0,
"min":0
}
},
"physical_host":{
"compute_status":"READY",
"status":1,
"hostname":"cscale-82-140.robinsystems.com",
"compute_state":"ONLINE",
"public_hostname":"cscale-82-140.robinsystems.com",
"compute_services":[
[
"robin-agent",
true
],
[
"monitor-server",
true
],
[
"iomgr-server",
true
]
],
"state":"ONLINE",
"public_ip":"10.9.82.140"
},
"gpu_cores":0,
"restartpolicy":{
"restarts_done":0,
"burst_count":0,
"burst_start_time":0,
"burst_interval":600,
"id":13,
"restart_limit":15
},
"distribution":{
"version":"",
"name":""
},
"root_fs":"\/usr\/local\/robin\/instances\/test-ric-1-server-01.t001-u000003.svc.cluster.local",
"volumes":[
{
"size":1073741824,
"media":"HDD",
"state":"ONLINE",
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"id":"8"
},
{
"size":1073741824,
"media":"HDD",
"state":"ONLINE",
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"id":"9"
}
],
"capacity":{
"threshold":85,
"used":0,
"total":0,
"unit":"Bytes"
},
"service_ports":null,
"tenant":"Administrators",
"hugepages_1g":0,
"rpool":"default",
"autopilot":true,
"desired_status":"ONLINE",
"ip_addresses":[
"172.21.26.94\/16"
],
"engine":"docker",
"hostname":"test-ric-1-server-01.t001-u000003.svc.cluster.local"
}
],
"local_avail":true,
"nbackups":0,
"id":6,
"clone":false,
"unique_id":"549c0ac2d76311eab3c057add9d364f3",
"parentid":"",
"status":"Ready",
"atype":"MASTER",
"message":"",
"nsnapshots":0,
"utime":1596663233,
"rpool":"default",
"autopilot":true,
"snapshots":[
],
"user_shares":[
],
"mem":209715200,
"backups":[
],
"state":"ONLINE",
"name":"test-RIC-1",
"cpu":1,
"restore_status":{
},
"appinfo":{
},
"nvnodes":1,
"resources":[
],
"health":"Unknown",
"config":{
"content_id":"f972a5725d1bfe2671a79d61856f872a",
"from_template":null,
"enable_metrics":true,
"kind":"ROBIN",
"id":6,
"name":"test-RIC-1",
"auto_relocate":true,
"version":"7",
"zoneid":1596601846,
"app_ns":"t001-u000003",
"namespace":"t001-u000003",
"tenant":"Administrators",
"clone":"enabled",
"pvcpolicy":"create",
"planid":6,
"restart_num":15,
"rpoolid":1,
"roles":[
{
"qgroups":{
"block":{
"rd_weight":1,
"rd_max_iops":2000000,
"priority":1,
"wr_min_iops":0,
"wr_min_window":500,
"rd_min_iops":0,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_weight":1
},
"data":{
"rd_weight":1,
"rd_max_iops":2000000,
"priority":1,
"wr_min_iops":0,
"wr_min_window":500,
"rd_min_iops":0,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_weight":1
}
},
"vnodes":[
{
"restart_num":15,
"service_uids":[
],
"appname":"test-RIC-1",
"allocated_host":"cscale-82-140.robinsystems.com",
"allocated_host_public_ip":"10.9.82.140",
"cpu":{
"max":1,
"min":0,
"reserve":false
},
"sidecar_info":{
"hugepages_1g":0,
"mem":0,
"hugepages_2m":0,
"containers":[
],
"cpu":0,
"gpu":0
},
"id":6,
"role_name":"server",
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"pod_name":"test-ric-1-server-01",
"role":"server",
"rpoolid":1,
"status":"ONLINE",
"network":[
{
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_ip":"172.21.26.94",
"allocated_prefix":16,
"allocated_names":[
"eth0"
],
"interfaces":1,
"driver":"calico",
"allocated_netmask":"255.255.0.0",
"ippool":"robin-default",
"name":"robin-default"
}
],
"storage":[
{
"volgrp_name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c",
"media":"HDD",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"workload":0,
"type":"data",
"snapshot_space_limit":214748365,
"faultdomain":"host",
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"blocksize":4096,
"layout":"round-robin",
"disk_tags":{
},
"allocated":{
"media":72,
"volumeid":"8",
"priority":2,
"genkey":1596663220770472,
"grpid":8,
"partitions":0,
"snapshot_space_limit":214748365,
"name":"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5",
"current_snapshot":"active_snap",
"params":{
},
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"next_backupid":1,
"appname":"default",
"vtype":0,
"resource_poolid":1,
"current_snapshotid":1,
"block_size":4096,
"size":1073741824,
"replication":1,
"multinode_mounting":false,
"appid":1,
"next_snapshotid":2,
"protection":0,
"compression":0,
"slice_size":1073741824,
"qgroupid":8
},
"pvcpolicy":"create",
"fstype":"ext4",
"snap_reserved":20,
"size":1073741824,
"lvm_vol_count":"0",
"lvm_type":"None",
"encryption":"none",
"protection":0,
"compression":"disabled",
"vol_ns":"t001-u000003",
"replication":1,
"path":"\/data",
"k8s_name":"test-ric-1-server-01-data-1-382f1ad5"
},
{
"volgrp_name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a",
"media":"HDD",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"workload":0,
"type":"block",
"snapshot_space_limit":214748365,
"faultdomain":"host",
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"blocksize":4096,
"layout":"round-robin",
"disk_tags":{
},
"allocated":{
"media":72,
"volumeid":"9",
"priority":2,
"genkey":1596663220787432,
"grpid":9,
"partitions":0,
"snapshot_space_limit":214748365,
"name":"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead",
"current_snapshot":"active_snap",
"params":{
},
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"next_backupid":1,
"appname":"default",
"vtype":0,
"resource_poolid":1,
"current_snapshotid":1,
"block_size":4096,
"size":1073741824,
"replication":1,
"multinode_mounting":false,
"appid":1,
"next_snapshotid":2,
"protection":0,
"compression":0,
"slice_size":1073741824,
"qgroupid":9
},
"pvcpolicy":"create",
"fstype":"raw",
"snap_reserved":20,
"size":1073741824,
"replication":1,
"lvm_type":"None",
"encryption":"none",
"protection":0,
"compression":"disabled",
"vol_ns":"t001-u000003",
"lvm_vol_count":"0",
"path":"\/dev\/rda",
"k8s_name":"test-ric-1-server-01-block-1-1053eaeb"
}
],
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDgHRR3k5onnh+hjqpoW\/oLkr37GOs2f8FQVDJUHHrDeB+\/cn9c\/nez4lu9J0FkCe+mQwhnuiCicunZEjVZOWpIvjxblbw6Lh7ZkN+o5mOkcxCayrp3fDFnR1PerJJhRPnJU60zxFYbAGPrQtCywQ+b7J9hLtNaqCBf9eAwVWiLSEcFs0SkrjXjFjXOTCaq8b45AWSYc6ZxhzMsFTkTF3C37rTmEGIijmDvUbq1HRGXtQ2YZrlo\/yjJqn8wk8E+cw+Sh\/PEsudaVzoZRqyQ\/lsWBt\/+0nFON8pYttyXPZjKhuGDB5QNtUZ4kgvzDfr1TF1XEXHfo2PdsswRkQ4rU8bF root@cscale-82-140"
],
"env":{
"ENABLE_SSH":{
"value":true,
"type":"boolean"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"K8S_NODE":"cscale-82-140",
"ROBINHOST":"cscale-82-140.robinsystems.com",
"POD_NAME":"test-ric-1-server-01",
"ROOT_PASSWORD":"",
"ENABLE_SSH":true,
"ROBINHOST_TAG_ROBINRPOOL":"default",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"POD_NS":"t001-u000003",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
}
},
"appid":6,
"root_fs":"\/usr\/local\/robin\/instances\/test-ric-1-server-01.t001-u000003.svc.cluster.local",
"enable_hooklogs":true,
"bundle_object_id":"f972a5725d1bfe2671a79d61856f872a",
"numa_allocations":{
"0":{
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"gpu_used":0,
"isol_shared_cores_used":0,
"non_isol_cores_used":1,
"mem_used":209715200,
"isol_dedicated_cores_used":0
}
},
"utime":1596663233,
"volume_groups":[
{
"layout":"round-robin",
"volumes":[
"test-RIC-1.server.01.data.1.382f1ad5-1294-4e24-8297-9c6025eacfe5"
],
"media":"HDD",
"device_sets":[
{
"devices":[
{
"tags":{
},
"pused":1107296256,
"allocated_slices":2,
"type":"HDD",
"state":"READY",
"aslices":29,
"slices":77,
"stormgr_id":1,
"max_throughput_intensive_vols_per_disk":1,
"write_unit":4096,
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"reattachable":0,
"score":84,
"psize":107374182400,
"max_volumes_per_disk":10,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"capacity":107374182400,
"hostname":"cscale-82-140.robinsystems.com",
"max_latency_sensitive_vols_per_disk":2
}
],
"name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c.0.1e8feb41-fd42-4409-b8c1-751331febdc1",
"stormgr_id":8
}
],
"rpoolid":1,
"name":"test-RIC-1.server.01.72.1.ea297971-f931-4787-99cc-6782e026b77c",
"replicas":1,
"stormgr_id":8
},
{
"layout":"round-robin",
"volumes":[
"test-RIC-1.server.01.block.1.1053eaeb-4542-42a5-a173-d69a76703ead"
],
"media":"HDD",
"device_sets":[
{
"devices":[
{
"tags":{
},
"pused":1107296256,
"allocated_slices":2,
"type":"HDD",
"state":"READY",
"aslices":29,
"slices":77,
"stormgr_id":1,
"max_throughput_intensive_vols_per_disk":1,
"write_unit":4096,
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"reattachable":0,
"score":84,
"psize":107374182400,
"max_volumes_per_disk":10,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"capacity":107374182400,
"hostname":"cscale-82-140.robinsystems.com",
"max_latency_sensitive_vols_per_disk":2
}
],
"name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a.0.5bf728c4-ea26-4e0f-82d7-c584fcf0bd9a",
"stormgr_id":9
}
],
"rpoolid":1,
"name":"test-RIC-1.server.01.72.1.1e483fd0-2d5c-434c-aef0-91a87796977a",
"replicas":1,
"stormgr_id":9
}
],
"bundleid":3,
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"mem":{
"size":209715200,
"hugepages_1g":0,
"hugepages_2m":0
},
"enable_portmapping":true,
"state":"STARTED",
"name":"test-RIC-1.server.01",
"k8s_provider":"robin",
"ctime":1596663233,
"vnodeid":6,
"allocated":{
"zoneid":1596601846,
"nodename":"cscale-82-140",
"nodeid":1,
"zonename":"default"
},
"image":{
"init_mode":false,
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"engine":"docker",
"registry_port":""
},
"calico_inuse":true,
"enable_metrics":true,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1596578146092\/1596663217668\/RIC-1.5",
"vnodehookargs":{
"postcreate":[
]
},
"pod_ns":"t001-u000003",
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"allocated_host_type":"physical",
"hostname":"test-ric-1-server-01.t001-u000003.svc.cluster.local",
"host_ip":"172.21.26.94",
"restart_on_qoscfg":true,
"engine":"docker",
"gpu":{
"max":0,
"min":0
}
}
],
"name":"server",
"display_name":"server",
"restart_on_qoscfg":true,
"volume_groups":[
],
"image":{
"init_mode":false,
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"engine":"docker",
"registry_port":""
}
}
],
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1596578146092\/1596663217668\/RIC-1.5",
"username":"robin",
"robin_version":"5.3.0-171",
"enable_hooklogs":true,
"bundle_object_id":"f972a5725d1bfe2671a79d61856f872a",
"bundleid":3,
"rpool":"default",
"snapshot":"enabled"
},
"vnodes":[
"test-RIC-1.server.01"
],
"repos":[
],
"parent_app":"",
"app_kind":"robin",
"appcfg_autopilot":true,
"bundleid":3,
"backup_state":"Hydrated",
"storagerepos":[
],
"gpu":0
}
11.13. Stop a Robin Application¶
Issue the following command to stop an application:
# robin app stop [<app_name>]
--all
|
Application instance name |
|
Stop all applications |
Example:
# robin app stop mysql --wait
Job: 177 Name: ApplicationStop State: VALIDATED Error: 0
Job: 177 Name: ApplicationStop State: WAITING Error: 0
Job: 177 Name: ApplicationStop State: COMPLETED Error: 0
Note
The robin app stop
command can only be used with Robin Applications.
Stops a Robin bundle based application that is currently running.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: stop
- This mandatory field within the payload specifies that the stop operation is to be performed.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"robin_version":"5.3.1-182",
"auto_relocate":true,
"pvcpolicy":"create",
"enable_hooklogs":true,
"zoneid":1597147518,
"planid":712,
"content_id":"a360b352c8c800e7f1af4075bb3320a4",
"name":"demo",
"roles":[
{
"name":"server",
"display_name":"server",
"vnodes":[
{
"allocated_host":"cscale-82-140.robinsystems.com",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN8WYsAfs0+a1zzAIWIVV5MrZUaur688E08BL7fm+1uBFjBRPEevwrYrNFL7ebjJxYuB1R3WR+IX8Mmz7CiMDvfEiAQL1Ihj4GZ32WSqzZ7MN15UJK4DQWY7sU++VIusyPUj5goVS2mPj0k4zhheNOlC8XaaHgyUq+NjHHDZF5B4mX7huWfM+kC4u5nCvajoHdfeOse4e1n5RlXtlKRqzBbIma6w8Ej32qFxRLvp4lUXzCylYHBLGH42CKWvtxvETwJUb1kIW9DExSnD+u5fd4Dc2D98\/SY79OO4+aa7GA7JV7412S5kWbtq5cpnkDlvhon\/XzLVQlIqIiAJ6ukVmx root@cscale-82-140"
],
"enable_portmapping":true,
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"k8s_provider":"robin",
"appid":47,
"vnodehookargs":{
"postcreate":[
]
},
"numa_allocations":{
"0":{
"isol_shared_cores_used":0,
"hugepages_2m_used":0,
"hugepages_1g_used":0,
"gpu_used":0,
"mem_used":209715200,
"non_isol_cores_used":1,
"isol_dedicated_cores_used":0
}
},
"pod_ns":"t001-u000003",
"storage":[
{
"type":"data",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"media":"HDD",
"disk_tags":{
},
"path":"\/data",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"ext4",
"protection":0,
"workload":0,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"blocksize":4096,
"layout":"round-robin",
"pvcpolicy":"create",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"161",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"next_snapshotid":2,
"qgroupid":161,
"genkey":1597467855202873,
"appname":"default",
"grpid":160,
"resource_poolid":1,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"priority":2
},
"replication":1,
"snap_reserved":20,
"encryption":"none",
"compression":"disabled",
"volgrp_name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"k8s_name":"demo-server-01-data-1-4589956b"
},
{
"type":"block",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"media":"HDD",
"disk_tags":{
},
"path":"\/dev\/rda",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"raw",
"protection":0,
"workload":0,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"blocksize":4096,
"layout":"round-robin",
"pvcpolicy":"create",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"160",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"next_snapshotid":2,
"qgroupid":162,
"genkey":1597467855198470,
"appname":"default",
"grpid":161,
"resource_poolid":1,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"priority":2
},
"replication":1,
"snap_reserved":20,
"encryption":"none",
"compression":"disabled",
"volgrp_name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"k8s_name":"demo-server-01-block-1-13a9b1b5"
}
],
"id":80,
"utime":1597467867,
"host_ip":"172.21.24.156",
"restart_on_qoscfg":true,
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/os":[
"linux"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"network":[
{
"name":"robin-default",
"allocated_ip":"172.21.24.156",
"allocated_names":[
"eth0"
],
"allocated_by":"system",
"interfaces":1,
"subnet":"172.21.0.0",
"allocated_prefix":16,
"driver":"calico",
"allocated_netmask":"255.255.0.0",
"ippool":"robin-default"
}
],
"calico_inuse":true,
"enable_metrics":true,
"bundleid":1,
"appname":"demo",
"allocated":{
"zonename":"default",
"nodeid":1,
"zoneid":1597147518,
"nodename":"cscale-82-140"
},
"restart_num":15,
"volume_groups":[
{
"volumes":[
"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd.0.9e88d02c-3d16-4c05-89ff-29a4e2f2204a",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":236
}
],
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"stormgr_id":160
},
{
"volumes":[
"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a.0.64d7adca-97f0-4ed4-9e98-f81e7557b437",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":237
}
],
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"stormgr_id":161
}
],
"rpoolid":1,
"sidecar_info":{
"mem":0,
"cpu":0,
"containers":[
],
"hugepages_1g":0,
"hugepages_2m":0,
"gpu":0
},
"role":"server",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"allocated_host_type":"physical",
"state":"STARTED",
"name":"demo.server.01",
"enable_hooklogs":true,
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"pod_name":"demo-server-01",
"engine":"docker",
"cpu":{
"min":0,
"max":1,
"reserve":false
},
"role_name":"server",
"vnodeid":80,
"allocated_host_public_ip":"10.9.82.140",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"mem":{
"size":209715200,
"hugepages_2m":0,
"hugepages_1g":0
},
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"env":{
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"ROBINHOST":"cscale-82-140.robinsystems.com",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"POD_NAME":"demo-server-01",
"POD_NS":"t001-u000003",
"ROOT_PASSWORD":"",
"K8S_NODE":"cscale-82-140",
"ENABLE_SSH":true
},
"ENABLE_SSH":{
"value":true,
"type":"boolean"
}
},
"ctime":1597467867,
"service_uids":[
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"gpu":{
"min":0,
"max":0
}
}
],
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"volume_groups":[
],
"qgroups":{
"data":{
"wr_min_window":500,
"wr_weight":1,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_min_iops":0,
"priority":1,
"rd_max_iops":2000000,
"rd_weight":1,
"rd_min_iops":0
},
"block":{
"wr_min_window":500,
"wr_weight":1,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_min_iops":0,
"priority":1,
"rd_max_iops":2000000,
"rd_weight":1,
"rd_min_iops":0
}
},
"restart_on_qoscfg":true
}
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"tenant":"Administrators",
"bundleid":1,
"snapshot":"enabled",
"id":47,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"from_template":null,
"restart_num":15,
"clone":"enabled",
"version":"7",
"namespace":"t001-u000003",
"rpool":"default",
"rpoolid":1,
"username":"robin",
"enable_metrics":true,
"app_ns":"t001-u000003"
},
"jobid":1896
}
11.14. Start a Robin Application¶
Issue the following command to stop an application:
# robin app start [<app_name>]
--all
|
Application instance name |
|
Start all applications |
Example:
# robin app start mysql --wait
Job: 174 Name: ApplicationStart State: VALIDATED Error: 0
Job: 174 Name: ApplicationStart State: WAITING Error: 0
Job: 174 Name: ApplicationStart State: COMPLETED Error: 0
Note
The robin app start
command can only be used with Robin Applications.
Starts a Robin bundle based application that is currently not running.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: start
- This mandatory field within the payload specifies that the start operation is to be performed.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"orig_config":{
"robin_version":"5.3.1-182",
"auto_relocate":true,
"pvcpolicy":"create",
"enable_hooklogs":true,
"zoneid":1597147518,
"planid":712,
"content_id":"a360b352c8c800e7f1af4075bb3320a4",
"name":"demo",
"roles":[
{
"name":"server",
"volume_groups":[
],
"vnodes":[
{
"allocated_host":"cscale-82-140.robinsystems.com",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN8WYsAfs0+a1zzAIWIVV5MrZUaur688E08BL7fm+1uBFjBRPEevwrYrNFL7ebjJxYuB1R3WR+IX8Mmz7CiMDvfEiAQL1Ihj4GZ32WSqzZ7MN15UJK4DQWY7sU++VIusyPUj5goVS2mPj0k4zhheNOlC8XaaHgyUq+NjHHDZF5B4mX7huWfM+kC4u5nCvajoHdfeOse4e1n5RlXtlKRqzBbIma6w8Ej32qFxRLvp4lUXzCylYHBLGH42CKWvtxvETwJUb1kIW9DExSnD+u5fd4Dc2D98\/SY79OO4+aa7GA7JV7412S5kWbtq5cpnkDlvhon\/XzLVQlIqIiAJ6ukVmx root@cscale-82-140"
],
"enable_portmapping":true,
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"vnodeid":80,
"appid":47,
"vnodehookargs":{
"postcreate":[
]
},
"numa_allocations":{
"0":{
"isol_shared_cores_used":0,
"gpu_used":0,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"mem_used":209715200,
"non_isol_cores_used":1,
"isol_dedicated_cores_used":0
}
},
"pod_ns":"t001-u000003",
"storage":[
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"media":"HDD",
"faultdomain":"host",
"protection":0,
"type":"das"
},
"disk_tags":{
},
"path":"\/data",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"ext4",
"replication":1,
"workload":0,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"blocksize":4096,
"compression":"disabled",
"type":"data",
"media":"HDD",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"161",
"multinode_mounting":false,
"media":72,
"size":1073741824,
"stordriver":{
"media":"HDD",
"faultdomain":"host",
"protection":0,
"type":"das"
},
"block_size":4096,
"current_snapshot":"active_snap",
"params":{
},
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"replication":1,
"next_backupid":1,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"next_snapshotid":2,
"qgroupid":161,
"priority":2,
"genkey":1597467855202873,
"appname":"default",
"grpid":160,
"protection":0,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"resource_poolid":1
},
"protection":0,
"snap_reserved":20,
"encryption":"none",
"layout":"round-robin",
"volgrp_name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"k8s_name":"demo-server-01-data-1-4589956b"
},
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"media":"HDD",
"faultdomain":"host",
"protection":0,
"type":"das"
},
"disk_tags":{
},
"path":"\/dev\/rda",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"raw",
"replication":1,
"workload":0,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"blocksize":4096,
"compression":"disabled",
"type":"block",
"media":"HDD",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"160",
"multinode_mounting":false,
"media":72,
"size":1073741824,
"stordriver":{
"media":"HDD",
"faultdomain":"host",
"protection":0,
"type":"das"
},
"block_size":4096,
"current_snapshot":"active_snap",
"params":{
},
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"replication":1,
"next_backupid":1,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"next_snapshotid":2,
"qgroupid":162,
"priority":2,
"genkey":1597467855198470,
"appname":"default",
"grpid":161,
"protection":0,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"resource_poolid":1
},
"protection":0,
"snap_reserved":20,
"encryption":"none",
"layout":"round-robin",
"volgrp_name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"k8s_name":"demo-server-01-block-1-13a9b1b5"
}
],
"id":80,
"utime":1597467867,
"name":"demo.server.01",
"restart_on_qoscfg":true,
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"network":[
{
"name":"robin-default",
"driver":"calico",
"allocated_ip":"172.21.24.156",
"allocated_netmask":"255.255.0.0",
"interfaces":1,
"ippool":"robin-default",
"allocated_by":"system",
"allocated_prefix":16,
"allocated_names":[
"eth0"
],
"subnet":"172.21.0.0"
}
],
"calico_inuse":true,
"enable_metrics":true,
"bundleid":1,
"appname":"demo",
"allocated":{
"zonename":"default",
"nodeid":1,
"zoneid":1597147518,
"nodename":"cscale-82-140"
},
"restart_num":15,
"volume_groups":[
{
"volumes":[
"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947"
],
"device_sets":[
{
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd.0.9e88d02c-3d16-4c05-89ff-29a4e2f2204a",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":236
}
],
"media":"HDD",
"replicas":1,
"rpoolid":1,
"layout":"round-robin",
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"stormgr_id":160
},
{
"volumes":[
"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34"
],
"device_sets":[
{
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a.0.64d7adca-97f0-4ed4-9e98-f81e7557b437",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":237
}
],
"media":"HDD",
"replicas":1,
"rpoolid":1,
"layout":"round-robin",
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"stormgr_id":161
}
],
"rpoolid":1,
"sidecar_info":{
"gpu":0,
"mem":0,
"cpu":0,
"containers":[
],
"hugepages_1g":0,
"hugepages_2m":0
},
"role":"server",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"ctime":1597467867,
"allocated_host_type":"physical",
"gpu":{
"min":0,
"max":0
},
"host_ip":"172.21.24.156",
"enable_hooklogs":true,
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"pod_name":"demo-server-01",
"engine":"docker",
"cpu":{
"min":0,
"max":1,
"reserve":false
},
"k8s_provider":"robin",
"allocated_host_public_ip":"10.9.82.140",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"mem":{
"size":209715200,
"hugepages_1g":0,
"hugepages_2m":0
},
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"env":{
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"ROBINHOST":"cscale-82-140.robinsystems.com",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ENABLE_SSH":true,
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"POD_NAME":"demo-server-01",
"POD_NS":"t001-u000003",
"ROOT_PASSWORD":"",
"K8S_NODE":"cscale-82-140"
},
"ENABLE_SSH":{
"value":true,
"type":"boolean"
}
},
"state":"STARTED",
"service_uids":[
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"role_name":"server"
}
],
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"display_name":"server",
"qgroups":{
"data":{
"wr_weight":1,
"wr_min_window":500,
"rd_min_iops":0,
"enabled":false,
"wr_max_iops":2000000,
"rd_max_iops":2000000,
"priority":1,
"rd_min_window":500,
"rd_weight":1,
"wr_min_iops":0
},
"block":{
"wr_weight":1,
"wr_min_window":500,
"rd_min_iops":0,
"enabled":false,
"wr_max_iops":2000000,
"rd_max_iops":2000000,
"priority":1,
"rd_min_window":500,
"rd_weight":1,
"wr_min_iops":0
}
},
"restart_on_qoscfg":true
}
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"tenant":"Administrators",
"bundleid":1,
"snapshot":"enabled",
"id":47,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"from_template":null,
"restart_num":15,
"clone":"enabled",
"version":"7",
"namespace":"t001-u000003",
"rpool":"default",
"rpoolid":1,
"username":"robin",
"enable_metrics":true,
"app_ns":"t001-u000003"
},
"kind":"robin",
"name":"demo",
"opcode":2,
"namespace":"t001-u000003",
"current_user":{
"tenants":[
"Administrators"
],
"session_expires":"2020-08-15T09:44:41",
"tenant_role":"superadmin",
},
"user_contexts":[
"robin"
],
"tenant_id":1,
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.20.0.1",
"user_permissions":{
},
"user_id":3,
"namespace":"t001-u000003",
"username":"robin",
"user_context":"robin",
"tenant":"Administrators"
},
"action":"start"
},
"jobid":1899
}
11.15. Restart a Robin Application¶
Issue the following command to restart an application:
# robin app restart [<app_name>]
--all
|
Application instance name |
|
Restart all applications |
Example:
# robin app restart mysql --wait
Job: 180 Name: ApplicationStart State: VALIDATED Error: 0
Job: 180 Name: ApplicationStart State: WAITING Error: 0
Job: 180 Name: ApplicationStart State: COMPLETED Error: 0
Note
The robin app restart
command can only be used with Robin Applications.
Restarts a Robin bundle based application.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: redeploy
- This mandatory field within the payload specifies that the restart operation is to be performed.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"orig_config":{
"robin_version":"5.3.1-182",
"auto_relocate":true,
"pvcpolicy":"create",
"enable_hooklogs":true,
"zoneid":1597147518,
"planid":713,
"content_id":"a360b352c8c800e7f1af4075bb3320a4",
"name":"demo",
"roles":[
{
"name":"server",
"display_name":"server",
"vnodes":[
{
"allocated_host":"cscale-82-140.robinsystems.com",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN8WYsAfs0+a1zzAIWIVV5MrZUaur688E08BL7fm+1uBFjBRPEevwrYrNFL7ebjJxYuB1R3WR+IX8Mmz7CiMDvfEiAQL1Ihj4GZ32WSqzZ7MN15UJK4DQWY7sU++VIusyPUj5goVS2mPj0k4zhheNOlC8XaaHgyUq+NjHHDZF5B4mX7huWfM+kC4u5nCvajoHdfeOse4e1n5RlXtlKRqzBbIma6w8Ej32qFxRLvp4lUXzCylYHBLGH42CKWvtxvETwJUb1kIW9DExSnD+u5fd4Dc2D98\/SY79OO4+aa7GA7JV7412S5kWbtq5cpnkDlvhon\/XzLVQlIqIiAJ6ukVmx root@cscale-82-140"
],
"enable_portmapping":true,
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"k8s_provider":"robin",
"appid":47,
"vnodehookargs":{
"postcreate":[
]
},
"numa_allocations":{
"0":{
"isol_shared_cores_used":0,
"gpu_used":0,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"mem_used":209715200,
"non_isol_cores_used":1,
"isol_dedicated_cores_used":0
}
},
"pod_ns":"t001-u000003",
"storage":[
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"media":"HDD",
"disk_tags":{
},
"path":"\/data",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"ext4",
"protection":0,
"workload":0,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"blocksize":4096,
"layout":"round-robin",
"type":"data",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"161",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947",
"next_snapshotid":2,
"qgroupid":161,
"genkey":1597467855202873,
"appname":"default",
"grpid":160,
"resource_poolid":1,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"priority":2
},
"replication":1,
"snap_reserved":20,
"device":"\/dev\/sde",
"encryption":"none",
"compression":"disabled",
"volgrp_name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"k8s_name":"demo-server-01-data-1-4589956b"
},
{
"pvcpolicy":"create",
"lvm_type":"None",
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"media":"HDD",
"disk_tags":{
},
"path":"\/dev\/rda",
"vol_ns":"t001-u000003",
"snapshot_space_limit":214748365,
"fstype":"raw",
"protection":0,
"workload":0,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"blocksize":4096,
"layout":"round-robin",
"type":"block",
"faultdomain":"host",
"lvm_vol_count":"0",
"allocated":{
"partitions":0,
"volumeid":"160",
"params":{
},
"media":72,
"size":1073741824,
"stordriver":{
"type":"das",
"faultdomain":"host",
"protection":0,
"media":"HDD"
},
"block_size":4096,
"current_snapshot":"active_snap",
"multinode_mounting":false,
"snapshot_space_limit":214748365,
"slice_size":1073741824,
"protection":0,
"next_backupid":1,
"name":"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34",
"next_snapshotid":2,
"qgroupid":162,
"genkey":1597467855198470,
"appname":"default",
"grpid":161,
"resource_poolid":1,
"replication":1,
"vtype":0,
"current_snapshotid":1,
"compression":0,
"appid":1,
"priority":2
},
"replication":1,
"snap_reserved":20,
"device":"\/dev\/sdf",
"encryption":"none",
"compression":"disabled",
"volgrp_name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"k8s_name":"demo-server-01-block-1-13a9b1b5"
}
],
"id":80,
"utime":1597467867,
"host_ip":"172.21.24.156",
"restart_on_qoscfg":true,
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"network":[
{
"name":"robin-default",
"allocated_ip":"172.21.24.156",
"allocated_names":[
"eth0"
],
"allocated_by":"system",
"interfaces":1,
"subnet":"172.21.0.0",
"driver":"calico",
"allocated_prefix":16,
"allocated_netmask":"255.255.0.0",
"ippool":"robin-default"
}
],
"calico_inuse":true,
"enable_metrics":true,
"bundleid":1,
"appname":"demo",
"allocated":{
"zonename":"default",
"nodeid":1,
"zoneid":1597147518,
"nodename":"cscale-82-140"
},
"restart_num":15,
"volume_groups":[
{
"volumes":[
"demo.server.01.data.1.4589956b-3709-42f1-812d-6eeb1be3b947"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd.0.9e88d02c-3d16-4c05-89ff-29a4e2f2204a",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":236
}
],
"name":"demo.server.01.72.1.8f528537-0a21-49d0-9f4a-75ed17559bcd",
"stormgr_id":160
},
{
"volumes":[
"demo.server.01.block.1.13a9b1b5-8187-4e2d-8a63-2479d5602e34"
],
"layout":"round-robin",
"media":"HDD",
"replicas":1,
"rpoolid":1,
"device_sets":[
{
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a.0.64d7adca-97f0-4ed4-9e98-f81e7557b437",
"devices":[
{
"max_throughput_intensive_vols_per_disk":1,
"max_latency_sensitive_vols_per_disk":2,
"tags":{
},
"hostname":"cscale-82-140.robinsystems.com",
"score":96,
"allocated_slices":2,
"reattachable":0,
"stormgr_id":2,
"protected":0,
"slices":77,
"max_volumes_per_disk":10,
"aslices":5,
"psize":107374182400,
"write_unit":4096,
"type":"HDD",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"pused":234881024,
"host":"cscale-82-140.robinsystems.com",
"capacity":107374182400,
"role":"Storage",
"state":"READY"
}
],
"stormgr_id":237
}
],
"name":"demo.server.01.72.1.ff9de003-4425-425a-ac04-db91540ee43a",
"stormgr_id":161
}
],
"rpoolid":1,
"sidecar_info":{
"mem":0,
"cpu":0,
"containers":[
],
"gpu":0,
"hugepages_2m":0,
"hugepages_1g":0
},
"role":"server",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"engine":"docker",
"desired_status":"ONLINE",
"allocated_host_type":"physical",
"state":"STARTED",
"name":"demo.server.01",
"enable_hooklogs":true,
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"pod_name":"demo-server-01",
"jobid":1901,
"cpu":{
"min":0,
"max":1,
"reserve":false
},
"role_name":"server",
"vnodeid":80,
"allocated_host_public_ip":"10.9.82.140",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"mem":{
"size":209715200,
"hugepages_2m":0,
"hugepages_1g":0
},
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"env":{
"DOCKER_OPTS":{
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"type":"text"
},
"ROOT_PASSWORD":{
"value":"",
"type":"password"
},
"allocated":{
"ROBINHOST":"cscale-82-140.robinsystems.com",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ENABLE_SSH":true,
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"POD_NAME":"demo-server-01",
"POD_NS":"t001-u000003",
"ROOT_PASSWORD":"",
"K8S_NODE":"cscale-82-140"
},
"ENABLE_SSH":{
"value":true,
"type":"boolean"
}
},
"ctime":1597467867,
"service_uids":[
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"gpu":{
"min":0,
"max":0
}
}
],
"image":{
"name":"robinsys\/centos",
"engine":"docker",
"registry_hostname":"",
"version":"7",
"registry_port":"",
"entrypoint":"entry.sh",
"init_mode":false
},
"volume_groups":[
],
"qgroups":{
"data":{
"wr_min_window":500,
"wr_weight":1,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_min_iops":0,
"priority":1,
"rd_max_iops":2000000,
"rd_weight":1,
"rd_min_iops":0
},
"block":{
"wr_min_window":500,
"wr_weight":1,
"rd_min_window":500,
"enabled":false,
"wr_max_iops":2000000,
"wr_min_iops":0,
"priority":1,
"rd_max_iops":2000000,
"rd_weight":1,
"rd_min_iops":0
}
},
"restart_on_qoscfg":true
}
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"tenant":"Administrators",
"bundleid":1,
"snapshot":"enabled",
"id":47,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"from_template":null,
"restart_num":15,
"clone":"enabled",
"version":"7",
"namespace":"t001-u000003",
"rpool":"default",
"rpoolid":1,
"username":"robin",
"enable_metrics":true,
"app_ns":"t001-u000003"
},
"kind":"robin",
"name":"demo",
"opcode":20,
"namespace":"t001-u000003",
"current_user":{
"tenants":[
"Administrators"
],
"session_expires":"2020-08-15T09:44:41",
"tenant_role":"superadmin",
"user_contexts":[
"robin"
],
"tenant_id":1,
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.20.0.1",
"user_permissions":{
},
"user_id":3,
"namespace":"t001-u000003",
"username":"robin",
"user_context":"robin",
"tenant":"Administrators"
},
"action":"redeploy"
},
"jobid":1902
}
11.16. Application Sharing and the Reasignment of Application Ownership¶
Each application is assigned to a user and a tenant. The user is the
application’s owner (creator) and the tenant is the tenant they were
logged into when they created the app. By default, a regular tenant
user (a user assigned the user
role) can only access and manage
applications they own. There are times, however, when it might be
desirable for an application to be shared with multiple tenant users.
For example, a tenant administrator might want a group of users to
share management responsibilities for an application. To accomplish
this, the tenant admin can give each user shared access to the app
with permission to perform specific administrative tasks, such as
starting and stopping the app, creating snapshots and backups, etc.
In addition to application sharing, there are also times when the
ownership of an application needs to be reassigned from one tenant
user to another. For example, if the application’s owner needs to be
removed from the tenant.
Applications are multi-object entities consisting of the application control object and one or more instance (vnode) objects. There is a very tight coupling between these objects that requires they all be assigned to the same user and tenant. In addition to the objects making up the application, an application may have one or more snapshots or clones associated with it.
A application snapshot contains a point-in-time copy of the application’s data and operational state. Snapshot’s can be used to revert (roll back) an app to a particular point in time, or when creating an application clone.
An application clone is an application instance, however it does not exist independently. The volumes allocated for an application clone are shared with the parent app (linked by the sanpshot the clone was created from).
Requiring all application objects be assigned to the same user and tenant ensures that the user (the application’s owner) will be able to access and manage all resources associated with the application. This is especially true when it comes to app deletion. An app cannot be deleted if there are any snapshots or clones associated with it, and the app’s owner will not be able to delete them (or even see them) if they are ownd by another user. Any snapshot or clone created by a user with shared access to an app will be assigned to the same user and tenant as the app. The user creating the snapshot or clone will automatically be given shared access to the objects they created, however, so they can access it.
Note
The sharing of applications and the reassignment of their ownership is closely aligned with the sharing of namespaces. Before a user to be given access to an application, they first must be given access to the namespace the application is deployed to. Note that the sharing of a namespace is a separate operation from the sharing of an application.
When reassigning ownership of an application, the ownership of all related snapshots and application clones will also be changed.
If a user’s shared access to an app is revoked, then shared access to all snapshots and clones associated with that app will also be revoked.
An application clone must be deployed in the same namespace the parent is deployed in. Even if it’s possible for applications deployed to different namespaces to share storage volume (from a pure storage point of view), to allow it makes validity checking scenarios very complicated and error prone.
A user with shared access to an app will not automatically have access to snapshots and application clones associated with the app. They can be given shared access, however (by a tenantadmin or superadmin user).
A user with shared access to an app (and adequate share permissions) will be able to create and manage the snapshots and clones they create.
A user with shared access to an app will not be allowed to delete the app (only the app owner, a tenantadmin, or superadmin should be able to do that).
Even though there is a relationship between an app and backups crated from that app, the above ownership rule doesn’t apply. That’s because backups can exist independent of the apps they were created from, and even from the cluster they were created on.
11.16.1. Sharing an Application¶
Run the following command to share an app with one or more users:
# robin app share name [user_list]
--operations <operations>
--all-tenant-users
|
Application instance name |
|
Optional comma separated list of users the application will be shared with |
|
Comma separated list of operations the users will be allowed to perform on the shared application. To allow all valid operations to be performed, specify ‘ALL_OPERATIONS’ on the command line (default value is ‘view’) |
|
Share app with all tenant users. Note this option is required when no users are explicitly specified |
Example:
# robin app share demo robin --wait
Job: 101 Name: ApplicationShare State: PROCESSED Error: 0
Job: 101 Name: ApplicationShare State: COMPLETED Error: 0
Note
The ability to share an application is subject to Robin Role Based Access Control (RBAC). By default, only Cluster and Tenant Administrators (users assigned the superadmin or tenantadmin role for the specified tenant) have permission to do so. See the section on User Management for details on how Robin RBAC works.
Tenant Administrators will only be able to share applications that are bound to their tenant.
Applications can only be shared with users who are members of the tenant the application is bound to.
Shares an application with a set of users within a tenant whilst also assigning the operations the aforementioned users are allowed to perform on the application.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: share
- This mandatory field within the payload specifies that the user share operation is to be performed.operation_list: <list_of_operations>
- Utilizing this parameter within the payload, by specifying a comma seperated list of operations, results in the aforementioned users being able to perform the given operations on the target application. The ‘view’ operation is assigned by default regardless of which operations are given.user_list: <list_of_user_names>
- Utilizing this parameter within the payload, by specifiying a comma seperated list of usernames, results in the application being shared with the respective users.all_tenant_users: true
- Utilizing this parameter within the payload results in the application being shared with all users within the tenant the application is deployed in. The default value is false. Note this field overrides any users passed via theuser_list
parameter.all_operations: true
- Utilizing this parameter within the payload results in all valid operations being allowed for the given users on the application. The default value is false. Note this field overrides any operations passed via theoperation_list
parameter.
Note
At least one of the following options, user_list
or all_tenant_users
, must be used in order to specify the users to share the application with. In addition at least one of the following options, operation_list
or all_operations
, must be given to specify the operations these users are allowed to perform on the application. To view a list of operations that can be unshared for the application, review the section detailed here.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"current_user":{
"ip_addr":"172.20.0.1",
"user_permissions":{
},
"username":"robin",
"user_id":3,
"tenants":[
"t2",
"Administrators"
],
"session_expires":"2020-12-09T06:38:52",
"tenant":"Administrators",
"namespace":"t001-u000005",
"user_contexts":[
"robin",
"robin"
],
"tenant_id":1,
"user_context":"robin",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"tenant_role":"superadmin"
},
"name":"demo",
"namespace":"t001-u000005",
"kind":"robin",
"action":"share",
"user_list":[
"robin"
],
"all_tenant_users":false,
"operation_list":[
"view"
],
"opcode":null,
"all_operations":false
},
"jobid":667
}
11.16.2. Stop Sharing an Application¶
Run the following command to stop sharing an app with one or more users:
# robin app unshare name [user_list]
--operations <operations>
--all-tenant-users
|
Application instance name |
|
Optional comma separated list of users the application will no longer be shared with |
|
Comma separated list of operations the users will no longer be allowed to perform on the shared application. To prevent all all valid operations from being performed, specify ‘ALL_OPERATIONS’ on the command line. |
|
Stop sharing app with all tenant users for specified operations. Note this option is required when no users are explicitly specified |
Example:
# robin app unshare demo robin --wait
Job: 102 Name: ApplicationUnshare State: VALIDATED Error: 0
Job: 102 Name: ApplicationUnshare State: COMPLETED Error: 0
Note
The ability to stop sharing an application is subject to Robin Role Based Access Control (RBAC). By default, only Cluster and Tenant Administrators (users assigned the superadmin or tenantadmin role for the specified tenant) have permission to do so. See the section on User Management for details on how Robin RBAC works.
Tenant Administrators will only be able to stop sharing applications that are bound to their tenant.
Unshares an application with a set of users and/or unassigns operations the aforementioned users are allowed to perform on the application.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: unshare
- This mandatory field within the payload specifies that the user unshare operation is to be performed.operation_list: <list_of_operations>
- Utilizing this parameter within the payload, by specifiying a comma seperated list of operations, results in the aforementioned users not being able to perform the given operations on the target application.user_list: <list_of_user_names>
- Utilizing this parameter within the payload, by specifiying a comma seperated list of usernames, results in the application being unshared with the respective users.all_tenant_users: true
- Utilizing this parameter within the payload results in the application being unshared with all users within the tenant the application is deployed in. The default value is false. Note this field overrides any users passed via theuser_list
parameter.all_operations: true
- Utilizing this parameter within the payload results in all valid operations being disallowed for the given application. The default value is false. Note this field overrides any operations passed via theoperation_list
parameter.
Note
At least one of the following options, user_list
or all_tenant_users
, must be used in order to specify the users to share the application with. In addition at least one of the following options, operation_list
or all_operations
, must be given to specify the operations these users aren’t allowed to perform on the application. To view a list of operations that can be unshared for the application, review the section detailed here.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"current_user":{
"ip_addr":"172.20.0.1",
"user_permissions":{
},
"username":"robin",
"user_id":3,
"tenants":[
"t2",
"Administrators"
],
"session_expires":"2020-12-09T06:38:52",
"tenant":"Administrators",
"namespace":"t001-u000005",
"user_contexts":[
"robin",
"robin"
],
"tenant_id":1,
"user_context":"robin",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"tenant_role":"superadmin"
},
"name":"demo",
"namespace":"t001-u000005",
"kind":"robin",
"action":"unshare",
"user_list":[
"robin"
],
"all_tenant_users":false,
"operation_list":[
"ALL_OPERATIONS"
],
"opcode":null,
"all_operations":true
},
"jobid":668
}
11.16.4. Reassign Ownership of an Application¶
Run the following command to reassign ownership of an app to a different tenant user:
# robin app change-owner <app_names> [username]
|
Comma separated list of one or more application names |
|
The username of the new owner. If a username is not provided then ownership of the app will be reassigned to the current user. |
Example:
# robin app change-owner demo user1
Job: 72 Name: ApplicationChangeOwner State: VALIDATED Error: 0
Job: 72 Name: ApplicationChangeOwner State: COMPLETED Error: 0
Note
The ability to reassign ownership of an app is subject to Robin Role Based Access Control (RBAC). By default, only Cluster and Tenant Administrators (users assigned the superadmin or tenantadmin role for the specified tenant) have permission to do so. See the section on User Management for details on how Robin RBAC works.
Tenant Administrators will only be able to reassign ownership of applications that are bound to their tenant.
Ownership of an app can only be reassigned to a user who is a member of the tenant the application is bound to.
Reassigns ownership of an application to a different tenant user.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: change_owner
- This mandatory field within the payload specifies that the change owner operation is to be performed.username: <username>
- This mandatory field within the payload specifies the name of the user to whom the application’s ownership will be reassigned to.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"opcode":null,
"current_user":{
"session_expires":"2020-09-18T17:25:02",
"user_id":3,
"tenant_role":"superadmin",
"user_contexts":[
"robin",
"robin"
],
"username":"robin",
"user_permissions":{
},
"tenant":"Administrators",
"user_context":"robin",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.17.0.1",
"namespace":"t001-u000003",
"tenant_id":1,
"tenants":[
"t2",
"Administrators"
]
},
"username":"user1",
"namespace":"t001-u000003",
"kind":"robin",
"name":"demo",
"action":"change_owner",
"include_children":true
},
"jobid":73
}
11.17. Scaling services for a Robin Application¶
Robin Platform natively provides horizontal scaling of services for applications deployed via a Robin bundle. This allows your application to handle, with no additional downtime, increased loads and requests which could otherwise result in unresponsiveness. Moreover, if its utilization decreases, an application can also be scaled down according to demand. Issue the following command to scale an application horizontally:
# robin app scale <name> <rolename> <count>
--vnode-hostnames <hostnames>
--env <envs>
--ippools <ippools>
--staticmacs <staticmacs>
--tags <tags>
--cpu <cpu>
--gpu <gpu>
--mem <mem>
--storage <storage_config>
|
Application instance name |
|
Name of role to scale |
|
Number of instances to scale the role to |
|
Provide the hostnames on which the additional vnodes will be deployed |
|
Environment variables for additional vnodes |
|
IP Pool names and a comma seperated list of respective static IP addresses to allocate from them for each additional vnode e.g. <ippool_name>=<ip1>,<ip2> etc. |
|
IP Pool names and a comma seperated list of respective static MAC addresses to allocate from them for each additional vnode e.g. <ippool_name>=<static MAC1>,<static MAC2> etc. |
|
Tags for additional vnodes |
|
CPU limits for additional vnodes |
|
GPU limits for additional vnodes |
|
Memory limits for additional vnodes |
|
Storage config for additional vnodes |
Example:
# robin app scale a1 server 3 --cpu 4 --wait
Job: 126 Name: ApplicationScale State: PROCESSED Error: 0
Job: 126 Name: ApplicationScale State: WAITING Error: 0
Job: 126 Name: ApplicationScale State: COMPLETED Error: 0
11.18. Scaling resources for a Robin Application¶
Robin Platform natively provides vertical scaling of services for applications deployed via a Robin bundle. This allows your application to use a greater amount of resources (cpu, memory etc.) which would allow it to function at a greater capacity. It also enables better resource management post-creation of an application. This includes reducing the number of resources consumed by the application. Issue the following command to scale an application vertically:
Note
Only Vnodes which are in the states: ONLINE or PLAN_FAILED, will be scaled up.
# robin app computeqos <app_name>
--role <role>
--cpus <cpu>
--gpus <gpu>
--memory <mem>
--hugepages-2mi <hgps_2m>
--hugepages-1gi <hgps_1g>
--swap <swap>
|
Application instance name |
|
Name of role to scale |
|
Maximum number of CPUs per instance |
|
Maximum number of GPUs per instance |
|
Memory limit per instance in bytes |
|
2Mi Hugepages limit per instance in bytes |
|
1Gi Hugepages limit per instance in bytes |
|
Swap limit per instance in bytes |
Example:
# robin app computeqos a1 --role server --cpus 3 --wait
Job: 128 Name: ApplicationComputeQos State: PROCESSED Error: 0
Job: 128 Name: ApplicationComputeQos State: WAITING Error: 0
Job: 128 Name: ApplicationComputeQos State: COMPLETED Error: 0
11.19. Storage QoS for a Robin Application¶
Robin Platform natively allows a user to manage the storage performance of their application. As a result, a user can set min/max write and read I/O performance for their application which in turn helps reduce I/O bottlenecks depending on the nature of the application. Issue the following command to scale the Storage I/OPs of an application:
# robin app storageqos <app_name>
--role <role>
--volume-type <vol_type>
--read-min-iops <read_min>
--read-max-iops <read_max>
--read-weight <read_weight>
--write-min-iops <write_min>
--write-max-iops <write_max>
--write-weight <write_weight>
|
Application instance name |
|
Name of role to scale storage I/OPs for |
|
Type of volume to scale storage I/OPs for |
|
Minimum I/OPs for read operations |
|
Maximum I/OPs for read operations |
|
Relative weightage for read operations. Only values between 1 and 6 can be specified |
|
Minimum I/OPs for write operations |
|
Maximum I/OPs for write operations |
|
Relative weightage for write operations. Only values between 1 and 6 can be specified |
Example:
# robin app storageqos demo --role server --volume-type data --read-min-iops 1000 --wait
Job: 185 Name: ApplicationStorageQos State: VALIDATED Error: 0
Job: 185 Name: ApplicationStorageQos State: COMPLETED Error: 0
Set min/max write and read I/O performance for an application.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: storageqos
- This mandatory field within the payload specifies that the storage QoS operation is to be performed.role: <role>
- This mandatory field within the payload specifies the name of the application’s role whose volume parameters will be modified.vol_type: <vol_type>
- This mandatory field within the payload specifies the volume type of the aforementioned role for which I/O parameters will be modified.qos_cfg: <dict_of_qos_params>
–rd_min_iops: <rd_min_iops>
- Utilizing this parameter within the dictionary, by specifying an integer, results in the minimum I/OPs for read operations being set to the given value.rd_max_iops: <rd_max_iops>
- Utilizing this parameter within the dictionary, by specifying an integer, results in the maximum I/OPs for read operations being set to the given value.rd_weight: <rd_weight>
- Utilizing this parameter within the dictionary, by specifying an integer between 1 and 6, results in the relative weightage for read operations being set to the given value.wr_min_iops: <wr_min_iops>
- Utilizing this parameter within the dictionary, by specifying an integer, results in the minimum I/OPs for write operations being set to the given value.wr_max_iops: <wr_max_iops>
- Utilizing this parameter within the dictionary, by specifying an integer, results in the maximum I/OPs for write operations being set to the given value.wr_weight: <wr_weight>
- Utilizing this parameter within the dictionary, by specifying an integer between 1 and 6, results in the relative weightage for write operations being set to the given value.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":263,
"plan":{
"action":"storageqos",
"role":"server",
"vol_type":"data",
"qos_cfg":{
"rd_min_iops":1100
},
"name":"test1",
"namespace":"t001-u000003",
"kind":"robin",
"opcode":null,
"current_user":{
"user_id":3,
"username":"robin",
"tenant_id":1,
"tenant":"Administrators",
"tenants":[
"Administrators"
],
"tenant_role":"superadmin",
"namespace":"t001-u000003",
"user_context":"robin",
"user_contexts":[
"robin"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"user_permissions":{
},
},
"appdata":{
"name":"test1",
"version":"7",
"snapshot":"enabled",
"clone":"enabled",
"roles":[
{
"name":"server",
"multinode":true,
"image":{
"name":"robinsys\/centos",
"version":"7",
"engine":"docker",
"entrypoint":"entry.sh",
"init_mode":false,
"registry_hostname":"",
"registry_port":""
},
"display_name":"server",
"vnodes":[
{
"name":"test1.server.01",
"multinode":true,
"storage":[
{
"type":"data",
"media":"HDD",
"path":"\/data",
"size":1073741824,
"blocksize":4096,
"compression":"disabled",
"layout":"round-robin",
"name":"test1.server.01.data.1.057388c3-5410-4152-8b8b-4210165cc384",
"protection":0,
"replication":1,
"faultdomain":"host",
"encryption":"none",
"disk_tags":{
},
"lvm_type":"None",
"lvm_vol_count":"0",
"workload":0,
"snap_reserved":20,
"snapshot_space_limit":214748365,
"fstype":"ext4",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"pvcpolicy":"create",
"k8s_name":"test1-server-01-data-1-057388c3",
"vol_ns":"t001-u000003",
"volgrp_name":"test1.server.01.72.1.d02321dd-0c18-4e47-9e74-0467a0c3517d",
"allocated":{
"size":1073741824,
"grpid":4,
"multinode_mounting":false,
"qgroupid":4,
"appid":1,
"name":"test1.server.01.data.1.057388c3-5410-4152-8b8b-4210165cc384",
"snapshot_space_limit":214748365,
"current_snapshotid":1,
"vtype":0,
"slice_size":1073741824,
"replication":1,
"media":72,
"volumeid":"5",
"protection":0,
"priority":2,
"next_backupid":1,
"compression":0,
"resource_poolid":1,
"partitions":0,
"block_size":4096,
"appname":"default",
"params":{
},
"current_snapshot":"active_snap",
"next_snapshotid":2,
"genkey":1611119983972436,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
}
}
},
{
"type":"block",
"media":"HDD",
"path":"\/dev\/rda",
"size":1073741824,
"fstype":"raw",
"blocksize":4096,
"compression":"disabled",
"layout":"round-robin",
"name":"test1.server.01.block.1.52b19e79-34a6-4797-86a7-724ceae401d2",
"protection":0,
"replication":1,
"faultdomain":"host",
"encryption":"none",
"disk_tags":{
},
"lvm_type":"None",
"lvm_vol_count":"0",
"workload":0,
"snap_reserved":20,
"snapshot_space_limit":214748365,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"pvcpolicy":"create",
"k8s_name":"test1-server-01-block-1-52b19e79",
"vol_ns":"t001-u000003",
"volgrp_name":"test1.server.01.72.1.76fc29b1-a0de-42eb-bede-21e5d1250a4a",
"allocated":{
"size":1073741824,
"grpid":5,
"multinode_mounting":false,
"qgroupid":5,
"appid":1,
"name":"test1.server.01.block.1.52b19e79-34a6-4797-86a7-724ceae401d2",
"snapshot_space_limit":214748365,
"current_snapshotid":1,
"vtype":0,
"slice_size":1073741824,
"replication":1,
"media":72,
"volumeid":"4",
"protection":0,
"priority":2,
"next_backupid":1,
"compression":0,
"resource_poolid":1,
"partitions":0,
"block_size":4096,
"appname":"default",
"params":{
},
"current_snapshot":"active_snap",
"next_snapshotid":2,
"genkey":1611119983965589,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
}
}
}
],
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"cpu":{
"reserve":false,
"min":0,
"max":1
},
"gpu":{
"min":0,
"max":0
},
"mem":{
"size":209715200,
"hugepages_2m":0,
"hugepages_1g":0
},
"env":{
"ENABLE_SSH":{
"type":"boolean",
"value":true
},
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"allocated":{
"ENABLE_SSH":true,
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROOT_PASSWORD":"",
"ROBINHOST":"vnode-95-76.robinsystems.com",
"K8S_NODE":"vnode-95-76.robinsystems.com",
"POD_NAME":"test1-server-01",
"POD_NS":"t001-u000003",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_ROBINRPOOL":"default"
}
},
"network":[
{
"ippool":"robin-default",
"name":"robin-default",
"driver":"calico",
"interfaces":1,
"allocated_ip":"172.21.29.53",
"allocated_netmask":"255.255.0.0",
"allocated_prefix":16,
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_names":[
"eth0"
]
}
],
"enable_portmapping":true,
"enable_hooklogs":true,
"enable_metrics":true,
"sidecar_info":{
"cpu":0,
"mem":0,
"gpu":0,
"hugepages_2m":0,
"hugepages_1g":0,
"containers":[
]
},
"role_name":"server",
"rpoolid":1,
"calico_inuse":true,
"restart_on_qoscfg":true,
"allocated":{
"zoneid":1608100028,
"zonename":"default",
"nodeid":1,
"nodename":"vnode-95-76"
},
"allocated_host":"vnode-95-76.robinsystems.com",
"k8s_provider":"robin",
"allocated_host_type":"physical",
"numa_allocations":{
"0":{
"non_isol_cores_used":1,
"isol_shared_cores_used":0,
"isol_dedicated_cores_used":0,
"mem_used":209715200,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"gpu_used":0
}
},
"allocated_host_public_hostname":"vnode-95-76.robinsystems.com",
"allocated_host_public_ip":"10.9.95.76",
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"kubernetes.io\/arch":[
"amd64"
],
"robin.io\/robinrpool":[
"default"
]
},
"volume_groups":[
{
"media":"HDD",
"rpoolid":1,
"volumes":[
"test1.server.01.data.1.057388c3-5410-4152-8b8b-4210165cc384"
],
"layout":"round-robin",
"device_sets":[
{
"devices":[
{
"wwn":"0xQEMU_QEMU_HARDDISK_b77676df-21a6-40e1-9",
"capacity":53687091200,
"type":"HDD",
"state":"READY",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-0QEMU_QEMU_HARDDISK_b77676df-21a6-40e1-9",
"host":"vnode-95-76.robinsystems.com",
"tags":{
},
"max_volumes_per_disk":10,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"pused":0,
"psize":53687091200,
"slices":38,
"aslices":0,
"write_unit":512,
"stormgr_id":1,
"hostname":"vnode-95-76.robinsystems.com",
"score":100,
"allocated_slices":2
}
],
"name":"test1.server.01.72.1.d02321dd-0c18-4e47-9e74-0467a0c3517d.0.5ef90f50-3ac8-4b14-8164-0f56439118e5",
"stormgr_id":4
}
],
"replicas":1,
"name":"test1.server.01.72.1.d02321dd-0c18-4e47-9e74-0467a0c3517d",
"stormgr_id":4
},
{
"media":"HDD",
"rpoolid":1,
"volumes":[
"test1.server.01.block.1.52b19e79-34a6-4797-86a7-724ceae401d2"
],
"layout":"round-robin",
"device_sets":[
{
"devices":[
{
"wwn":"0xQEMU_QEMU_HARDDISK_b77676df-21a6-40e1-9",
"capacity":53687091200,
"type":"HDD",
"state":"READY",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-0QEMU_QEMU_HARDDISK_b77676df-21a6-40e1-9",
"host":"vnode-95-76.robinsystems.com",
"tags":{
},
"max_volumes_per_disk":10,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"pused":0,
"psize":53687091200,
"slices":38,
"aslices":0,
"write_unit":512,
"stormgr_id":1,
"hostname":"vnode-95-76.robinsystems.com",
"score":100,
"allocated_slices":2
}
],
"name":"test1.server.01.72.1.76fc29b1-a0de-42eb-bede-21e5d1250a4a.0.629def65-6cae-4395-af9f-a126a7b193cb",
"stormgr_id":5
}
],
"replicas":1,
"name":"test1.server.01.72.1.76fc29b1-a0de-42eb-bede-21e5d1250a4a",
"stormgr_id":5
}
],
"pod_name":"test1-server-01",
"pod_ns":"t001-u000003",
"hostname":"test1-server-01.t001-u000003.svc.cluster.local",
"host_ip":"172.21.29.53",
"service_uids":[
],
"vnodehookargs":{
"postcreate":[
]
},
"id":1,
"restart_num":15,
"role":"server",
"appname":"test1",
"appid":2,
"state":"STARTED",
"root_fs":"\/usr\/local\/robin\/instances\/test1-server-01.t001-u000003.svc.cluster.local",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1608100413051\/1611119928411\/centos-7",
"bundle_object_id":"303fa86aab3ed746b67232b00e86025f",
"bundleid":2,
"engine":"docker",
"image":{
"name":"robinsys\/centos",
"version":"7",
"engine":"docker",
"entrypoint":"entry.sh",
"init_mode":false,
"registry_hostname":"",
"registry_port":""
},
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCmMKD4kq7GasuAlIN4OiJ3svBr3ogCDmHiKcC53MwDcbW6BDm2i8pIV1i5MDqcjqoygDdcjIEFqfjdRVqV\/bcGid1sxdTStkdHazQlPFbQ4bYRelySNcWnfn6yeXVfO\/b3E8Bm\/3iYeryEn4A7CyKVdy7jGuRBl2F6c0UqYsMoVMioSrI+obT6crDF85bOTsnunjtqAm9Toz5zACOng2qhSKkrSTNer5uRQ2XfyadEHXlNrgZl2hxolTGrDrGEaUo\/MQC1oO0JkPYsw+XQdx\/JDSKOxeCtuwXOJj\/omlScmjogC9Vei1TzSLKEtSqjv6UCXzKBmyczPBUgnUivG+NV root@vnode-95-76.robinsystems.com"
],
"ctime":1611120032,
"utime":1611120032,
"vnodeid":1
}
],
"qgroups":{
"data":{
"enabled":false,
"priority":1,
"rd_max_iops":2000000,
"rd_min_iops":1000,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"wr_min_iops":0,
"wr_min_window":500,
"wr_weight":1
},
"block":{
"enabled":false,
"priority":1,
"rd_max_iops":2000000,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"wr_min_iops":0,
"wr_min_window":500,
"wr_weight":1
}
},
"restart_on_qoscfg":true,
"volume_groups":[
]
}
],
"robin_version":"5.3.4-1127",
"pvcpolicy":"create",
"rpool":"default",
"from_template":null,
"zoneid":1608100028,
"bundleid":2,
"content_id":"303fa86aab3ed746b67232b00e86025f",
"namespace":"t001-u000003",
"restart_num":15,
"auto_relocate":true,
"rpoolid":1,
"username":"robin",
"tenant":"Administrators",
"app_ns":"t001-u000003",
"enable_hooklogs":true,
"enable_metrics":true,
"planid":1,
"id":2,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1608100413051\/1611119928411\/centos-7",
"bundle_object_id":"303fa86aab3ed746b67232b00e86025f"
}
}
}
11.20. Upgrading a Robin Application¶
Robin Platform provides a native and seamless upgrade workflow for applications deployed via Robin bundles. When a new version of an application bundle is added to a Robin Platform custer, all eligible applications are made available for upgrades. One can proceed with the upgrade of an application in a variety of manners with only minimal downtime for the application. These are the supported upgrade options:
Standard upgrade - all services are upgraded at the same time by restarting pods with the new images and/or hook scripts.
Online upgrade - If the PODs and services are upgraded outside of ROBIN, this mode can be used to upgrade the application to the latest bundle specified for future restarts/redeploys. This option is used when performing an RPM level upgrade inside KVM virtual machine PODs.
Rolling upgrade - the services of an application are updated incrementally with zero to minimal downtime.
Image upgrade(s) - images used for specific (or all) containers across multiple services can be updated to newer versions. This option can be used in combination with the others and will also create a new bundle with a manifest containing the new image names and/or versions.
A dry run of the upgrade can be performed on a clone of the specified application. This allows the user to verify the upgrade works as expected.
In all situations a snapshot of the specified application is taken to ensure if that there are any issues with the upgrade, one can always rollback the application to a healthy state. The snapshot acts as a fail-safe to ensure that an application is always recoverable regardless of what happens with the upgrade. There is an option to disable this feature, but normally this is not recommended.
Note
The upgrade path specifying the version dependencies is defined within the bundle manifest. For more details, review the bundle building guide here.
# robin app upgrade <app_name>
--bundleid <bundle_id>
--image <image_str>
--test
--rolling
--online
--skip-snap
|
Application instance name |
|
ID of bundle to upgrade to |
|
Images to be updated to eg, ‘r1=i1:v1,r1.s1=i2:v2’ where r1 refers to the role, s1 refers to the sidecar container name, i1,i2 refer to the image names and v1,v2 refer to the image versions |
|
Test the upgrade using a clone of the app |
|
Perform a rolling upgrade |
|
Skip taking a snapshot before the upgrade process |
|
Skip restarting the application PODs as part of the upgrade process |
Note
Either one of the following options must be specified: --bundleid
or --image
Example 1 (Rolling upgrade for an application):
# robin app upgrade a4 --bundleid 4 --rolling --wait
Upgrading application a4...Done
Example 2 (Online upgrade for an application without a snapshot):
# robin app upgrade kvm1 --bundleid 4 --online --skip-snap --wait
Upgrading application kvm1...Done
Upgrades an application from the current bundle and image to a newly specified bundle and image.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: upgrade
- This mandatory field within the payload specifies that the upgrade operation is to be performed.bundleid: <bundleid>
- Utilizing this parameter within the payload by specifying an integer representing a bundle ID results in the application being upgraded to the associated bundle.image: <image_str>
- Utilizing this parameter within the payload by specifying a string in the format ‘r1=i1:v1,r1.s1=i2:v2’ where r1 refers to the role, s1 refers to the sidecar container name, i1,i2 refer to the image names and v1,v2 refer to the image versions results in the container/sidecar images being upgraded to those specified.test: true
- Utilizing this parameter within the payload results in a test upgrade being performed on a clone of the application. The default value is False.rolling: true
- Utilizing this parameter within the payload results in the upgrade operation to be performed is a rolling upgrade. The default value is False.take_snap: false
- Utilizing this parameter within the payload determines whether or not a snapshot is taken before an application is upgrade. The default value is True.online: true
- Utilizing this parameter within the payload results in the application PODs not being restarted as part of the upgrade process. The default value is False.
Note
Either one of the following parameters must be specified within the payload: bundleid
or image
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"name":"demo",
"current_user":{
"ip_addr":"172.20.0.1",
"user_permissions":{
},
"username":"robin",
"user_id":3,
"tenants":[
"t2",
"Administrators"
],
"session_expires":"2020-12-08T05:11:45",
"tenant":"Administrators",
"namespace":"t001-u000003",
"user_contexts":[
"robin",
"robin"
],
"tenant_id":1,
"user_context":"robin",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"tenant_role":"superadmin"
},
"bundleid":7,
"rolling":false,
"action":"upgrade",
"kind":"robin",
"authorization_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjozLCJ0ZW5hbnRfaWQiOjEsImV4cCI6MTYwNzQwNDMwNX0.Lawioo1JaQMV99xdPS7c6UcGfveocO00tRZ2qBO6ik8",
"namespace":"random",
"opcode":null,
"test":false
},
"jobid":652
}
11.21. Attach an External Storage Repo to an Application¶
Robin Platform allows entire applications, plus their data to be backed up to an external storage device or service such as AWS S3, Google GCS object stores, etc. Repo management is explained at length here. Issue the following command to attach a repo to an application:
# robin app attach-repo <app_name> <repo_name>
--app-namespace <app_ns>
|
Application instance name |
|
Name of the storage repo |
|
If there are multiple applications of the same name but in different namespaces this option can be used to distinguish them |
Example:
# robin app attach-repo mysql-c1 testrepo --wait
Job: 115 Name: ApplicationAddRepo State: VALIDATED Error: 0
Job: 115 Name: ApplicationAddRepo State: COMPLETED Error: 0
Attaches a repo to an application in order to enable backups for it.
End Point: /api/v3/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: add_repo
- This mandatory field within the payload specifies that the repo attach operation is to be performed.repo_name: <repo_name>
- This mandatory field within the payload specifies the repo to be attached to the application.name: <appname>
- This mandatory field within the payload specifies the application to which the aforementioned repo should be attached.namespace: <app_ns>
- Utilizing this parameter results in only applications within the specified namespace being considered.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"action":"add_repo",
"name":"mysql-jf6s",
"current_user":{
"user_context":"robin",
"tenants":[
"Administrators"
],
"namespace":"t001-u000003",
"session_expires":"2020-09-09T00:09:42",
"tenant_role":"superadmin",
"tenant":"Administrators",
"user_permissions":{
},
"user_contexts":[
"robin",
"robin-k8s-cluster"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.17.0.1",
"user_id":3,
"tenant_id":1,
"username":"robin"
},
"namespace":"t001-u000003",
"opcode":null,
"kind":"robin",
"repo_name":"app-repompsq"
},
"jobid":725
}
11.22. Detach an External Storage Repo from an Application¶
A previously attached storage repo can be detached from an Application using this command:
# robin app detach-repo <app_name> <repo_name>
--app-namespace <app_ns>
--yes
|
Application instance name |
|
Name of the storage repo |
|
If there are multiple applications of the same name but in different namespaces this option can be used to distinguish them |
|
Do not prompt the user for confirmation |
Example:
# robin app detach-repo mysql-c1 testrepo --wait
Job: 116 Name: ApplicationRemoveRepo State: PREPARED Error: 0
Job: 116 Name: ApplicationRemoveRepo State: COMPLETED Error: 0
Detaches a previously attached repo from an application.
End Point: /api/v3/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: remove_repo
- This mandatory field within the payload specifies that the repo detach operation is to be performed.repo_name: <repo_name>
- This mandatory field within the payload specifies the repo to be detached from the application.name: <appname>
- This mandatory field within the payload specifies the application from which the aforementioned repo should be detached.namespace=<app_ns>
- Utilizing this parameter results in only applications within the specified namespace being considered.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"purge":false,
"namespace":"t001-u000003",
"current_user":{
"user_context":"robin",
"tenants":[
"Administrators"
],
"namespace":"t001-u000003",
"session_expires":"2020-09-09T00:09:42",
"tenant_role":"superadmin",
"tenant":"Administrators",
"user_permissions":{
},
"user_contexts":[
"robin",
"robin-k8s-cluster"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.17.0.1",
"user_id":3,
"tenant_id":1,
"username":"robin"
},
"action":"remove_repo",
"name":"mysql-jf6s",
"kind":"robin",
"opcode":null,
"repo_name":"app-repompsq"
},
"jobid":730
}
11.23. Manage Application Snapshot Schedules¶
Robin Platform allows configuring a schedule to automatically snapshot applications and set retention policies. The advantage is that an application can always be rolled back to a point in time when it was healthy. The schedule can be set via a JSON file or a CRON string. Issue the following command to set up a snapshot schedule for an app:
# robin app snapshot-schedule <app_name>
--snapshot-schedule <schedule>
--snapshot-schedule-cron <schedule>
--retain <retained_snapshots>
--app-namespace <app_ns>
--disable
--enable
|
Application instance name |
|
Snapshot schedule specified as JSON |
|
Snapshot schedule specified as CRON string |
|
Number of snapshots to retain with the specified schedule |
|
If there are multiple applications of the same name but in different namespaces this option can be used to distinguish them |
|
Disable the specified schedule |
|
Enable the specified schedule |
The fields that can be specified in the JSON file describing a schedule are:
|
The overall frequency at which to take snapshots. Valid values include: ‘hourly’, ‘daily’, ‘weekly’, ‘monthly’. |
|
An integer between 1-59 representing the minute at which the operation should be run. This field is optional, and the default value is 1 if not specified. |
|
An integer between 0-23 representing the hour at which the operation should be run. This field is optional, and the default value is 0 if not specified. |
|
An integer between 0-6 representing the day of the week on which the operation should be run. Sunday is represented by 0 and so on and so forth. This field is optional, and the default value is 0 if not specified. |
|
An integer between 1-28 representing the day of the month on which the operation should be run. This field is optional, and the default value is 1 if not specified. |
Note
Only one snapshot schedule of each frequency type can be created. You cannot set 2 different hourly snapshot schedules. However, 1 hourly and 1 weekly schedule is a supported combination.
Snapshot Schedule as a JSON:
Here’s an example of a JSON file describing a snapshot schedule:
{
"frequency": "weekly",
"weekday": 3,
"hour": 5,
"minute": 30,
}
The above JSON will configure a snapshot schedule running every week on Wednesday at 05:30 AM.
# robin app snapshot-schedule a1 --snapshot-schedule demo_sched.json --retain 2 --enable --wait
Job: 116 Name: ApplicationSetSnapBack State: PREPARED Error: 0
Job: 116 Name: ApplicationSetSnapBack State: COMPLETED Error: 0
Snapshot Schedule as a CRON:
Robin allows one to specify a snapshot schedule via a CRON string with the standardised format. However there are three caveats. First the minute parameter of the string must always be set as minutely snapshot schedules are not supported. In a similar vein the parameter indicating the month must also be set (if applicable) as yearly schedules are not supported either. Finally one cannot specify both a day of the month and a day of the week as it is not a support configuration.
Here’s an example of a CRON string describing a snapshot schedule:
30 5 * * 3
The above CRON string configures a snapshot schedule running every week on Wednesday at 05:30 AM.
# robin app snapshot-schedule a1 --snapshot-schedule-cron "30 5 * * 3" --retain 2 --enable --wait
Job: 116 Name: ApplicationSetSnapBack State: PREPARED Error: 0
Job: 116 Name: ApplicationSetSnapBack State: COMPLETED Error: 0
11.24. Manage Application Backup Schedules¶
Robin Platform allows configuring a schedule to automatically backup application snapshots and set retention policies. The advantage is that an application can always be restored to the state saved in the backup. The schedule can be set via a JSON file or a CRON string. Issue the following command to set up a backup schedule for an app:
Note
A snapshot schedule must be configured for the application before a backup schedule can be set.
# robin app backup-schedule <app_name>
--backup-schedule <schedule>
--backup-schedule-cron <schedule>
--retain <retained_backups>
--filter <snap_filter>
--app-namespace <app_ns>
--disable
--enable
|
Application instance name |
|
Backup schedule specified as JSON |
|
Backup schedule specified as CRON string |
|
Number of backups to retain with the specified schedule |
|
Frequency of snapshot schedule to backup |
|
If there are multiple applications of the same name but in different namespaces this option can be used to distinguish them |
|
Disable the specified schedule |
|
Enable the specified schedule |
The fields that can be specified in the JSON file describing a schedule are:
|
The overall frequency at which to take backups. Valid values include: ‘hourly’, ‘daily’, ‘weekly’, ‘monthly’. |
|
An integer between 1-59 representing the minute at which the operation should be run. This field is optional, and the default value is 1 if not specified. |
|
An integer between 0-23 representing the hour at which the operation should be run. This field is optional, and the default value is 0 if not specified. |
|
An integer between 0-6 representing the day of the week on which the operation should be run. Sunday is represented by 0 and so on and so forth. This field is optional, and the default value is 0 if not specified. |
|
An integer between 1-28 representing the day of the month on which the operation should be run. This field is optional, and the default value is 1 if not specified. |
Note
Only one backup schedule of each frequency type can be created. You cannot set 2 different hourly backup schedules. However, 1 hourly and 1 weekly schedule is a supported combination.
Backup Schedule as a JSON:
Here’s an example of a JSON file describing a backup schedule:
{
"frequency": "weekly",
"weekday": 0,
"hour": 7,
"minute": 15,
}
The above JSON will configure a backup schedule running every week on Sunday at 07:15 AM.
# robin app backup-schedule a1 --backup-schedule demo_sched.json --retain 3 --enable --filter daily --wait
Job: 116 Name: ApplicationSetSnapBack State: PREPARED Error: 0
Job: 116 Name: ApplicationSetSnapBack State: COMPLETED Error: 0
Backup Schedule as a CRON:
Robin allows one to specify a backup schedule via a CRON string with the standardised format. However there are three caveats. First the minute parameter of the string must always be set as minutely backup schedules are not supported. In a similar vein the parameter indicating the month must also be set (if applicable) as yearly schedules are not supported either. Finally one cannot specify both a day of the month and a day of the week as it is not a support configuration.
Here’s an example of a CRON string describing a snapshot schedule:
15 7 * * 0
The above CRON string will configure a backup schedule running every week on Sunday at 07:15 AM.
# robin app backup-schedule a1 --backup-schedule-cron "15 7 * * 0" --retain 2 --enable --filter daily --wait
Job: 116 Name: ApplicationSetSnapBack State: PREPARED Error: 0
Job: 116 Name: ApplicationSetSnapBack State: COMPLETED Error: 0
11.25. Restore an Application from a Snapshot¶
An application can be restored to the point-in-time state saved within an associated snapshot. Issue the following command to recover an app to a specific point-in-time:
# robin app restore <app_name>
--snapshotid <snapshotid>
--skip-rx-pvcs
--include-rx-pvcs
|
Application instance name |
|
ID of application snapshot |
|
Skip restoring RWX and ROX PVCs |
|
Include the restoration of RWX and ROX PVCs |
Note
You must provide the --snapshotid
.
Example:
# robin app restore mysql1 --snapshotid 2b388be6497211eaba7a190f2cdd554f --wait
Job: 188 Name: ApplicationRollback State: PREPARED Error: 0
Job: 188 Name: ApplicationRollback State: AGENT_WAIT Error: 0
Job: 188 Name: ApplicationRollback State: COMPLETED Error: 0
Restores an application to the point-in-time state saved within an associated snapshot or backup (a snapshot that has been pushed to a storage repo).
End Point: /api/v3/robin_server/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: rollback
- This mandatory field within the payload specifies that the restore operation is to be performed.snapshotid: <snapshotid>
- Utilizing this parameter, by specifiying the UUID of a snapshot, results in the application being rolled back to the state saved in the aformentioned snapshot.backupid: <backupid>
- Utilizing this parameter, by specifiying the UUID of a backup, results in the application being rolled back to the state saved in the aformentioned backup.
Note
One of snapshotid
or backupid
must be provided.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"snap_app":{
"roles":[
{
"vnodes":[
{
"service_uids":[
"390f55e2-56dd-46f1-8c94-4f0c38c92aeb"
],
"rpoolid":1,
"network":[
{
"subnet":"172.21.0.0",
"ippool":"robin-default",
"interfaces":1,
"allocated_ip":"172.21.24.104",
"allocated_prefix":16,
"name":"robin-default",
"allocated_by":"system",
"driver":"calico",
"allocated_names":[
"eth0"
],
"allocated_netmask":"255.255.0.0"
}
],
"sidecar_info":{
"mem":0,
"gpu":0,
"hugepages_2m":0,
"containers":[
],
"cpu":0,
"hugepages_1g":0
},
"hosttags":{
"robinhost":[
"cscale-82-239"
],
"kubernetes.io\/arch":[
"amd64"
],
"rnodetype":[
"robin-worker-node"
],
"nodetype":[
"robin-node"
],
"domain":[
"ROBIN"
],
"kubernetes.io\/os":[
"linux"
],
"robin.io\/robinrpool":[
"default"
],
"robinrpool":[
"default"
]
},
"enable_hooklogs":true,
"cmdlineargs":"-W",
"vnodehooks":{
"prestart":"bash vnode_sample opr=prestart",
"postcreate":"bash check_mysql",
"poststart":"bash check_mysql",
"postgrow":"bash check_mysql",
"postrollback":"bash check_mysql",
"poststop":"bash vnode_sample opr=poststop",
"pregrow":"bash vnode_sample opr=pregrow",
"prerollback":"bash vnode_sample opr=prerollback",
"preclone":"bash vnode_sample opr=preclone",
"prestop":"bash vnode_sample opr=prestop",
"precreate":"bash vnode_sample opr=precreate",
"postsnapshot":"bash unquiesce.sh",
"presnapshot":"bash quiesce.sh",
"postclone":"bash check_mysql",
"postdestroy":"bash vnode_sample opr=postdestroy",
"predestroy":"bash vnode_sample opr=predestroy"
},
"hostname":"lak-mysql-01.t001-u000003.svc.cluster.local",
"bundle_object_id":"7be85809d7ecf1544e461df868f163ad",
"enable_portmapping":true,
"image":{
"entrypoint":"custom-entrypoint.sh",
"engine":"docker",
"version":"5.7",
"registry_hostname":"",
"name":"mysql",
"registry_port":""
},
"numa_allocations":{
"0":{
"gpu_used":0,
"isol_dedicated_cores_used":0,
"hugepages_1g_used":0,
"non_isol_cores_used":1,
"isol_shared_cores_used":0,
"hugepages_2m_used":0,
"mem_used":1073741824
}
},
"calico_inuse":true,
"allocated_host_public_hostname":"cscale-82-239.robinsystems.com",
"allocated":{
"zoneid":1595331866,
"zonename":"default",
"nodename":"cscale-82-239",
"nodeid":4
},
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1595307896158\/1595307917814\/mysql-5.7",
"host_ip":"172.21.24.104",
"appid":43,
"mem":{
"hugepages_2m":0,
"size":1073741824,
"hugepages_1g":0
},
"gpu":{
"max":0,
"min":0
},
"state":"STARTED",
"enable_metrics":true,
"allocated_host_public_ip":"10.9.82.239",
"commandline":"-W",
"cpu":{
"max":1,
"min":0
},
"allocated_host_type":"physical",
"allocated_host":"cscale-82-239.robinsystems.com",
"role":"mysql",
"ctime":1599592323,
"volume_groups":[
{
"stormgr_id":56,
"name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c",
"layout":"round-robin",
"volumes":[
"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726"
],
"media":"HDD",
"device_sets":[
{
"stormgr_id":75,
"name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c.0.cc0ba584-9372-4828-9058-24918a6093a9",
"devices":[
{
"role":"Storage",
"max_throughput_intensive_vols_per_disk":1,
"pused":1006632960,
"reattachable":0,
"protected":0,
"max_latency_sensitive_vols_per_disk":2,
"wwn":"0x6002248067f958fce9788c6f585a1eb7",
"psize":107374182400,
"hostname":"cscale-82-239.robinsystems.com",
"write_unit":4096,
"aslices":49,
"slices":77,
"capacity":107374182400,
"tags":{
},
"allocated_slices":2,
"stormgr_id":6,
"type":"HDD",
"state":"READY",
"score":74,
"devpath":"\/dev\/disk\/by-id\/scsi-36002248067f958fce9788c6f585a1eb7",
"max_volumes_per_disk":40,
"host":"cscale-82-239.robinsystems.com"
}
]
}
],
"rpoolid":1,
"replicas":1
}
],
"restart_num":15,
"pod_name":"lak-mysql-01",
"vnodeid":16,
"engine":"docker",
"appname":"lak",
"storage":[
{
"faultdomain":"host",
"protection":0,
"snap_reserved":20,
"media":"HDD",
"encryption":"none",
"workload":0,
"fstype":"ext4",
"replication":1,
"layout":"round-robin",
"volgrp_name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c",
"snapname":"snap1",
"lvm_vol_count":"0",
"path":"\/var\/lib\/mysql",
"compression":"disabled",
"blocksize":4096,
"k8s_name":"lak-mysql-01-data-1-db34409d",
"vol_ns":"t001-u000003",
"disk_tags":{
},
"allocated":{
"media":72,
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"host",
"protection":0
},
"replication":1,
"next_backupid":1,
"appname":"default",
"resource_poolid":1,
"vtype":0,
"current_snapshotid":1,
"slice_size":1073741824,
"protection":0,
"multinode_mounting":false,
"volumeid":"56",
"compression":0,
"priority":2,
"params":{
},
"qgroupid":58,
"next_snapshotid":2,
"appid":1,
"name":"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726",
"block_size":4096,
"snapshot_space_limit":214748365,
"current_snapshot":"active_snap",
"size":1073741824,
"genkey":1599592280515667,
"snapname":"snap1",
"grpid":56,
"partitions":0
},
"lvm_type":"None",
"type":"data",
"snapshot_space_limit":214748365,
"size":1073741824,
"name":"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726",
"pvcpolicy":"create",
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"host",
"protection":0
}
}
],
"services":[
{
"vnodename":"lak-mysql-01",
"selectors":{
"robin.io\/vnode":"lak-mysql-01"
},
"labels":{
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"robin.io\/tenant_id":"1",
"robin.io\/user_id":"3",
"scope":"vnode",
"robin.io\/tenant":"Administrators"
},
"appname":"lak",
"k8s_name":"lak-mysql-01-np-0",
"ports":[
{
"port":3306,
"name":"tcp-port3306",
"protocol":"TCP",
"target_port":3306,
"node_port":30640
}
],
"cluster_ip":"172.19.45.11",
"type":"NodePort"
}
],
"env":{
"MYSQL_USER":{
"type":"text",
"value":"robin"
},
"MYSQL_DATABASE":{
"type":"text",
"value":"robin"
},
"allocated":{
"MYSQL_USER":"robin",
"ROBINHOST_TAG_ROBINHOST":"cscale-82-239",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_NODETYPE":"robin-node",
"MYSQL_PASSWORD":"robin123",
"POD_NS":"t001-u000003",
"ROBINHOST":"cscale-82-239.robinsystems.com",
"POD_NAME":"lak-mysql-01",
"MYSQL_ROOT_PASSWORD":"robin123",
"K8S_NODE":"cscale-82-239",
"MYSQL_DATABASE":"robin",
"ROBINHOST_TAG_DOMAIN":"ROBIN",
"ROBINHOST_TAG_RNODETYPE":"robin-worker-node",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux"
},
"MYSQL_ROOT_PASSWORD":{
"type":"password",
"value":"robin123"
},
"MYSQL_PASSWORD":{
"type":"password",
"value":"robin123"
}
},
"root_fs":"\/usr\/local\/robin\/instances\/lak-mysql-01.t001-u000003.svc.cluster.local",
"restart_on_qoscfg":true,
"k8s_provider":"robin",
"vnodehookargs":{
"postdestroy":[
"opr=postdestroy"
],
"prestart":[
"opr=prestart"
],
"postcreate":[
],
"poststart":[
],
"postrollback":[
],
"postgrow":[
],
"poststop":[
"opr=poststop"
],
"pregrow":[
"opr=pregrow"
],
"prerollback":[
"opr=prerollback"
],
"preclone":[
"opr=preclone"
],
"prestop":[
"opr=prestop"
],
"precreate":[
"opr=precreate"
],
"postsnapshot":[
],
"postclone":[
],
"presnapshot":[
],
"predestroy":[
"opr=predestroy"
]
},
"role_name":"mysql",
"name":"lak.mysql.01",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKS44FJBT75q64OPV8s1WL\/lFbMogtnSm9wk6i+uQArrteNI6DhMYnBV8GC+Dttr2sxurxm\/QEW3Pa9OKhtCtT\/CQ0h+w7u8f8Mu77zAtAd4rhFAtuK86wiZPp8vSRp3Q2l7TMC31VV08wa7fulk\/SSF6maJRQxxmH2lNOsHYOHZve4TSZ+FuGT5h0KMAtGjy7jDSfdt4nBFb\/EzVuUE70y8x8q7SmObQGCDBoQlC\/QwcmBJ+T25l7fDfVTSXSjCRb2wN2DIxUA7Cr1hNRoZNPAAFahq+jWYYS+aKaXVe6cR6GEtgQ66ey7Zn8ZHOrmW9n9LEnYT\/CmzV6l4gwfyIp root@cscale-82-236",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxdMba+MjIxpx8IzmIodVTs13BJj3BAsRaeOpIC3g07eKcb\/WCJ3E9kFvOyJzqX1KmOpYqwtYG0zTwd+xPlc9fudEoORLM2jAt5JZQliT8IDGLyRYqhsOaL+HPKeO8VU9u0sd8938OXGKEJQ1Qt0DQcXuXTSDYGefS24TaWxJ6r\/bbM0WXYrJiFc83LemUHGq\/vdNpXNbGiAMPCTF3\/ZkHsIQTJd8dmBXn3VsEcRbvSGnHIXvQjRZRJp5hBVl\/zFZtGFuT7Rs1IVpZtsO81hFCkgAX\/jonSglX193+A5oCFPeTsfOD01A3r9x3qdcgtSwxkU5ElmksR6BNt0pXenO7 root@cscale-82-238",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwaDQ4NFtH5X1NVdUW\/trWG0W3LaLOQdz0LIwTMiYo707zpW5STz6R4qRCyonqA5DGx9KicnDvbLYXrDtEFczf68j3N9mgm4QKQ5NAUsKgCrXD\/musfl7T0kwmADh4tWI1pbnEJNAfY+xOvKqd1MQIoXNY3jDHlZghb0un+ZnCkxlEwLNUEZySdVhuUitK6fH0abpbLDSWAqqWvzBQMeTYVD91KJPqQXPyejQcjw31dmFYQJ+Ru7Nm0+iifXIZ4poyGZuxNZL9K0F4j+mS+LQav+dAnQGfL62HyAZhHmFoqF9l1GQs6qwrWU6UaZPLAt3XaghtDJwXTks6vEkjibNN root@cscale-82-237"
],
"utime":1599592323,
"pod_ns":"t001-u000003",
"bundleid":4,
"id":16
}
],
"image":{
"entrypoint":"custom-entrypoint.sh",
"engine":"docker",
"version":"5.7",
"registry_hostname":"",
"name":"mysql",
"registry_port":""
},
"commandline":"-W",
"volume_groups":[
],
"display_name":"Runs mysql database server",
"qgroups":{
"data":{
"rd_min_iops":0,
"enabled":false,
"wr_min_iops":0,
"priority":1,
"rd_weight":1,
"wr_max_iops":2000000,
"wr_weight":1,
"rd_max_iops":2000000,
"wr_min_window":500,
"rd_min_window":500
}
},
"restart_on_qoscfg":true,
"name":"mysql",
"service_ports":[
3306
]
}
],
"desc":"",
"rpool":"default",
"enable_hooklogs":true,
"bundle_object_id":"7be85809d7ecf1544e461df868f163ad",
"from_template":null,
"parentid":43,
"clonemode":"unfenced",
"auto_relocate":true,
"name":"lak_snap1",
"clone":"enabled",
"snapname":"snap1",
"robin_version":"5.3.1-349",
"snapshot":"enabled",
"parent_last_known_state":6,
"restart_num":15,
"namespace":"t001-u000003",
"planid":522,
"rpoolid":1,
"tenant":"Administrators",
"content_id":"7be85809d7ecf1544e461df868f163ad",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1595307896158\/1595307917814\/mysql-5.7",
"app_ns":"t001-u000003",
"bundleid":4,
"master_name":"lak",
"apphooks":{
"postdestroy":"bash app_sample postdestroy",
"prestart":"bash app_sample prestart",
"validate":"python3.4 validate_template.py",
"health":"python3.4 health.py",
"postcreate":"bash app_sample postcreate",
"poststart":"bash app_sample poststart",
"allocated":{
"prestart":"bash app_sample prestart",
"validate":"python3.4 validate_template.py",
"health":"python3.4 health.py",
"postcreate":"bash app_sample postcreate",
"poststart":"bash app_sample poststart",
"postgrow":"bash app_sample postgrow",
"postrollback":"bash app_sample postrollback",
"poststop":"bash app_sample poststop",
"pregrow":"bash app_sample pregrow",
"prerollback":"bash app_sample prerollback",
"preclone":"bash app_sample preclone",
"prestop":"bash app_sample prestop",
"precreate":"bash app_sample precreate",
"postsnapshot":"bash app_sample postsnapshot",
"presnapshot":"bash app_sample presnapshot",
"postclone":"bash app_sample postclone",
"postdestroy":"bash app_sample postdestroy",
"predestroy":"bash app_sample predestroy"
},
"postrollback":"bash app_sample postrollback",
"postgrow":"bash app_sample postgrow",
"poststop":"bash app_sample poststop",
"pregrow":"bash app_sample pregrow",
"prerollback":"bash app_sample prerollback",
"preclone":"bash app_sample preclone",
"prestop":"bash app_sample prestop",
"precreate":"bash app_sample precreate",
"postsnapshot":"bash app_sample postsnapshot",
"postclone":"bash app_sample postclone",
"presnapshot":"bash app_sample presnapshot",
"predestroy":"bash app_sample predestroy"
},
"enable_metrics":true,
"zoneid":1595331866,
"id":43,
"pvcpolicy":"create",
"username":"robin"
},
"orig_app":{
"roles":[
{
"qgroups":{
"data":{
"rd_min_iops":0,
"wr_min_iops":0,
"wr_weight":1,
"priority":1,
"rd_weight":1,
"wr_max_iops":2000000,
"enabled":false,
"rd_max_iops":2000000,
"wr_min_window":500,
"rd_min_window":500
}
},
"image":{
"entrypoint":"custom-entrypoint.sh",
"engine":"docker",
"version":"5.7",
"registry_hostname":"",
"name":"mysql",
"registry_port":""
},
"commandline":"-W",
"restart_on_qoscfg":true,
"volume_groups":[
],
"display_name":"Runs mysql database server",
"vnodes":[
{
"service_uids":[
"390f55e2-56dd-46f1-8c94-4f0c38c92aeb"
],
"rpoolid":1,
"network":[
{
"subnet":"172.21.0.0",
"ippool":"robin-default",
"interfaces":1,
"allocated_ip":"172.21.24.104",
"allocated_prefix":16,
"name":"robin-default",
"allocated_by":"system",
"driver":"calico",
"allocated_names":[
"eth0"
],
"allocated_netmask":"255.255.0.0"
}
],
"sidecar_info":{
"mem":0,
"gpu":0,
"hugepages_2m":0,
"containers":[
],
"cpu":0,
"hugepages_1g":0
},
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"robinrpool":[
"default"
],
"rnodetype":[
"robin-worker-node"
],
"nodetype":[
"robin-node"
],
"domain":[
"ROBIN"
],
"kubernetes.io\/os":[
"linux"
],
"robinhost":[
"cscale-82-239"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"enable_hooklogs":true,
"cmdlineargs":"-W",
"vnodehooks":{
"postdestroy":"bash vnode_sample opr=postdestroy",
"prestart":"bash vnode_sample opr=prestart",
"postcreate":"bash check_mysql",
"poststart":"bash check_mysql",
"postrollback":"bash check_mysql",
"postgrow":"bash check_mysql",
"poststop":"bash vnode_sample opr=poststop",
"pregrow":"bash vnode_sample opr=pregrow",
"prerollback":"bash vnode_sample opr=prerollback",
"preclone":"bash vnode_sample opr=preclone",
"prestop":"bash vnode_sample opr=prestop",
"precreate":"bash vnode_sample opr=precreate",
"postsnapshot":"bash unquiesce.sh",
"postclone":"bash check_mysql",
"presnapshot":"bash quiesce.sh",
"predestroy":"bash vnode_sample opr=predestroy"
},
"hostname":"lak-mysql-01.t001-u000003.svc.cluster.local",
"bundle_object_id":"7be85809d7ecf1544e461df868f163ad",
"enable_portmapping":true,
"image":{
"entrypoint":"custom-entrypoint.sh",
"engine":"docker",
"version":"5.7",
"registry_hostname":"",
"name":"mysql",
"registry_port":""
},
"numa_allocations":{
"0":{
"gpu_used":0,
"isol_dedicated_cores_used":0,
"hugepages_1g_used":0,
"non_isol_cores_used":1,
"isol_shared_cores_used":0,
"hugepages_2m_used":0,
"mem_used":1073741824
}
},
"commandline":"-W",
"calico_inuse":true,
"allocated_host_public_hostname":"cscale-82-239.robinsystems.com",
"allocated":{
"zoneid":1595331866,
"zonename":"default",
"nodename":"cscale-82-239",
"nodeid":4
},
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1595307896158\/1595307917814\/mysql-5.7",
"host_ip":"172.21.24.104",
"appid":43,
"mem":{
"hugepages_1g":0,
"size":1073741824,
"hugepages_2m":0
},
"gpu":{
"max":0,
"min":0
},
"storage":[
{
"faultdomain":"host",
"snapshot_space_limit":214748365,
"snap_reserved":20,
"media":"HDD",
"encryption":"none",
"workload":0,
"fstype":"ext4",
"replication":1,
"layout":"round-robin",
"volgrp_name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c",
"lvm_vol_count":"0",
"path":"\/var\/lib\/mysql",
"compression":"disabled",
"type":"data",
"blocksize":4096,
"k8s_name":"lak-mysql-01-data-1-db34409d",
"vol_ns":"t001-u000003",
"disk_tags":{
},
"allocated":{
"media":72,
"replication":1,
"next_backupid":1,
"appname":"default",
"resource_poolid":1,
"vtype":0,
"current_snapshotid":2,
"next_snapshotid":2,
"compression":0,
"multinode_mounting":false,
"volumeid":"56",
"priority":2,
"params":{
},
"snapshot_space_limit":214748365,
"qgroupid":58,
"slice_size":1073741824,
"appid":1,
"name":"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726",
"block_size":4096,
"protection":0,
"current_snapshot":"active_snap",
"size":1073741824,
"partitions":0,
"genkey":1599592280515667,
"grpid":56,
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"host",
"protection":0
}
},
"lvm_type":"None",
"name":"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726",
"protection":0,
"size":1073741824,
"pvcpolicy":"create",
"stordriver":{
"media":"HDD",
"type":"das",
"faultdomain":"host",
"protection":0
}
}
],
"enable_metrics":true,
"allocated_host_public_ip":"10.9.82.239",
"state":"STARTED",
"cpu":{
"max":1,
"min":0
},
"allocated_host_type":"physical",
"allocated_host":"cscale-82-239.robinsystems.com",
"role":"mysql",
"ctime":1599592323,
"volume_groups":[
{
"rpoolid":1,
"name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c",
"device_sets":[
{
"name":"lak.mysql.01.72.1.2519c51d-f90d-4753-9fd8-bc689b32938c.0.cc0ba584-9372-4828-9058-24918a6093a9",
"stormgr_id":75,
"devices":[
{
"role":"Storage",
"max_throughput_intensive_vols_per_disk":1,
"pused":1006632960,
"reattachable":0,
"protected":0,
"max_latency_sensitive_vols_per_disk":2,
"wwn":"0x6002248067f958fce9788c6f585a1eb7",
"psize":107374182400,
"hostname":"cscale-82-239.robinsystems.com",
"write_unit":4096,
"aslices":49,
"slices":77,
"capacity":107374182400,
"tags":{
},
"allocated_slices":2,
"stormgr_id":6,
"type":"HDD",
"state":"READY",
"score":74,
"devpath":"\/dev\/disk\/by-id\/scsi-36002248067f958fce9788c6f585a1eb7",
"max_volumes_per_disk":40,
"host":"cscale-82-239.robinsystems.com"
}
]
}
],
"volumes":[
"lak.mysql.01.data.1.db34409d-5077-4505-9382-b74cab487726"
],
"layout":"round-robin",
"media":"HDD",
"stormgr_id":56,
"replicas":1
}
],
"restart_num":15,
"pod_name":"lak-mysql-01",
"vnodeid":16,
"engine":"docker",
"appname":"lak",
"services":[
{
"vnodename":"lak-mysql-01",
"selectors":{
"robin.io\/vnode":"lak-mysql-01"
},
"labels":{
"namespace":"t001-u000003",
"robin.io\/username":"robin",
"robin.io\/tenant":"Administrators",
"robin.io\/user_id":"3",
"scope":"vnode",
"robin.io\/tenant_id":"1"
},
"appname":"lak",
"k8s_name":"lak-mysql-01-np-0",
"ports":[
{
"protocol":"TCP",
"name":"tcp-port3306",
"port":3306,
"target_port":3306,
"node_port":30640
}
],
"cluster_ip":"172.19.45.11",
"type":"NodePort"
}
],
"env":{
"MYSQL_USER":{
"type":"text",
"value":"robin"
},
"MYSQL_DATABASE":{
"type":"text",
"value":"robin"
},
"allocated":{
"MYSQL_USER":"robin",
"ROBINHOST_TAG_ROBINHOST":"cscale-82-239",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"POD_NS":"t001-u000003",
"ROBINHOST_TAG_NODETYPE":"robin-node",
"MYSQL_PASSWORD":"robin123",
"POD_NAME":"lak-mysql-01",
"ROBINHOST":"cscale-82-239.robinsystems.com",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"K8S_NODE":"cscale-82-239",
"MYSQL_DATABASE":"robin",
"ROBINHOST_TAG_DOMAIN":"ROBIN",
"ROBINHOST_TAG_RNODETYPE":"robin-worker-node",
"MYSQL_ROOT_PASSWORD":"robin123",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux"
},
"MYSQL_ROOT_PASSWORD":{
"type":"password",
"value":"robin123"
},
"MYSQL_PASSWORD":{
"type":"password",
"value":"robin123"
}
},
"root_fs":"\/usr\/local\/robin\/instances\/lak-mysql-01.t001-u000003.svc.cluster.local",
"restart_on_qoscfg":true,
"k8s_provider":"robin",
"vnodehookargs":{
"prestart":[
"opr=prestart"
],
"postcreate":[
],
"poststart":[
],
"postgrow":[
],
"postrollback":[
],
"poststop":[
"opr=poststop"
],
"pregrow":[
"opr=pregrow"
],
"prerollback":[
"opr=prerollback"
],
"preclone":[
"opr=preclone"
],
"prestop":[
"opr=prestop"
],
"precreate":[
"opr=precreate"
],
"postsnapshot":[
],
"presnapshot":[
],
"postclone":[
],
"postdestroy":[
"opr=postdestroy"
],
"predestroy":[
"opr=predestroy"
]
},
"role_name":"mysql",
"name":"lak.mysql.01",
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKS44FJBT75q64OPV8s1WL\/lFbMogtnSm9wk6i+uQArrteNI6DhMYnBV8GC+Dttr2sxurxm\/QEW3Pa9OKhtCtT\/CQ0h+w7u8f8Mu77zAtAd4rhFAtuK86wiZPp8vSRp3Q2l7TMC31VV08wa7fulk\/SSF6maJRQxxmH2lNOsHYOHZve4TSZ+FuGT5h0KMAtGjy7jDSfdt4nBFb\/EzVuUE70y8x8q7SmObQGCDBoQlC\/QwcmBJ+T25l7fDfVTSXSjCRb2wN2DIxUA7Cr1hNRoZNPAAFahq+jWYYS+aKaXVe6cR6GEtgQ66ey7Zn8ZHOrmW9n9LEnYT\/CmzV6l4gwfyIp root@cscale-82-236",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxdMba+MjIxpx8IzmIodVTs13BJj3BAsRaeOpIC3g07eKcb\/WCJ3E9kFvOyJzqX1KmOpYqwtYG0zTwd+xPlc9fudEoORLM2jAt5JZQliT8IDGLyRYqhsOaL+HPKeO8VU9u0sd8938OXGKEJQ1Qt0DQcXuXTSDYGefS24TaWxJ6r\/bbM0WXYrJiFc83LemUHGq\/vdNpXNbGiAMPCTF3\/ZkHsIQTJd8dmBXn3VsEcRbvSGnHIXvQjRZRJp5hBVl\/zFZtGFuT7Rs1IVpZtsO81hFCkgAX\/jonSglX193+A5oCFPeTsfOD01A3r9x3qdcgtSwxkU5ElmksR6BNt0pXenO7 root@cscale-82-238",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwaDQ4NFtH5X1NVdUW\/trWG0W3LaLOQdz0LIwTMiYo707zpW5STz6R4qRCyonqA5DGx9KicnDvbLYXrDtEFczf68j3N9mgm4QKQ5NAUsKgCrXD\/musfl7T0kwmADh4tWI1pbnEJNAfY+xOvKqd1MQIoXNY3jDHlZghb0un+ZnCkxlEwLNUEZySdVhuUitK6fH0abpbLDSWAqqWvzBQMeTYVD91KJPqQXPyejQcjw31dmFYQJ+Ru7Nm0+iifXIZ4poyGZuxNZL9K0F4j+mS+LQav+dAnQGfL62HyAZhHmFoqF9l1GQs6qwrWU6UaZPLAt3XaghtDJwXTks6vEkjibNN root@cscale-82-237"
],
"utime":1599592323,
"pod_ns":"t001-u000003",
"bundleid":4,
"id":16
}
],
"name":"mysql",
"service_ports":[
3306
]
}
],
"rpool":"default",
"enable_hooklogs":true,
"bundle_object_id":"7be85809d7ecf1544e461df868f163ad",
"clonemode":"unfenced",
"auto_relocate":true,
"name":"lak",
"clone":"enabled",
"from_template":null,
"robin_version":"5.3.1-349",
"snapshot":"enabled",
"restart_num":15,
"namespace":"t001-u000003",
"planid":522,
"rpoolid":1,
"tenant":"Administrators",
"content_id":"7be85809d7ecf1544e461df868f163ad",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1595307896158\/1595307917814\/mysql-5.7",
"app_ns":"t001-u000003",
"bundleid":4,
"apphooks":{
"prestart":"bash app_sample prestart",
"validate":"python3.4 validate_template.py",
"health":"python3.4 health.py",
"postcreate":"bash app_sample postcreate",
"poststart":"bash app_sample poststart",
"allocated":{
"postdestroy":"bash app_sample postdestroy",
"prestart":"bash app_sample prestart",
"validate":"python3.4 validate_template.py",
"health":"python3.4 health.py",
"postcreate":"bash app_sample postcreate",
"poststart":"bash app_sample poststart",
"postrollback":"bash app_sample postrollback",
"postgrow":"bash app_sample postgrow",
"poststop":"bash app_sample poststop",
"pregrow":"bash app_sample pregrow",
"prerollback":"bash app_sample prerollback",
"preclone":"bash app_sample preclone",
"prestop":"bash app_sample prestop",
"precreate":"bash app_sample precreate",
"postsnapshot":"bash app_sample postsnapshot",
"postclone":"bash app_sample postclone",
"presnapshot":"bash app_sample presnapshot",
"predestroy":"bash app_sample predestroy"
},
"postrollback":"bash app_sample postrollback",
"postgrow":"bash app_sample postgrow",
"poststop":"bash app_sample poststop",
"pregrow":"bash app_sample pregrow",
"prerollback":"bash app_sample prerollback",
"preclone":"bash app_sample preclone",
"prestop":"bash app_sample prestop",
"precreate":"bash app_sample precreate",
"postsnapshot":"bash app_sample postsnapshot",
"presnapshot":"bash app_sample presnapshot",
"postclone":"bash app_sample postclone",
"postdestroy":"bash app_sample postdestroy",
"predestroy":"bash app_sample predestroy"
},
"enable_metrics":true,
"zoneid":1595331866,
"username":"robin",
"pvcpolicy":"create",
"id":43
}
},
"jobid":744
}
11.26. Configure Snapshot Space Limits for an Application¶
Use the following command to configure an application’s snapshot space limit:
# robin app snapshot-space-limit <app_name>
--role <role>
--volume-type <volume_type>
--snapshot-space-limit <snap_limit>
--role-values <rolestr>
--all
|
Application instance name |
|
Application Role Name (required if –all is not specified) |
|
Volume type within the role (required if –role is specified) |
|
Snapshot space limit in bytes for volumes of the given type or Snapshot space percentage for all volumes of the app |
|
Specify values for multiple roles and vtypes in app i.e. <role1>:<vtype1>:<snaplimit> <role2>:<vtype2>:<snaplimit> |
|
Configure snapshot space for all roles |
Example:
# robin app snapshot-space-limit mysql1 --all -l 3% --wait
Job: 227 Name: ApplicationSnapshotSpaceLimitUpdate State: VALIDATED Error: 0
Job: 227 Name: ApplicationSnapshotSpaceLimitUpdate State: COMPLETED Error: 0
Configures the snapshot space limit for an application.
End Point: /api/v3/robin_server/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: snapshot_limits
- This mandatory field within the payload specifies that the snapshot limits of an application are to be modified.limits: <list_of_dicts>
–role: <role_name>
- This mandatory field within each dictionary specifies the role of the volumes that need to be modified.snapshot_space_limit: <snapshot_limit>
- This mandatory field within each dictionary specifies the total snapshot space limit of each volume (in bytes) that meets the type and role provided.vol_type: <vol_type
- This mandatory field within each dictionary specifies the type of the volumes within the given role that need to be modified.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"current_user":{
"tenant_id":1,
"username":"robin",
"user_context":"robin",
"namespace":"t001-u000003",
"tenant_role":"superadmin",
"ip_addr":"172.17.0.1",
"user_permissions":{
},
"user_contexts":[
"robin"
],
"user_id":3,
"session_expires":"2020-09-09T00:09:15",
"tenant":"Administrators",
"tenants":[
"Administrators"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
]
},
"action":"snapshot_limits",
"appdata":{
"username":"robin",
"rpool":"default",
"content_id":"017a9be81a251ab7adae390a6249b7f5",
"namespace":"t001-u000003",
"auto_relocate":true,
"rpoolid":1,
"restart_num":15,
"bundleid":1,
"id":31,
"pvcpolicy":"create",
"enable_metrics":true,
"bundle_object_id":"017a9be81a251ab7adae390a6249b7f5",
"tenant":"Administrators",
"roles":[
{
"restart_on_qoscfg":true,
"qgroups":{
"data":{
"rd_max_iops":2000000,
"rd_weight":1,
"wr_weight":1,
"rd_min_window":500,
"wr_min_window":500,
"priority":1,
"enabled":false,
"wr_min_iops":0,
"wr_max_iops":2000000,
"rd_min_iops":0
},
"block":{
"rd_max_iops":2000000,
"rd_weight":1,
"wr_weight":1,
"rd_min_window":500,
"wr_min_window":500,
"priority":1,
"enabled":false,
"wr_min_iops":0,
"wr_max_iops":2000000,
"rd_min_iops":0
}
},
"display_name":"server",
"image":{
"engine":"docker",
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"registry_port":"",
"init_mode":false
},
"name":"server",
"vnodes":[
{
"allocated_host_type":"physical",
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/os":[
"linux"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"image":{
"engine":"docker",
"version":"7",
"registry_hostname":"",
"entrypoint":"entry.sh",
"name":"robinsys\/centos",
"registry_port":"",
"init_mode":false
},
"rpoolid":1,
"allocated_host_public_ip":"10.9.82.140",
"restart_num":15,
"bundleid":1,
"role_name":"server",
"utime":1599164742,
"id":31,
"cpu":{
"max":1,
"min":0,
"reserve":false
},
"env":{
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"allocated":{
"ROBINHOST":"cscale-82-140.robinsystems.com",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"POD_NAME":"lak-server-01",
"ROOT_PASSWORD":"",
"ROBINHOST_TAG_ROBINRPOOL":"default",
"K8S_NODE":"cscale-82-140",
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ENABLE_SSH":true,
"POD_NS":"t001-u000003"
},
"ENABLE_SSH":{
"type":"boolean",
"value":true
}
},
"ctime":1599164742,
"enable_hooklogs":true,
"pod_name":"lak-server-01",
"calico_inuse":true,
"appname":"lak",
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"service_uids":[
],
"engine":"docker",
"role":"server",
"name":"lak.server.01",
"allocated":{
"zonename":"default",
"nodeid":1,
"nodename":"cscale-82-140",
"zoneid":1598666199
},
"appid":31,
"root_fs":"\/usr\/local\/robin\/instances\/lak-server-01.t001-u000003.svc.cluster.local",
"vnodeid":31,
"mem":{
"hugepages_1g":0,
"size":209715200,
"hugepages_2m":0
},
"storage":[
{
"snapshot_space_limit":214748365,
"fstype":"ext4",
"vol_ns":"t001-u000003",
"compression":"disabled",
"snap_reserved":20,
"layout":"round-robin",
"media":"HDD",
"volgrp_name":"lak.server.01.72.1.79604a77-a02e-4293-9e4a-ff5a23bfb74c",
"pvcpolicy":"create",
"encryption":"none",
"replication":1,
"size":1073741824,
"k8s_name":"lak-server-01-data-1-be9e603f",
"disk_tags":{
},
"workload":0,
"protection":0,
"path":"\/data",
"lvm_vol_count":"0",
"stordriver":{
"faultdomain":"host",
"protection":0,
"media":"HDD",
"type":"das"
},
"faultdomain":"host",
"type":"data",
"lvm_type":"None",
"name":"lak.server.01.data.1.be9e603f-8c52-4472-9aa6-c8a9ada07ae3",
"allocated":{
"resource_poolid":1,
"snapshot_space_limit":214748365,
"compression":0,
"slice_size":1073741824,
"params":{
},
"partitions":0,
"genkey":1599164729997502,
"current_snapshotid":1,
"next_backupid":1,
"replication":1,
"size":1073741824,
"current_snapshot":"active_snap",
"grpid":64,
"priority":2,
"volumeid":"65",
"appname":"default",
"next_snapshotid":2,
"stordriver":{
"faultdomain":"host",
"protection":0,
"media":"HDD",
"type":"das"
},
"protection":0,
"media":72,
"vtype":0,
"multinode_mounting":false,
"qgroupid":64,
"name":"lak.server.01.data.1.be9e603f-8c52-4472-9aa6-c8a9ada07ae3",
"block_size":4096,
"appid":1
},
"blocksize":4096
},
{
"snapshot_space_limit":214748365,
"fstype":"raw",
"vol_ns":"t001-u000003",
"compression":"disabled",
"snap_reserved":20,
"layout":"round-robin",
"media":"HDD",
"volgrp_name":"lak.server.01.72.1.dfedd742-66bc-4b3c-b626-01c581d12cc5",
"pvcpolicy":"create",
"encryption":"none",
"replication":1,
"size":1073741824,
"k8s_name":"lak-server-01-block-1-52af20de",
"disk_tags":{
},
"workload":0,
"protection":0,
"path":"\/dev\/rda",
"lvm_vol_count":"0",
"stordriver":{
"faultdomain":"host",
"protection":0,
"media":"HDD",
"type":"das"
},
"faultdomain":"host",
"type":"block",
"lvm_type":"None",
"name":"lak.server.01.block.1.52af20de-9a7e-40f5-a9b0-65e191ea5564",
"allocated":{
"resource_poolid":1,
"snapshot_space_limit":214748365,
"compression":0,
"slice_size":1073741824,
"params":{
},
"partitions":0,
"genkey":1599164729992109,
"current_snapshotid":1,
"next_backupid":1,
"replication":1,
"size":1073741824,
"current_snapshot":"active_snap",
"grpid":65,
"priority":2,
"volumeid":"64",
"appname":"default",
"next_snapshotid":2,
"stordriver":{
"faultdomain":"host",
"protection":0,
"media":"HDD",
"type":"das"
},
"protection":0,
"media":72,
"vtype":0,
"multinode_mounting":false,
"qgroupid":65,
"name":"lak.server.01.block.1.52af20de-9a7e-40f5-a9b0-65e191ea5564",
"block_size":4096,
"appid":1
},
"blocksize":4096
}
],
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBZg2sAe0kUqoIEPV6dMQ99U\/9rSmZbF70M5s1Ys39cYPEkkWHMAnWHe6Vj1cDik+wSPV6qk4EiV7tTi+nwTQzbiJx67FcF29i1WLvVtc0xXSNo9zkJTHG4CONg79UoW8F6GnrHD+NJiQAdenQAcThnFGJoqaqn\/ohxcuTV3rnc+W84EAlCPVEa3mzvFzu0hXFDN6JrbcYBdG8BU2xrUGM3PaQZRGay6ZbpQSLlFY8XevAO4iTeMfkBRJxFGNEE0zFpVwwtVfNHsCAkfqmSt4kM68OdS4ZdHmjPsIjzyhWJPMnnqJ17vWGUHLEfMxvY2Nb5dCSR\/SAoHVXTtItGFYT root@cscale-82-140"
],
"hostname":"lak-server-01.t001-u000003.svc.cluster.local",
"allocated_host":"cscale-82-140.robinsystems.com",
"gpu":{
"max":0,
"min":0
},
"numa_allocations":{
"0":{
"hugepages_1g_used":0,
"non_isol_cores_used":1,
"isol_dedicated_cores_used":0,
"mem_used":209715200,
"hugepages_2m_used":0,
"isol_shared_cores_used":0,
"gpu_used":0
}
},
"vnodehookargs":{
"postcreate":[
]
},
"network":[
{
"ippool":"robin-default",
"name":"robin-default",
"driver":"calico",
"subnet":"172.21.0.0",
"allocated_ip":"172.21.26.106",
"allocated_netmask":"255.255.0.0",
"interfaces":1,
"allocated_by":"system",
"allocated_names":[
"eth0"
],
"allocated_prefix":16
}
],
"enable_metrics":true,
"k8s_provider":"robin",
"host_ip":"172.21.26.106",
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"restart_on_qoscfg":true,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1598641146105\/1598641180179\/centos-1.0",
"pod_ns":"t001-u000003",
"state":"STARTED",
"enable_portmapping":true,
"bundle_object_id":"017a9be81a251ab7adae390a6249b7f5",
"sidecar_info":{
"cpu":0,
"hugepages_2m":0,
"hugepages_1g":0,
"gpu":0,
"containers":[
],
"mem":0
},
"volume_groups":[
{
"layout":"round-robin",
"media":"HDD",
"stormgr_id":64,
"device_sets":[
{
"devices":[
{
"capacity":107374182400,
"max_throughput_intensive_vols_per_disk":1,
"slices":77,
"tags":{
},
"aslices":13,
"type":"HDD",
"stormgr_id":2,
"hostname":"cscale-82-140.robinsystems.com",
"psize":107374182400,
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"score":92,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"write_unit":4096,
"reattachable":0,
"allocated_slices":2,
"max_volumes_per_disk":10,
"state":"READY",
"role":"Storage",
"max_latency_sensitive_vols_per_disk":2,
"pused":301989888,
"host":"cscale-82-140.robinsystems.com"
}
],
"name":"lak.server.01.72.1.79604a77-a02e-4293-9e4a-ff5a23bfb74c.0.54e6a270-a851-432d-8af3-e4a5724fd7ed",
"stormgr_id":64
}
],
"volumes":[
"lak.server.01.data.1.be9e603f-8c52-4472-9aa6-c8a9ada07ae3"
],
"name":"lak.server.01.72.1.79604a77-a02e-4293-9e4a-ff5a23bfb74c",
"rpoolid":1,
"replicas":1
},
{
"layout":"round-robin",
"media":"HDD",
"stormgr_id":65,
"device_sets":[
{
"devices":[
{
"capacity":107374182400,
"max_throughput_intensive_vols_per_disk":1,
"slices":77,
"tags":{
},
"aslices":13,
"type":"HDD",
"stormgr_id":2,
"hostname":"cscale-82-140.robinsystems.com",
"psize":107374182400,
"protected":0,
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"score":92,
"wwn":"0x600224804c48fd7e16c608dea0919064",
"write_unit":4096,
"reattachable":0,
"allocated_slices":2,
"max_volumes_per_disk":10,
"state":"READY",
"role":"Storage",
"max_latency_sensitive_vols_per_disk":2,
"pused":301989888,
"host":"cscale-82-140.robinsystems.com"
}
],
"name":"lak.server.01.72.1.dfedd742-66bc-4b3c-b626-01c581d12cc5.0.57785519-2999-404f-a8c1-c46bf24eb2a2",
"stormgr_id":65
}
],
"volumes":[
"lak.server.01.block.1.52af20de-9a7e-40f5-a9b0-65e191ea5564"
],
"name":"lak.server.01.72.1.dfedd742-66bc-4b3c-b626-01c581d12cc5",
"rpoolid":1,
"replicas":1
}
]
}
],
"volume_groups":[
]
}
],
"clone":"enabled",
"enable_hooklogs":true,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1598641146105\/1598641180179\/centos-1.0",
"robin_version":"5.3.0-172",
"planid":33,
"zoneid":1598666199,
"app_ns":"t001-u000003",
"snapshot":"enabled",
"version":"7",
"name":"lak",
"from_template":null
},
"namespace":"t001-u000003",
"limits":[
{
"vol_type":"data",
"snapshot_space_limit":375809639,
"role":"server"
},
{
"vol_type":"block",
"snapshot_space_limit":375809639,
"role":"server"
}
],
"kind":"robin",
"name":"lak",
"opcode":null
},
"jobid":257
}
11.27. Adding a volume for a service within an application¶
In certain scenarios, users will need to attach an additional volume post application deployment for a service that whose data capcacity needs to be extended. This is commonly done for Oracle RAC where the database might need access to increased storage or the number of volumes accesible for a Hadoop data node might need to be increased. Robin provides a native way in which to do this without any downtime for the respective containers. In order to add a volume, issue the following command:
# robin app addvol <name> <role> <voltype> <size> <mntpath>
|
Application instance name |
|
Name of role to add volume to |
|
Type of additional volume. This must already be predefined within the application bundle. |
|
Size of additional volume |
|
Path on which the additional volume should be mounted |
Example:
# robin app addvol a1 mysql data 3G /var/lib/new --wait
Job: 363 Name: ApplicationAddVolume State: VALIDATED Error: 0
Job: 363 Name: ApplicationAddVolume State: WAITING Error: 0
Job: 363 Name: ApplicationAddVolume State: COMPLETED Error: 0
Attaches an an additional volume post application deployment for a service that whose data capcacity needs to be extended without causing any downtime for the respective containers.
End Point: /api/v3/robin_server/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: addvol
- This mandatory field within the payload specifies that the add volume operation is to be performed.name: <app_name>
- This mandatory field within the payload specifies the app to which the volume will be added.role: <role_name>
- This mandatory field within the payload specifies the role to which the volume needs to be added.volume: <dict_of_properties>
–path: <vol_path>
- This mandatory field within the dictionary specifies the path on which the additional volume should be mounted.size: <vol_size>
- This mandatory field within the dictionary specifies the size of the volume (in bytes) to be added.type: <vol_type
- This mandatory field within the dictionary specifies the type of the volume to be added.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan":{
"user_id":3,
"tenant_id":1,
"current_user":{
"tenant_id":1,
"username":"robin",
"user_context":"robin",
"namespace":"t001-u000003",
"tenant_role":"superadmin",
"ip_addr":"172.17.0.1",
"user_permissions":{
},
"user_contexts":[
"robin"
],
"user_id":3,
"session_expires":"2020-09-09T00:09:15",
"tenant":"Administrators",
"tenants":[
"Administrators"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
]
},
"action":"addvol",
"role":"server",
"namespace":"t001-u000003",
"volume":{
"snapshot_space_limit":1127428917,
"fstype":"ext4",
"vol_ns":"t001-u000003",
"compression":"disabled",
"snap_reserved":20,
"layout":"round-robin",
"media":"HDD",
"volgrp_name":"lak.server.01.72.1.79604a77-a02e-4293-9e4a-ff5a23bfb74c",
"pvcpolicy":"create",
"encryption":"none",
"replication":1,
"size":3221225472,
"k8s_name":"lak-server-01-data-1-be9e603f",
"disk_tags":{
},
"workload":0,
"protection":0,
"path":"\/var\/lib\/new",
"lvm_vol_count":"0",
"stordriver":{
"faultdomain":"host",
"protection":0,
"media":"HDD",
"type":"das"
},
"faultdomain":"host",
"type":"data",
"lvm_type":"None",
"name":"lak.server.01.data.1.be9e603f-8c52-4472-9aa6-c8a9ada07ae3",
"blocksize":4096
},
"name":"lak",
"kind":"robin",
"opcode":null
},
"jobid":258
}
11.28. Expanding a volume associated wih a service within an application¶
In certain scenarios, users will need to grow volumes post application deployment for a service whose data capcacity needs to be increased. This is commonly done when the storage usage for an application was underestimated during the initial configuration. Robin provides a native way in which to do this without a need to restart the application containers. In order to expand a volume, issue the following command:
# robin app expandvol <name> <role> <voltype> <size>
Note
Only the following filesystems are supported for automatic volume expansion wherein which the pod can start consuming the added space immediately: ext4
and xfs
(except for when it used as the root filesystem).
|
Application instance name |
|
Name of role to expand volume of |
|
Type of volume to expand. This must already be predefined within the application bundle. |
|
Size the volume should be expanded to |
Example:
# robin app expandvol demo server data 2G --wait
Job: 363 Name: ApplicationExpandVolume State: VALIDATED Error: 0
Job: 363 Name: ApplicationExpandVolume State: WAITING Error: 0
Job: 363 Name: ApplicationExpandVolume State: COMPLETED Error: 0
Expands volume(s) post application deployment for a service whose data capcacity needs to be increased without needing to restart the application containers.
End Point: /api/v3/robin_server/robin_server/apps/<appname>
Method: PUT
URL Parameters: None
Data Parameters:
action: expandvol
- This mandatory field within the payload specifies that the expand volume operation is to be performed.name: <app_name>
- This mandatory field within the payload specifies the app whose volume(s) will be expanded.roles: <list_of_dicts>
–role: <role_name>
- This mandatory field within the dictionary specifies the role whose volume(s) need to be expanded.volumes: <list_of_dict_with_properties>
–size: <vol_size>
- This mandatory field within the dictionary specifies the size (in bytes) to which the volume should be expanded to.type: <vol_type
- This mandatory field within the dictionary specifies the type of the volume to be expanded.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":2420,
"plan":{
"action":"expandvol",
"name":"demo",
"roles":[
{
"role_name":"server",
"volumes":[
{
"type":"data",
"size":2147483648
}
]
}
],
"namespace":"t001-u000003",
"kind":"robin",
"opcode":null,
"current_user":{
"user_id":3,
"username":"admin",
"tenant_id":1,
"tenant":"Administrators",
"tenants":[
"Administrators"
],
"tenant_role":"superadmin",
"namespace":"t001-u000003",
"user_context":"admin",
"user_contexts":[
"admin"
],
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"user_permissions":{
},
"ip_addr":"10.9.60.114",
"session_expires":"2021-08-02T06:22:17"
},
"tenant_id":1,
"user_id":3,
"appcfg":{
"name":"demo",
"version":"7",
"snapshot":"enabled",
"clone":"enabled",
"roles":[
{
"name":"server",
"multinode":true,
"image":{
"name":"robinsys\/centos",
"version":"7",
"engine":"docker",
"entrypoint":"entry.sh",
"init_mode":false,
"registry_hostname":"",
"registry_port":""
},
"display_name":"server",
"vnodes":[
{
"name":"demo.server.01",
"multinode":true,
"storage":[
{
"type":"data",
"media":"HDD",
"path":"\/data",
"size":1073741824,
"blocksize":4096,
"compression":"disabled",
"layout":"round-robin",
"name":"demo.server.01.data.1.2e5298c8-6802-424d-b90c-61e8646f3597",
"protection":0,
"replication":1,
"faultdomain":"host",
"encryption":"none",
"disk_tags":{
},
"lvm_type":"None",
"lvm_vol_count":"0",
"workload":0,
"snap_reserved":20,
"snapshot_space_limit":214748365,
"fstype":"ext4",
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"pvcpolicy":"create",
"k8s_name":"demo-server-01-data-1-2e5298c8",
"vol_ns":"t001-u000003",
"volgrp_name":"demo.server.01.72.1.23f36cc6-0c52-4772-b70a-e35ddc47469b",
"allocated":{
"protection":0,
"size":1073741824,
"name":"demo.server.01.data.1.2e5298c8-6802-424d-b90c-61e8646f3597",
"multinode_mounting":false,
"replication":1,
"snapshot_space_limit":214748365,
"compression":0,
"partitions":0,
"priority":2,
"vtype":0,
"media":72,
"qgroupid":177,
"resource_poolid":1,
"block_size":4096,
"next_backupid":1,
"grpid":186,
"next_snapshotid":2,
"appid":1,
"current_snapshot":"active_snap",
"appname":"default",
"slice_size":1073741824,
"volumeid":"187",
"params":{
},
"current_snapshotid":1,
"genkey":1627824605079817,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
}
},
"device_sets":[
[
{
"aslices":34,
"pused":7583301632,
"psize":107374182400,
"slices":77,
"write_unit":4096,
"stormgr_id":8,
"wwn":"0x600224804a0680e9eb923fd38f181063",
"capacity":107374182400,
"type":"HDD",
"state":"READY",
"host":"centos-60-114.robinsystems.com",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804a0680e9eb923fd38f181063",
"max_volumes_per_disk":40,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"tags":{
},
"hostname":"centos-60-114.robinsystems.com",
"score":78,
"allocated_slices":2
}
]
]
},
{
"type":"block",
"media":"HDD",
"path":"\/dev\/rda",
"size":1073741824,
"fstype":"raw",
"blocksize":4096,
"compression":"disabled",
"layout":"round-robin",
"name":"demo.server.01.block.1.ea82ab17-7e75-4b82-ac0f-68ae758aa4aa",
"protection":0,
"replication":1,
"faultdomain":"host",
"encryption":"none",
"disk_tags":{
},
"lvm_type":"None",
"lvm_vol_count":"0",
"workload":0,
"snap_reserved":20,
"snapshot_space_limit":214748365,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
},
"pvcpolicy":"create",
"k8s_name":"demo-server-01-block-1-ea82ab17",
"vol_ns":"t001-u000003",
"volgrp_name":"demo.server.01.72.1.badcd32a-0cc2-4aa2-a279-840792a75c7a",
"allocated":{
"protection":0,
"size":1073741824,
"name":"demo.server.01.block.1.ea82ab17-7e75-4b82-ac0f-68ae758aa4aa",
"multinode_mounting":false,
"replication":1,
"snapshot_space_limit":214748365,
"compression":0,
"partitions":0,
"priority":2,
"vtype":0,
"media":72,
"qgroupid":178,
"resource_poolid":1,
"block_size":4096,
"next_backupid":1,
"grpid":187,
"next_snapshotid":2,
"appid":1,
"current_snapshot":"active_snap",
"appname":"default",
"slice_size":1073741824,
"volumeid":"186",
"params":{
},
"current_snapshotid":1,
"genkey":1627824605075415,
"stordriver":{
"media":"HDD",
"protection":0,
"faultdomain":"host",
"type":"das"
}
},
"device_sets":[
[
{
"aslices":34,
"pused":7583301632,
"psize":107374182400,
"slices":77,
"write_unit":4096,
"stormgr_id":8,
"wwn":"0x600224804a0680e9eb923fd38f181063",
"capacity":107374182400,
"type":"HDD",
"state":"READY",
"host":"centos-60-114.robinsystems.com",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804a0680e9eb923fd38f181063",
"max_volumes_per_disk":40,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"tags":{
},
"hostname":"centos-60-114.robinsystems.com",
"score":78,
"allocated_slices":2
}
]
]
}
],
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"cpu":{
"reserve":false,
"min":0,
"max":1
},
"gpu":{
"min":0,
"max":0
},
"mem":{
"size":209715200,
"hugepages_2m":0,
"hugepages_1g":0
},
"env":{
"ENABLE_SSH":{
"type":"boolean",
"value":true
},
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"allocated":{
"ENABLE_SSH":true,
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ROOT_PASSWORD":"",
"ROBINHOST":"centos-60-114.robinsystems.com",
"K8S_NODE":"centos-60-114",
"POD_NAME":"demo-server-01",
"POD_NS":"t001-u000003",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST_TAG_NODE-ROLE.KUBERNETES.IO-CONTROL-PLANE":"",
"ROBINHOST_TAG_ROBINRPOOL":"default"
}
},
"network":[
{
"ippool":"robin-default",
"name":"robin-default",
"driver":"calico",
"interfaces":1,
"allocated_ip":"172.21.30.109",
"allocated_netmask":"255.255.0.0",
"allocated_prefix":16,
"subnet":"172.21.0.0",
"allocated_by":"system",
"allocated_names":[
"eth0"
]
}
],
"enable_portmapping":true,
"enable_hooklogs":true,
"enable_metrics":true,
"sidecar_info":{
"cpu":0,
"mem":0,
"gpu":0,
"hugepages_2m":0,
"hugepages_1g":0,
"containers":[
]
},
"role_name":"server",
"rpoolid":1,
"calico_inuse":true,
"restart_on_qoscfg":true,
"allocated":{
"zoneid":1626105129,
"zonename":"default",
"nodeid":1,
"nodename":"centos-60-114",
"k8s_nodename":"centos-60-114"
},
"allocated_host":"centos-60-114.robinsystems.com",
"v6_enabled_host":true,
"k8s_provider":"robin",
"allocated_host_type":"physical",
"numa_allocations":{
"0":{
"guaranteed_cores_used":0,
"mem_used":209715200,
"hugepages_1g_used":0,
"hugepages_2m_used":0,
"gpu_used":0
}
},
"allocated_host_public_hostname":"centos-60-114.robinsystems.com",
"allocated_host_public_ip":"10.9.60.114",
"hosttags":{
"kubernetes.io\/os":[
"linux"
],
"kubernetes.io\/arch":[
"amd64"
],
"node-role.kubernetes.io\/control-plane":[
""
],
"robin.io\/robinrpool":[
"default"
]
},
"volume_groups":[
{
"media":"HDD",
"rpoolid":1,
"volumes":[
"demo.server.01.data.1.2e5298c8-6802-424d-b90c-61e8646f3597"
],
"layout":"round-robin",
"device_sets":[
{
"devices":[
{
"aslices":34,
"pused":7583301632,
"psize":107374182400,
"slices":77,
"write_unit":4096,
"stormgr_id":8,
"wwn":"0x600224804a0680e9eb923fd38f181063",
"capacity":107374182400,
"type":"HDD",
"state":"READY",
"host":"centos-60-114.robinsystems.com",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804a0680e9eb923fd38f181063",
"max_volumes_per_disk":40,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"tags":{
},
"hostname":"centos-60-114.robinsystems.com",
"score":78,
"allocated_slices":2
}
],
"name":"demo.server.01.72.1.23f36cc6-0c52-4772-b70a-e35ddc47469b.0.f373692c-6fd9-4391-a170-4bf165216608",
"stormgr_id":190
}
],
"replicas":1,
"name":"demo.server.01.72.1.23f36cc6-0c52-4772-b70a-e35ddc47469b",
"stormgr_id":186
},
{
"media":"HDD",
"rpoolid":1,
"volumes":[
"demo.server.01.block.1.ea82ab17-7e75-4b82-ac0f-68ae758aa4aa"
],
"layout":"round-robin",
"device_sets":[
{
"devices":[
{
"aslices":34,
"pused":7583301632,
"psize":107374182400,
"slices":77,
"write_unit":4096,
"stormgr_id":8,
"wwn":"0x600224804a0680e9eb923fd38f181063",
"capacity":107374182400,
"type":"HDD",
"state":"READY",
"host":"centos-60-114.robinsystems.com",
"reattachable":0,
"protected":0,
"role":"Storage",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804a0680e9eb923fd38f181063",
"max_volumes_per_disk":40,
"max_latency_sensitive_vols_per_disk":2,
"max_throughput_intensive_vols_per_disk":1,
"tags":{
},
"hostname":"centos-60-114.robinsystems.com",
"score":78,
"allocated_slices":2
}
],
"name":"demo.server.01.72.1.badcd32a-0cc2-4aa2-a279-840792a75c7a.0.2b039006-23c1-4aaa-8677-935f3bd1ae76",
"stormgr_id":191
}
],
"replicas":1,
"name":"demo.server.01.72.1.badcd32a-0cc2-4aa2-a279-840792a75c7a",
"stormgr_id":187
}
],
"pod_name":"demo-server-01",
"pod_ns":"t001-u000003",
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"host_ip":"172.21.30.109",
"vnodehookargs":{
"postcreate":[
]
},
"id":4,
"service_uids":[
],
"restart_num":15,
"role":"server",
"appname":"demo",
"appid":225,
"state":"STARTED",
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1627824308434\/1627824323155\/centos-7",
"bundle_object_id":"365b16ada386af586aa056b5437a0800",
"bundleid":200,
"engine":"docker",
"image":{
"name":"robinsys\/centos",
"version":"7",
"engine":"docker",
"entrypoint":"entry.sh",
"init_mode":false,
"registry_hostname":"",
"registry_port":""
},
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrpL7LACGVVe8twg86GgzGffgNFb7RPfDwcmzjwngwaZ09crgUCOVzoVU+EafD461tMLqudTTimvP4L98KarqybQQxKCPcB\/dbPlyffYbIzj7HXtHW8jx2Vd5YxPuAqweOCR4+E9sjm1iESD94jLEra8KacC5R2kZECXoWfStIkG6bir7UzzZpx1fbH9AGGeS0\/CEYtcMw13Ppq+yVxZYb5YQccPz7GrcnhFlkHaBGFg+aeZuwgKgpYIqXB3jNHm5iSPKxObRefw7KBrGL73xGC\/NE8WiQEj1SvE9MuTcg2kQ2H1PQ4yYpHVNPr1ZSRwMe10JEXLDpfXP0Lc0HQx6T root@centos-60-114",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD30E\/WTROqBdswhUdI1DJd7K1f8Pd54USlzj\/sS0sJcRAdyNUyf61pY\/bv57DXafJKQmb2zVH8TBg4L8k2yHIO\/j2BTH\/yIA7J1MuDT5D4k+vYn1konJfeSyZCBUhipdMKjR0WOBVJe11fRWaDl7Ovx82Aox8XD4OmlCJ4eqCXj1avKWfE000NiT8SYzBscneKPLA67Wemqxr5xWWmoE+wisbztmfwEfhE0EAfMrKDnsLqjs4yGT\/R2bGh0WHqc+lre9+6lMDEB\/NcdpRElvFFSHZMYmsKUic1QYbfatvqldZ1u9kv3TGUEmZ8n8aiNzIHKkkZay0Pd+ppNTkjFFex root@centos-60-116",
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXu8F9941aqw\/i5Fkyu7asayMaYZ+go2PXh+wwbskT0VSogOR9yKL\/i9p85kMn6PLZ196fqpjyzpqN3WI7LtIOyDGO\/wM9N2uU21jCE+PEM5E7\/+1lcdUcUyr3IHRpX45tmeB+916X1AIvMW4qe9BPq5pDFSjPstAJFVZ5CwQhDpnysrk6k\/gpsYzMSXyWT54V4gbe7I\/K9qufqfqpDMov8bPbrknknPqbdYTROAdLFiKYKzHSYRsfmRkF7+WqRQGtjL+GKtVciPtcu51C3tvQl2cUqNGEpyE7p5DSiEzuFbro2n4sFJp1EdTIcYMWx6iD5GlZGPnfx1m3Xhq0l0al root@centos-60-115"
],
"ctime":1627824628,
"utime":1627824628,
"vnodeid":4
}
],
"qgroups":{
"data":{
"enabled":false,
"priority":1,
"rd_max_iops":2000000,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"wr_min_iops":0,
"wr_min_window":500,
"wr_weight":1
},
"block":{
"enabled":false,
"priority":1,
"rd_max_iops":2000000,
"rd_min_iops":0,
"rd_min_window":500,
"rd_weight":1,
"wr_max_iops":2000000,
"wr_min_iops":0,
"wr_min_window":500,
"wr_weight":1
}
},
"restart_on_qoscfg":true,
"volume_groups":[
]
}
],
"robin_version":"5.3.5-159",
"pvcpolicy":"create",
"rpool":"default",
"from_template":null,
"zoneid":1626105129,
"bundleid":200,
"content_id":"365b16ada386af586aa056b5437a0800",
"namespace":"t001-u000003",
"restart_num":15,
"auto_relocate":true,
"rpoolid":1,
"username":"admin",
"tenant":"Administrators",
"app_ns":"t001-u000003",
"enable_hooklogs":true,
"enable_metrics":true,
"planid":53,
"id":225,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1627824308434\/1627824323155\/centos-7",
"bundle_object_id":"365b16ada386af586aa056b5437a0800"
}
}
}
11.29. Managing Application Vnodes¶
Within Robin, an application is defined to consist of vnodes
. A Vnode is a Robin-specific construct that is used to refer to a Pod
in the native Kubernetes world in the majority of cases. The existence of this construct allows users to have more granular control of their
applications as it enables them to manipulate the essential building blocks of their workload. Some of the life-cycle operations that can
be performed at the Vnode level including restarting a Vnode (which translates to destroying and recreating a pod without losing any data
stored within) and relocating a vnode to another host (which translates to moving a pod from one Kubernetes node to another).
In addition to the operations described above, the following commands are described in this section:
|
View all Vnodes |
|
Retrieve information about a particular Vnode |
|
Stop a particular Vnode |
|
Start a particular Vnode |
|
Stop and then start a particular Vnode |
|
Move a Vnode to another host |
|
Repair the storage of a particular Vnode |
Note
The terms vnode
and instance
are interchangeable and refer to the same underlying construct.
11.29.1. Listing all Vnodes¶
In order to view all Vnodes currently part of Robin applications alongside details such as their status, the host on which they reside and the compute resources allocated to them, issue the following command:
# robin instance list --host <hostname>
--app <app_name>
--all
--json
|
Filter results based on hosts on which instances are located |
|
Filter results based on applications instances are part of |
|
Display deleted instances alongside current instances |
|
Output in JSON format |
Example:
# robin instance list
ID | Owner/Tenant | ResPool | Container | Hostname | IP Addresses | Status | Autopilot | LastOpr | Host | Engine | Cores | GPUs | Mem (GB) | Ctime
---+----------------------+---------+----------------------+-----------------------------------------------------+------------------+--------+-----------+---------+---------------+--------+-------+------+----------+----------------------
6 | robin/Administrators | default | new-app.server.01 | new-app-server-01.t001-u000003.svc.cluster.local | 172.21.31.14/16 | ONLINE | Enabled | STARTED | cscale-82-140 | docker | 1 | 0 | 0.2 | 10 Aug 2020 23:21:59
7 | robin/Administrators | default | new-app-2.server.01 | new-app-2-server-01.t001-u000003.svc.cluster.local | 172.21.22.121/16 | ONLINE | Enabled | STARTED | cscale-82-140 | docker | 1 | 0 | 0.2 | 10 Aug 2020 23:30:52
8 | robin/Administrators | default | new-app-10.server.01 | new-app-10-server-01.t001-u000003.svc.cluster.local | 172.21.25.97/16 | ONLINE | Enabled | STARTED | cscale-82-140 | docker | 1 | 0 | 0.2 | 10 Aug 2020 23:35:23
9 | robin/Administrators | default | demo.server.01 | demo-server-01.t001-u000003.svc.cluster.local | 172.21.23.80/16 | ONLINE | Enabled | STARTED | cscale-82-140 | docker | 1 | 0 | 0.2 | 11 Aug 2020 21:50:03
Returns all Vnodes currently part of Robin applications alongside details such as their status, the host on which they reside and the compute resources allocated to them.
End Point: /api/v5/robin_server/instances
Method: GET
URL Parameters:
appname=<appname>
: Utilizing this parameter results in only instances that are part of the specified application being returned.host=<hostname>
: Utilizing this parameter results in only instances residing on the specified host being returned.deleted=true
: Utilizing this parameter results in deleted instances being returned alongside any existing instances.
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error)
Example Response:
Output
{
"users":[
{
"username":"robin",
"lastname":"Systems",
"email":null,
"id":3,
"tenantid":1,
"firstname":"Robin"
}
],
"instances":[
{
"gpu_cores":0,
"rpool":"default",
"cpu_cores":1,
"hugepages_2m":0,
"tenant_ref":1,
"hugepages_1g":0,
"memory":209715200,
"engine":"docker",
"hostname":"new-app-server-01.t001-u000003.svc.cluster.local",
"appcluster_id":6,
"host":"cscale-82-140.robinsystems.com",
"uptime":1597126919,
"user_ref":3,
"state":"STARTED",
"id":6,
"name":"new-app.server.01",
"ctime":1597126919,
"status":"ONLINE",
"autopilot":true
},
{
"gpu_cores":0,
"rpool":"default",
"cpu_cores":1,
"hugepages_2m":0,
"tenant_ref":1,
"hugepages_1g":0,
"memory":209715200,
"engine":"docker",
"hostname":"new-app-2-server-01.t001-u000003.svc.cluster.local",
"appcluster_id":7,
"host":"cscale-82-140.robinsystems.com",
"uptime":1597127452,
"user_ref":3,
"state":"STARTED",
"id":7,
"name":"new-app-2.server.01",
"ctime":1597127452,
"status":"ONLINE",
"autopilot":true
},
{
"gpu_cores":0,
"rpool":"default",
"cpu_cores":1,
"hugepages_2m":0,
"tenant_ref":1,
"hugepages_1g":0,
"memory":209715200,
"engine":"docker",
"hostname":"new-app-10-server-01.t001-u000003.svc.cluster.local",
"appcluster_id":8,
"host":"cscale-82-140.robinsystems.com",
"uptime":1597127723,
"user_ref":3,
"state":"STARTED",
"id":8,
"name":"new-app-10.server.01",
"ctime":1597127723,
"status":"ONLINE",
"autopilot":true
},
{
"gpu_cores":0,
"rpool":"default",
"cpu_cores":1,
"hugepages_2m":0,
"tenant_ref":1,
"hugepages_1g":0,
"memory":209715200,
"engine":"docker",
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"appcluster_id":9,
"host":"cscale-82-140.robinsystems.com",
"uptime":1597208647,
"user_ref":3,
"state":"STARTED",
"id":9,
"name":"demo.server.01",
"ctime":1597207803,
"status":"ONLINE",
"autopilot":true
}
],
"ipaddresses":{
"8":[
"172.21.25.97\/16"
],
"9":[
"172.21.23.80\/16"
],
"6":[
"172.21.31.14\/16"
],
"7":[
"172.21.22.121\/16"
]
},
"tenants":[
{
"id":1,
"name":"Administrators"
}
]
}
11.29.2. Show information about a specific Vnode¶
In order to view details about a particular Vnode including information about the compute, storage and networking components of the pod alongside any events concerning it, issue the following command:
# robin instance info <name>
--hooks
--env
--events
--json
|
Name of application instance |
|
Display information about the Vnode’s hook scripts |
|
Display information about the Vnode’s environment variables |
|
Display information about events relating to this Vnode |
|
Output in JSON format |
Example:
# robin instance info demo.server.01
Status:
Name : demo.server.01
Application : demo
Resource Pool : default
Created Time : 11 Aug 2020 21:50:03
State : STARTED
Autopilot : Enabled
Status : ONLINE (Desired: ONLINE)
Physical Host:
Hostname : cscale-82-140.robinsystems.com
Host State : ONLINE
Host Status : 1
Host Compute State : ONLINE
Host Compute Status : READY
Host robin-agent : RUNNING
Host monitor-server : RUNNING
Host iomgr-server : RUNNING
Network:
Hostname : demo-server-01.t001-u000003.svc.cluster.local
IP Address : 172.21.23.80/16
Compute:
Engine : docker
Max_cores : 1
Max_memory : 0.2G
Hugepages-2Mi : -
Hugepages-1Gi : -
Storage : (HDD: 2G, SSD: -)
Id:18 demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6 : HDD 1G (ONLINE)
Id:19 demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc : HDD 1G (ONLINE)
Bundle:
Bundle Id : 1
Bundle Name : centos
Bundle Version : 1.0
Bundle ObjectId : 1597122985597
Bundle Hooks Path : cscale-82-140.robinsystems.com:/var/lib/robin/file_object_cache/centos-1.0/scripts
Events:
RestartPolicy:
restart_limit : 15
restart_left : 15
burst_interval : 600 seconds
burst_count : N/A
Returns details about a particular Vnode including information about the compute, storage and networking components of the pod alongside its current status.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: GET
URL Parameters: None
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error)
Example Response:
Output
{
"state":"Succeed",
"message":"NA",
"items":{
"utime":1597208647,
"rpool":"default",
"memory":209715200,
"capacity":{
"threshold":85,
"unit":"Bytes",
"total":0,
"used":0
},
"physical_host":{
"state":"ONLINE",
"compute_status":"READY",
"compute_services":[
[
"robin-agent",
true
],
[
"monitor-server",
true
],
[
"iomgr-server",
true
]
],
"public_hostname":"cscale-82-140.robinsystems.com",
"status":1,
"public_ip":"10.9.82.140",
"compute_state":"ONLINE",
"hostname":"cscale-82-140.robinsystems.com"
},
"autopilot":true,
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"hugepages_1g":0,
"engine":"docker",
"user":"robin",
"config":{
"utime":1597207803,
"vnodehookargs":{
"postcreate":[
]
},
"root_fs":"\/usr\/local\/robin\/instances\/demo-server-01.t001-u000003.svc.cluster.local",
"enable_metrics":true,
"state":"STARTED",
"ctime":1597207803,
"env":{
"DOCKER_OPTS":{
"type":"text",
"value":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN"
},
"ENABLE_SSH":{
"type":"boolean",
"value":true
},
"ROOT_PASSWORD":{
"type":"password",
"value":""
},
"allocated":{
"DOCKER_OPTS":"-v \/sys\/fs\/cgroup:\/sys\/fs\/cgroup --cap-add=SYS_ADMIN",
"ENABLE_SSH":true,
"ROOT_PASSWORD":"",
"POD_NS":"t001-u000003",
"ROBINHOST_TAG_KUBERNETES.IO-OS":"linux",
"ROBINHOST_TAG_KUBERNETES.IO-ARCH":"amd64",
"ROBINHOST":"cscale-82-140.robinsystems.com",
"POD_NAME":"demo-server-01",
"K8S_NODE":"cscale-82-140",
"ROBINHOST_TAG_ROBINRPOOL":"default"
}
},
"allocated_host_type":"physical",
"hosttags":{
"robin.io\/robinrpool":[
"default"
],
"kubernetes.io\/os":[
"linux"
],
"kubernetes.io\/arch":[
"amd64"
]
},
"appname":"demo",
"restart_num":15,
"host_ip":"172.21.23.80",
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"image":{
"name":"robinsys\/centos",
"init_mode":false,
"registry_port":"",
"entrypoint":"entry.sh",
"engine":"docker",
"registry_hostname":"",
"version":"7"
},
"storage":[
{
"fstype":"ext4",
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"k8s_name":"demo-server-01-data-1-424679e5",
"volgrp_name":"demo.server.01.72.1.4567d4ef-ce18-4cec-87b6-d4f204e14eab",
"path":"\/data",
"allocated":{
"block_size":4096,
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"volumeid":"18",
"partitions":0,
"multinode_mounting":false,
"vtype":0,
"size":1073741824,
"genkey":1597207790284383,
"snapshot_space_limit":214748365,
"protection":0,
"name":"demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6",
"compression":0,
"appname":"default",
"grpid":18,
"priority":2,
"params":{
},
"appid":1,
"media":72,
"replication":1,
"next_snapshotid":2,
"slice_size":1073741824,
"current_snapshotid":1,
"current_snapshot":"active_snap",
"qgroupid":18,
"resource_poolid":1,
"next_backupid":1
},
"lvm_type":"None",
"snap_reserved":20,
"encryption":"none",
"lvm_vol_count":"0",
"device":"\/dev\/sdk",
"blocksize":4096,
"pvcpolicy":"create",
"size":1073741824,
"snapshot_space_limit":214748365,
"name":"demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6",
"vol_ns":"t001-u000003",
"workload":0,
"layout":"round-robin",
"protection":0,
"faultdomain":"host",
"type":"data",
"media":"HDD",
"replication":1,
"disk_tags":{
},
"compression":"disabled"
},
{
"fstype":"raw",
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"k8s_name":"demo-server-01-block-1-1d69df39",
"volgrp_name":"demo.server.01.72.1.8433e073-8691-4467-afdb-49f61be817b3",
"path":"\/dev\/rda",
"allocated":{
"block_size":4096,
"stordriver":{
"faultdomain":"host",
"protection":0,
"type":"das",
"media":"HDD"
},
"volumeid":"19",
"partitions":0,
"multinode_mounting":false,
"vtype":0,
"size":1073741824,
"genkey":1597207790379086,
"snapshot_space_limit":214748365,
"protection":0,
"name":"demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc",
"compression":0,
"appname":"default",
"grpid":19,
"priority":2,
"params":{
},
"appid":1,
"media":72,
"replication":1,
"next_snapshotid":2,
"slice_size":1073741824,
"current_snapshotid":1,
"current_snapshot":"active_snap",
"qgroupid":19,
"resource_poolid":1,
"next_backupid":1
},
"lvm_type":"None",
"snap_reserved":20,
"encryption":"none",
"lvm_vol_count":"0",
"device":"\/dev\/sdl",
"blocksize":4096,
"pvcpolicy":"create",
"size":1073741824,
"snapshot_space_limit":214748365,
"name":"demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc",
"vol_ns":"t001-u000003",
"workload":0,
"layout":"round-robin",
"protection":0,
"faultdomain":"host",
"type":"block",
"media":"HDD",
"replication":1,
"disk_tags":{
},
"compression":"disabled"
}
],
"rpoolid":1,
"allocated_host_public_hostname":"cscale-82-140.robinsystems.com",
"pod_ns":"t001-u000003",
"jobid":90,
"bundle_path":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"network":[
{
"name":"robin-default",
"allocated_ip":"172.21.23.80",
"interfaces":1,
"allocated_netmask":"255.255.0.0",
"ippool":"robin-default",
"allocated_names":[
"eth0"
],
"allocated_by":"system",
"driver":"calico",
"allocated_prefix":16,
"subnet":"172.21.0.0"
}
],
"bundleid":1,
"sidecar_info":{
"containers":[
],
"mem":0,
"gpu":0,
"cpu":0,
"hugepages_1g":0,
"hugepages_2m":0
},
"volume_groups":[
{
"device_sets":[
{
"name":"demo.server.01.72.1.4567d4ef-ce18-4cec-87b6-d4f204e14eab.0.717a6eb8-97a6-46b3-b097-9f9532a95762",
"devices":[
{
"max_volumes_per_disk":10,
"tags":{
},
"capacity":107374182400,
"score":90,
"aslices":17,
"slices":77,
"reattachable":0,
"allocated_slices":2,
"state":"READY",
"type":"HDD",
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"psize":107374182400,
"stormgr_id":2,
"max_latency_sensitive_vols_per_disk":2,
"hostname":"cscale-82-140.robinsystems.com",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"write_unit":4096,
"pused":369098752,
"protected":0,
"max_throughput_intensive_vols_per_disk":1
}
],
"stormgr_id":18
}
],
"name":"demo.server.01.72.1.4567d4ef-ce18-4cec-87b6-d4f204e14eab",
"rpoolid":1,
"stormgr_id":18,
"replicas":1,
"volumes":[
"demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6"
],
"layout":"round-robin",
"media":"HDD"
},
{
"device_sets":[
{
"name":"demo.server.01.72.1.8433e073-8691-4467-afdb-49f61be817b3.0.9c6285de-48e8-40fc-83c3-1f1e98b86fc1",
"devices":[
{
"max_volumes_per_disk":10,
"tags":{
},
"capacity":107374182400,
"score":90,
"aslices":17,
"slices":77,
"reattachable":0,
"allocated_slices":2,
"state":"READY",
"type":"HDD",
"host":"cscale-82-140.robinsystems.com",
"role":"Storage",
"psize":107374182400,
"stormgr_id":2,
"max_latency_sensitive_vols_per_disk":2,
"hostname":"cscale-82-140.robinsystems.com",
"wwn":"0x600224804c48fd7e16c608dea0919064",
"devpath":"\/dev\/disk\/by-id\/scsi-3600224804c48fd7e16c608dea0919064",
"write_unit":4096,
"pused":369098752,
"protected":0,
"max_throughput_intensive_vols_per_disk":1
}
],
"stormgr_id":19
}
],
"name":"demo.server.01.72.1.8433e073-8691-4467-afdb-49f61be817b3",
"rpoolid":1,
"stormgr_id":19,
"replicas":1,
"volumes":[
"demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc"
],
"layout":"round-robin",
"media":"HDD"
}
],
"bundle_object_id":"a360b352c8c800e7f1af4075bb3320a4",
"allocated_host_public_ip":"10.9.82.140",
"engine":"docker",
"allocated":{
"zoneid":1597147518,
"zonename":"default",
"nodename":"cscale-82-140",
"nodeid":1
},
"vnodehooks":{
"postcreate":"bash postcreate.sh"
},
"numa_allocations":{
"0":{
"isol_dedicated_cores_used":0,
"non_isol_cores_used":1,
"hugepages_1g_used":0,
"gpu_used":0,
"isol_shared_cores_used":0,
"mem_used":209715200,
"hugepages_2m_used":0
}
},
"gpu":{
"min":0,
"max":0
},
"cpu":{
"min":0,
"max":1,
"reserve":false
},
"role":"server",
"service_uids":[
],
"k8s_provider":"robin",
"desired_status":"ONLINE",
"allocated_host":"cscale-82-140.robinsystems.com",
"name":"demo.server.01",
"enable_hooklogs":true,
"id":9,
"appid":9,
"cm_keys":[
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDN8WYsAfs0+a1zzAIWIVV5MrZUaur688E08BL7fm+1uBFjBRPEevwrYrNFL7ebjJxYuB1R3WR+IX8Mmz7CiMDvfEiAQL1Ihj4GZ32WSqzZ7MN15UJK4DQWY7sU++VIusyPUj5goVS2mPj0k4zhheNOlC8XaaHgyUq+NjHHDZF5B4mX7huWfM+kC4u5nCvajoHdfeOse4e1n5RlXtlKRqzBbIma6w8Ej32qFxRLvp4lUXzCylYHBLGH42CKWvtxvETwJUb1kIW9DExSnD+u5fd4Dc2D98\/SY79OO4+aa7GA7JV7412S5kWbtq5cpnkDlvhon\/XzLVQlIqIiAJ6ukVmx root@cscale-82-140"
],
"enable_portmapping":true,
"pod_name":"demo-server-01",
"role_name":"server",
"mem":{
"hugepages_1g":0,
"size":209715200,
"hugepages_2m":0
},
"calico_inuse":true,
"restart_on_qoscfg":true,
"vnodeid":9
},
"tenant":"Administrators",
"state":"STARTED",
"cpu_cores":1,
"ctime":1597207803,
"events":[
],
"role":"server",
"bundle":{
"name":"centos",
"tenants":[
"Administrators"
],
"create_time":"August 10, 2020 22:16:25",
"file_object_id":1597122985597,
"parent":"",
"pathname":"\/usr\/local\/robin\/collections\/file-collection-1597122699552\/1597122985597\/centos-1.0",
"share_with_all_tenants":false,
"ntemplates":1,
"type":"ROBIN",
"user":"robin",
"version":"1.0",
"zoneid":1597147518,
"napps":1,
"description":"-",
"groupid":1,
"collection_id":1597122699552,
"nchildren":1,
"content_id":"a360b352c8c800e7f1af4075bb3320a4",
"tenant":"Administrators",
"bundleid":1
},
"desired_status":"ONLINE",
"name":"demo.server.01",
"image_format":"UNKNOWN",
"volumes":[
{
"name":"demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc",
"id":"19",
"size":1073741824,
"media":"HDD",
"state":"ONLINE"
},
{
"name":"demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6",
"id":"18",
"size":1073741824,
"media":"HDD",
"state":"ONLINE"
}
],
"ip_addresses":[
"172.21.23.80\/16"
],
"service_ports":null,
"status":"ONLINE",
"id":9,
"hostname":"demo-server-01.t001-u000003.svc.cluster.local",
"gpu_cores":0,
"image":{
"name":"",
"file":"",
"version":""
},
"hugepages_2m":0,
"storage":[
{
"name":"demo.server.01.block.1.1d69df39-84a2-462a-806d-71df0a3aa7cc",
"id":"19",
"size":1073741824,
"media":"HDD",
"state":"ONLINE"
},
{
"name":"demo.server.01.data.1.424679e5-6aa3-466f-a4a9-8a40b70f3ff6",
"id":"18",
"size":1073741824,
"media":"HDD",
"state":"ONLINE"
}
],
"network_bandwidth":null,
"public_ips":[
],
"vnc_port":null,
"restartpolicy":{
"burst_interval":600,
"burst_count":0,
"id":16,
"burst_start_time":0,
"restarts_done":0,
"restart_limit":15
},
"app":"demo",
"distribution":{
"name":"",
"version":""
}
}
}
11.29.3. Stop a Vnode¶
In certain situations, particular Vnodes need to be stopped as they might be in an error state and thus need to be debugged or the resources consumed by it might need to be temporarily released. In order to perform this operation, issue the following command:
# robin instance stop <name>
--force
|
Name of application instance |
|
Ungracefully stop the Vnode without running the respective hook scripts |
Example:
# robin instance stop demo.server.01 --wait
Job: 88 Name: VnodeStop State: PROCESSED Error: 0
Job: 88 Name: VnodeStop State: AGENT_WAIT Error: 0
Job: 88 Name: VnodeStop State: COMPLETED Error: 0
Stops a Vnode in order to help debug error states or to surrender resources consumed by it as they might need to be temporarily released.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: stop
- This mandatory field within the payload specifies that the stop operation is to be performed.force: true
- Utilizing this parameter results in the Vnode being stopped ungracefully without the respective hook scripts being run.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":93
}
11.29.4. Start a Vnode¶
In order to start a Vnode that was previously stopped, issue the following command:
# robin instance start <name>
--host <hostname>
|
Name of application instance |
|
Primary hostname of node on which to start the Vnode on |
Example:
# robin instance start demo.server.01 --wait
Job: 89 Name: VnodeDeploy State: PROCESSED Error: 0
Job: 89 Name: VnodeDeploy State: AGENT_WAIT Error: 0
Job: 89 Name: VnodeDeploy State: COMPLETED Error: 0
Starts a Vnode that was previously stopped.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: start
- This mandatory field within the payload specifies that the start operation is to be performed.desired_host: <hostname>
- Utilizing this parameter, by specifying the primary hostname of a node in the cluster, results in the Vnode being started on the aforementioned host.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":95
}
11.29.5. Restart a Vnode¶
In certain situations, particular Vnodes might need to be restarted in order to solve any errors (such as configuration issues, or entrypoint failures) and allow the Pod to be deployed successfully. In order to perform this operation, issue the following command:
# robin instance restart <name>
--entrypoint <entrypoint>
--host <hostname>
|
Name of application instance |
|
Custom entrypoint command to run in order to help debugging |
|
Primary hostname of node on which to start the Vnode on |
Example:
# robin instance restart demo.server.01 --wait
Job: 90 Name: VnodeDeploy State: PROCESSED Error: 0
Job: 90 Name: VnodeDeploy State: WAITING Error: 0
Job: 90 Name: VnodeDeploy State: AGENT_WAIT Error: 0
Job: 90 Name: VnodeDeploy State: FINALIZED Error: 0
Job: 90 Name: VnodeDeploy State: COMPLETED Error: 0
Restarts Vnodes in order to solve any errors (such as configuration issues, or entrypoint failures) and allow the Pod to be deployed successfully.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: restart
- This mandatory field within the payload specifies that the restart operation is to be performed.entrypoint: <custom_entrypoint>
- Utilizing this parameter, by specifying a custom entrypoint command, results in the Pod’s container being started with the aforementioned entrypoint.desired_host: <hostname>
- Utilizing this parameter, by specifying the primary hostname of a node in the cluster, results in the Vnode being started on the aforementioned host.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":99
}
11.29.6. Manually relocating a Vnode¶
In certain scenarios, some instances (pods) of an application might need manual intervention in order to recover. This process might require the pod to be moved to another host which is healthy or more suitable for the resource requirements.
Note
When an application is relocated, the destination server must have enough space available to load the necessary docker
or qcow2
images.
In order to relocate an instance, issue the following command:
Note
If no target hostname is specified, Robin’s placement algorithm will attempt to find the best possible target host given the constraints.
# robin instance relocate <name>
--to-host <hostname>
--relax-placement-rules
|
Name of application instance |
|
Primary hostname of target node to relocate the instance to |
|
Relax all placement rules the pod was created with during relocate |
Example:
# robin instance relocate a1.server.01 --wait
Job: 63 Name: VnodeDeploy State: PROCESSED Error: 0
Job: 63 Name: VnodeDeploy State: WAITING Error: 0
Job: 63 Name: VnodeDeploy State: AGENT_WAIT Error: 0
Job: 63 Name: VnodeDeploy State: FINALIZED Error: 0
Job: 63 Name: VnodeDeploy State: COMPLETED Error: 0
Moves a vnode to another host which is healthy or more suitable for the resource requirements.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: relocate
- This mandatory field within the payload specifies that the relocate operation is to be performed.relax_placement_rules: true
- Utilizing this parameter results in all placement rules associated with the Vnode are dropped during the relocate operation.desired_host: <hostname>
- Utilizing this parameter, by specifying the primary hostname of a node in the cluster, results in the Vnode being relocated to the aforementioned host.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":103
}
11.29.7. Repairing Vnode storage¶
Certain applications have the ability to automatically recover data which has been corrupted and/or lost even when the underlying data volume are not present. Instances that are created as part of these applications can be repaired which translates to a new data volume being created in place of the faulted volumes with the recovered data in place. In order to perform this operation, issue the following command:
# robin instance repair <name>
--allvol
|
Name of application instance |
|
Replace all the volumes instead of just faulted volumes |
Example:
# robin instance repair demo.server.01 --wait
Job: 92 Name: VnodeDeploy State: PROCESSED Error: 0
Job: 92 Name: VnodeDeploy State: WAITING Error: 0
Job: 92 Name: VnodeDeploy State: AGENT_WAIT Error: 0
Job: 92 Name: VnodeDeploy State: FINALIZED Error: 0
Job: 92 Name: VnodeDeploy State: COMPLETED Error: 0
Repairs a vnode of an application by creating new data volumes to replace the corresponding faulted ones with the recovered data present. Note this operation is only valid for applications that have the ability to automatically recover data which has been corrupted and/or lost even when the underlying data volumes are not present.
End Point: /api/v3/robin_server/instances/<instance_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: repair
- This mandatory field within the payload specifies that the repair operation is to be performed.allvol: true
- Utilizing this parameter results in all volumes being replaced instead of just the faulted volumes
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"jobid":109
}
11.30. High Availability of Applications¶
As long as resources are available on surviving nodes, Robin guarantees the high availability of applications in case of server disruptions or downtime and Pod failures. As a result, Robin minimizes the application downtime and maximizes the productivity of the end users of the applications. The mechanism through which is this achieved is known as Robin Autopilot. As its name suggests it is a process wherein which no user intervention is needed in order to redeploy an application such that it becomes healthy again. The core concept that drives Autopilot is very simple: maintain a watch over all the application vnodes (Pods) in a cluster, and keep track of its current state as well as the desired state – if these do not match, attempt to redeploy or relocate the Pod such that it can return to the desired (healthy) state. Since Autopilot only runs on the host where the Robin Server is currently deployed, it utilizes an independent thread that is running on all the nodes in the Robin Cluster to report back the status of the Robin application Pods. This thread utilizes the kubelet service to report the state of the Pod in Kubernetes back to Autopilot every 5 seconds.
Handling node failures:
Autopilot detects a node failure when the aforementioned independent thread running on a particular node fails to report back within a given number of seconds; this value is known as the threshold. The default value for this threshold is 50 seconds, and given that Autopilot polls the monitoring thread every 5 seconds, at least 10 attempts to report the status of the node (and consequently the pods residing on it) have to fail for Autopilot to consider the node to be down. The delay exists in order to account for network downtime and/or other miscelleanous reporting errors. In a scenario wherein which this does occur, Autopilot will automatically attempt to relocate the vnodes residing on the failed host to another suitable host in the cluster. If none of the other exisiting nodes in the cluster are suitable, the application will be marked as FAULTED
and will require manual intervention to recover.
Handling pod failures:
Autopilot detects a Pod failure when the monitoring thread running on the host where the Pod resides reports that it is unhealthy. Autopilot then records this state change and marks the appropriate Vnode as FAULTED
in Robin. Sticking to the previously described core principle, this error state does not meet the desired ONLINE
status of the Vnode. As a result, Autopilot will automatically attempt to redeploy the Pod on its current host. This is attempted a configurable number of times (by default this value is 15), after which if the Pod still is not running manual intervention is required to recover the pod.
Detecting Pod and Application Health:
Robin supports both standard Kubernetes liveness and readiness probes for Vnodes. They can be defined at the role level within the bundle manifest file. As result each Vnode (pod) that is deployed for that role will inherit the specified probes. Their structure should be indentical to the one used when specifying a probe for a standard Kubernetes deployment via a YAML file. These probes in turn will impact the reported state of the pod and consequently determine when Autopilot attempts to recover the pod. However, in certain scenarios even if all the pods an application is comprised of are healthy, the application itself might not be functioning correctly. In order to alert the user when such cases occur, Robin allows the user to specify an application health script within the apphooks
section of the bundle manifest. This will be run every 2 minutes as part of a schedule and will allow the user to accurately determine if their application is truly functional and online.
Note
Since Autopilot only monitors individual Vnodes, it will only take action when it detects the Vnode is in a negative state.
In addition to the above details, the following commands are described in this section:
|
Disable Autopilot |
|
Enable Autopilot |
|
View all objects being tracked by Autopilot |
|
Relocate a Vnode |
11.30.1. Disabling Autopilot¶
Although not generally recommended, one might need to disengage Autopilot in given situations, such as debugging why an application pod is continously crashing. In order to disable Autopilot, issue the following command:
# robin ap disable --app <app_name>
--yes
|
The name of the application to disable Autopilot for |
|
Do not prompt the user for confirmation of disabling |
Example:
# robin ap disable --app a1 --wait --yes
Job: 57 Name: ApplicationUpdate State: PROCESSED Error: 0
Job: 57 Name: ApplicationUpdate State: COMPLETED Error: 0
Disengages autopilot temporarily. Note this is usually not recommended but can be appropriate in certain situations such debugging the continous crashing of application pods.
End Point: /api/v3/robin_server/metrics
Method: PUT
URL Parameters: None
Data Parameters:
method: disable
- This mandatory field within the payload specifies that the disable operation is to be performed.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response: On success the reponse is empty.
11.30.2. Enabling Autopilot¶
Since Autopilot is enabled by default, this command only needs to be run if Autopilot was previously disengaged. By re-enabling Autopilot, the benefits of automatated self-healing and monitoring of applications can be realized. Issue the following command to enable Autopilot:
# robin ap enable --app <app_name>
|
The name of the application to enable Autopilot for |
Example:
# robin ap enable --app a1 --wait
Job: 58 Name: ApplicationUpdate State: PROCESSED Error: 0
Job: 58 Name: ApplicationUpdate State: COMPLETED Error: 0
Rengages Autopilot such that the benefits of automatated self-healing and monitoring of applications can be realized.
End Point: /api/v3/robin_server/metrics
Method: PUT
URL Parameters: None
Data Parameters:
method: enable
- This mandatory field within the payload specifies that the enable operation is to be performed.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response: On success the reponse is empty.
11.30.3. Generating Autopilot Report¶
In order to view all the objects that are currently being tracked by Autopilot and respective details about each assignment such as the threshold value, the last time an update was recieved etc, issue the following command:
# robin ap report --name <name>
--json
|
Object name to filter the report by |
|
Output in JSON |
Example:
# robin ap report
Type | Name | Curr | Desired | LastUpdate | Threshold | MonFreq | GrpName | Autopilot
-----------+------------------------------------------------------------+--------+---------+------------+-----------+---------+--------------------------+-----------
Collection | file-collection-1583356117884 | Online | Online | 5s back | 50 | 5 | vnode36.robinsystems.com | Enabled
Pnode | vnode36.robinsystems.com | Ready | Ready | 5s back | - | 5 | vnode36.robinsystems.com | Enabled
Pnode | vnode88.robinsystems.com | Ready | Ready | 0s back | - | 5 | vnode88.robinsystems.com | Enabled
Pnode | vnode89.robinsystems.com | Ready | Ready | 1s back | - | 5 | vnode89.robinsystems.com | Enabled
Vnode | a1-server-01.t001-u000003.svc.cluster.local (a1.server.01) | ONLINE | ONLINE | 0s back | 50 | 5 | vnode88.robinsystems.com | Enabled
Returns all the objects that are currently being tracked by Autopilot and respective details about each assignment such as the threshold value, the last time an update was recieved etc.
End Point: /api/v3/robin_server/metrics
Method: GET
URL Parameters: None
Data Parameters: None
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 200
Error Response Code: 500 (Internal Server Error) 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"items":[
{
"is_in_transition":false,
"desired_status":"Ready",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"cscale-82-140.robinsystems.com",
"status_threshold":null,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":0,
"enabled":true,
"create_tstamp":1599238236.5658314228,
"curr_status":"Ready",
"id":"cscale-82-140.robinsystems.com",
"time_elapsed_s":3,
"class":"Pnode",
"backoff_time":0,
"services":{
"gui-cli":{
"Id":"gui-cli",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:57:19.320496",
"MainPID":2615
},
"sherlock-server":{
"Id":"sherlock-server",
"ActiveState":"inactive",
"Type":"simple",
"ExecMainStartTimestamp":0,
"MainPID":0
},
"robin-node-monitor":{
"Id":"robin-node-monitor",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:57:01.803506",
"MainPID":1260
},
"robin-watchdog":{
"Id":"robin-watchdog",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:28.105524",
"MainPID":866
},
"httpd":{
"Id":"httpd",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:57:19.039496",
"MainPID":2583
},
"robin-server":{
"Id":"robin-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-09-04 09:50:28.377093",
"MainPID":52304
},
"robin-event-server":{
"Id":"robin-event-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:47.465514",
"MainPID":1037
},
"iomgr-server":{
"Id":"iomgr-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:58:53.276445",
"MainPID":3231
},
"consul_dns":true,
"monitor-server":{
"Id":"monitor-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:57:19.467496",
"MainPID":2655
},
"robin-auth-server":{
"Id":"robin-auth-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:42.970516",
"MainPID":1008
},
"robin-file-server":{
"Id":"robin-file-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:47.932513",
"MainPID":1075
},
"consul-server":{
"Id":"consul-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:23.220527",
"MainPID":569
},
"postgresql-9.6":{
"Id":"postgresql-9.6",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:56:26.091525",
"MainPID":666
},
"consul-client":{
"Id":"consul-client",
"ActiveState":"inactive",
"Type":"simple",
"ExecMainStartTimestamp":0,
"MainPID":0
},
"robin-agent":{
"Id":"robin-agent",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-09-03 12:11:21.325069",
"MainPID":2970
},
"stormgr-server":{
"Id":"stormgr-server",
"ActiveState":"active",
"Type":"simple",
"ExecMainStartTimestamp":"2020-08-28 11:57:13.988499",
"MainPID":2273
}
}
},
{
"is_in_transition":false,
"desired_status":"ONLINE",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"lak.server.01",
"status_threshold":50,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":1599238236,
"enabled":true,
"create_tstamp":1599238236.5824928284,
"curr_status":"ONLINE",
"id":"lak-server-01.t001-u000003.svc.cluster.local",
"time_elapsed_s":3,
"class":"Vnode",
"backoff_time":10
},
{
"is_in_transition":false,
"desired_status":"ONLINE",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"custom-labels-app.server.01",
"status_threshold":50,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":1599238293,
"enabled":true,
"create_tstamp":1599238293.9596076012,
"curr_status":"ONLINE",
"id":"custom-labels-app-server-01.t001-u000003.svc.cluster.local",
"time_elapsed_s":3,
"class":"Vnode",
"backoff_time":10
},
{
"is_in_transition":false,
"desired_status":"ONLINE",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"lak2.server.01",
"status_threshold":50,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":1599238236,
"enabled":true,
"create_tstamp":1599238236.5851621628,
"curr_status":"ONLINE",
"id":"lak2-server-01.t001-u000003.svc.cluster.local",
"time_elapsed_s":3,
"class":"Vnode",
"backoff_time":10
},
{
"is_in_transition":false,
"desired_status":"ONLINE",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"lak3.server.01",
"status_threshold":50,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":1599238236,
"enabled":true,
"create_tstamp":1599238236.5880100727,
"curr_status":"ONLINE",
"id":"lak3-server-01.t001-u000003.svc.cluster.local",
"time_elapsed_s":3,
"class":"Vnode",
"backoff_time":10
},
{
"is_in_transition":false,
"desired_status":"Online",
"last_update_tstamp":1599580075.0771598816,
"monitor_frequency":5,
"name":"file-collection-1598641146105",
"status_threshold":50,
"grpname":"cscale-82-140.robinsystems.com",
"prev_attempt_time":0,
"enabled":true,
"create_tstamp":1599238236.5969836712,
"curr_status":"Online",
"id":"file-collection-1598641146105",
"time_elapsed_s":3,
"class":"Collection",
"backoff_time":0
}
]
}
11.31. Advanced Application Features¶
Robin provides a variety of advanced features that allows users to take advantage of physical attributes of the nodes on which their application is deployed. These features allow for greater flexibility in terms of deployment, fine-grained control, and enable users to attain maximum performance for their deployments.
11.31.1. Static IP Allocation¶
Robin allows users to assign static IP addresses for bundle applications utilizing either Calico, OVS, or SRIOV network driver-based IP-Pools. This control enables users to set up complimentary services or infrastructure beforehand so that they are able to communicate with the application as soon as it is orchestrated and ready. The only prerequisite is that the given IP addresses reside within the respective IP-Pool(s) provided within the application deployment template. This holds true for both range based IP-Pools and those that are defined by a network/netmask combination (also known as a rangeless IP-Pool). One advantage of the latter is that it allows a user to allocate multiple IPv4, IPv6 and dual-stack IP Addresses for an application. However, if a given IP Address is already in-use within the Kubernetes cluster the deployment of the application will fail.
11.31.1.1. Points to consider for static IP addresses¶
The range of static IP addresses provided in the network annotations must be a subset of the IP-Pool range.
If a Pod gets stuck in a
terminating
state because the node on which this Pod was running is permanently unavailable. The static IP address of the terminating Pod is not released until the Pod is permanently deleted. The Pod can be permanently deleted by restoring the node or by running thekubectl delete pod
command.A bundle application can be cloned using a snapshot containing both static IP address and static MAC address.
The
robin ip-pool info
command only shows the allocated IP addresses and not the allocated MAC addresses for cloned applications.
11.31.1.2. Usage¶
In order to specify a particular IP Address for a particular Vnode, its definition within an application JSON will have to be edited such that for each
IP-Pool within the network section from which you want to statically assign an IP Address, an IP Address is specified using the key static_ip
.
More details on how to dynamically specific Static IP Addresses using Robin bundle templates can be found here.
Example:
{
"roles": [
{
"name": "server",
"vnodes": [
{
"network": [
{
"ippool": "ovs-1",
"static_ip": "10.9.85.144"
},
{
"ippool": "ovs-2",
"static_ip": "fd74:ca9b:3a09:868c:10:9:85:144"
}
]
}
]
}
]
}
Note
For more information on IP-Pool management and creation, please refer to the documentation here.
11.31.2. Static MAC Allocation for Robin Bundles¶
Robin CNP allows you to assign static MAC addresses to the Robin bundle applications. Robin recommends you to assign the static MAC addresses to Vnodes of applications that utilize IP-Pool(s) backed by underlay CNI plugins, such as SR-IOV and OVS, rather than those that use overlay CNI plugins such as Calico. This feature ensures that the MAC addresses associated with the respective Vnodes are maintained even if the Vnode is restarted. Consequently, it allows you to prioritize traffic, provide high bandwidth, and ultimately reduce latency for applications utilizing the static MAC address for Robin bundles.
11.31.2.1. Prerequisites¶
The following are the prerequisites for assigning the static MAC address:
A unique MAC address must be provided for the L2 network (IP-Pool).
It must be unicast type.
11.31.2.2. Caveats¶
Below are some points to consider when utilizing static MAC addresses:
Robin CNP supports the static MAC address for KVM-based applications.
Robin CNP does not check if the provided MAC addresses are already in use on the network. However, application deployment may fail if duplicate addresses are present.
A static MAC address can be assigned to one Vnode only. For exmaple, if there are 10 Vnodes to be deployed then there must be 10 static MAC addresses to assign.
If a Pod gets stuck in a
terminating
state because the node on which this Pod was running is permanently unavailable, the static MAC address of the terminating Pod is not released until the Pod is permanently deleted. The Pod can be permanently deleted by restoring the node or by running thekubectl delete pod
command.
11.31.2.3. Usage¶
In order to specify a particular MAC Address for a particular Vnode, its definition within an application JSON will have to be edited such that for each IP-Pool within the network section for which you want to statically assign a MAC Address, a MAC Address is specified using the key static_mac
.
More details on how to dynamically specific Static MAC Addresses using Robin bundle templates can be found here.
Example:
{
"roles": [
{
"name": "server",
"vnodes": [
{
"network": [
{
"ippool": "ovs-1",
"static_mac": "04:04:06:07:08:09"
},
{
"ippool": "ovs-2",
"static_mac": "04:03:06:07:08:09"
}
]
}
]
}
]
}
11.31.3. NUMA Awareness and CPU Exclusivity¶
For latency sensitive workloads, Robin supports deploying applications with NUMA awareness. This means that every Vnode for the application will not cross
the NUMA boundary and as a result all the compute resources requested (including networking) by the Vnode will originate from one NUMA node. This is treated as a strict
constraint and thus if the requirements cannot be met the application deployment will fail altogether. This condition can be specified within the application template
under the application name attribute with the key numa_aware
set to True.
Additionally, Robin supports CPU exclusivity at application level - no other application processes will utilize the CPUs assigned by the Robin orchestrator to the original application. This is achieved via CPU pinning and can be further enhanced by isolating CPUs for deployments as part of the node configuration. This is done with every application deployment so no user knowledge (with regards to CPU IDs) or input is needed.
The combination of these two features allows Robin to support highly performant applications with very little manual input from the end user. In addition normal workloads can also be run on the same cluster with no interruption or reduction to the performance of resource intensive applications.
Note
Even without NUMA awareness explicitly requested Robin attempts to make applications as NUMA aware as possible. This means the orchestrator attempts to gather as many of the required resources as possible from one NUMA node. The difference here is - this is a soft requirement and the application deployment will not fail.
11.31.4. Hugepages Support¶
Robin supports the allocation of hugepages to PODs deployed as part of the creation of a Robin bundle application.
The hugepages can be allocated strictly from a single NUMA node if the application needs to be NUMA aware, or can cross
the NUMA boundary depending on the size of the request. As with all other resources, the Robin orchestrator tracks the
consumption of these hugepages across Vnodes deployed within the cluster, and allocates them appropriately. A
custom mount point for the hugepages (other than the default /dev/hugepages
) can be specified by the user at the time
of application deployment if need be.
In order to create an application with hugepages one can utilize a variety of methods:
Within the bundle manifest from which the application will be created, the default size of hugepages (1Gi or 2Mi) can be specified for each container of a role. More details can be found here.
At run-time the user can specify the number of hugepages that should be used for each specific role for the application in the UI.
A user can edit the template through which an application will be created to enforce hugepages usage by adding the keys
hugepages_1g
orhugepages_2m
(and the respective amount of each to be allocated as the values) within the memory requests for each Vnode where it is needed.
11.31.5. Multi-Instance GPU (MIG) Support¶
Multi-Instance GPU (MIG) is a mode of operation that allows a single GPU to partition into up to seven separate GPU instances and exposes these GPU instances to the nodes as independent GPUs. Every GPU is fully isolated with its own memory and compute resources. More details on NVIDIA multi-instance GPUs in general can be found here. Additional details on MIG support in Kubernetes via the NVIDIA operator can be found here.
Note
The NVIDIA A100 GPU is the only GPU that supports the MIG mode.
Robin supports the partitioned GPU devices by not only discovering their presence on a node but also by tracking their availability throughout and consequently allowing them to be allocatable via Robin Bundle applications. In order to achieve this the necessary NVIDIA components (specified in the documentation referred to above) alongside the GPU operator must be installed on the concerned nodes. For user convienence the installation of the aforementioned operator can be done alongside the installation of Robin via the same installer script by utilizing the --setup-gpu-operator
option. Moreover, if there are any configuration changes post-installation with regard to the MIG partitions the robin host probe --rediscover
command can be used to ensure they are captured and reflected. This is particularly necessary when a node is rebooted (or stopped with regard to cloud-based VM instances) as it could result in the loss of the current MIG configuration or if any taints are removed on particular nodes which result in the deployment of the GPU operator on aforementioned nodes. With regards to the former case, partitions will have to be recreated in order to recover the GPU operator Pods (which will crash due to the sudden removal of the parititions) and thus allow for the devices to be allocatable again.
Note
Currently Robin only supports the mixed
strategy for exposing GPU devices on a Kubernetes node, resulting in the fact that only one resource type can be specified per application. However, there is no limit to how many instances of the specified resource type can be requested.
In order to create an application with MIG partitioned GPU devices a variety of methods can be utilized:
Within the bundle manifest from which the application will be created, the default GPU resource type to be selected can be specified. More details can be found here.
At run-time the user can specify the GPU resource type that should be used for each specific role for the application in the UI.
A user can edit the template through which an application will be created to enforce the GPU resource selected by adding the key
type
with the respective resource type name as the value within the GPU request for each Vnode where it is needed.
Note
The resource type allocated to an application cannot be changed post-deployment, however it can be scaled as needed.
11.31.5.1. MIG partition recreation¶
When a node is rebooted or shutdown and recovered the MIG partitions that were present on it are lost. They can be recreated in the following two ways:
Robin provides a configuration tunable named
create_mig_partitions_on_reboot
, details for which can be found here, in order to facilitate the recreation of the partitions with no user intervention after a node recovers from a shutdown. If this config variable is enabled using therobin config update
command, detailed here, before a node is brought down then all the previously present partitions will be automatically available again after the node is back online.The partitions can be manually recreated by following the instructions detailed here. Once this process is the
robin host probe --rediscover
command can be issued so they can be recognized and allocated by the Robin orchestrator.
Note
By default, the create_mig_partitions_on_reboot
attribute is disabled.
11.31.6. Horizontal Pod Auto-scaling¶
The Horizontal Pod Autoscaler (HPA) is a Kubernetes construct that automatically scales the number of pods based on the CPU/Memory usage of an application or any other combination of exposed custom metrics. It is designed to accomodate dynamic changes in an application’s load over time by altering the number of pods such that the average pod utilization or average application response unit remains constant.
Robin leverages the aforementioned Kubernetes HPA infrastructure to enable autoscaling for Robin roles. The HPA configuration for each role can be defined within the manifest file of a Robin Application Bundle and constrained by any metrics scraped by Prometheus. The advantage of this feature is that it provides the granular control needed to scale a particular role/service of an application based on usage. Imagine the following scenario, a role exists that primarily focuses on daily report generation and so could be heavily utilized in the evening but might only receive a handful of requests during the afternoon. In order to efficiently allocate resources, HPA can be utilized to ensure more pods are available when the role’s load increases whilst also releasing resources through the deletion of pods when the role’s utilization falls. Moreover unlike native Kubernetes HPA, Robin allows for application-specific hook scripts to be run before and after the respective scale in and scale-out operations to ensure the service is configured correctly given the adjustments made.
More details on how to enable and configure HPA for an Robin Application Bundle can be found here.
11.31.6.1. Managing an application’s HPA configuration¶
When HPA is configured for a role, Robin disables manual horizontal scaling operations for the respective role since the two features are diametriclly opposed. This is because if there is a manual scale-out operation performed but the role is under utilized the HPA will automatically kick in and reduce the number of pods for that service to original amount. The result is the same for the manual scale-in operation i.e. no change in the total number of pods.
However these manual operations are very useful in certain circumstances and thus Robin provides a command through which HPA can be temporarily disabled for a role so as to allow these commands to be run again. Moreover the same command can be used to alter the minimum/maximum number of pods a role can be manipulated to have via HPA. In order to manage HPA for a particular role of an application as described previously, issue the following command:
# robin app update-hpa <appname> <rolename>
--max-instances <max_instances>
--min-instances <min_instances>
--disable
--enable
|
Application name |
|
Role name |
|
Maximum number of instances that can be spawned for a role via HPA |
|
Minimum number of instances that can be present for a role via HPA |
|
Disable HPA |
|
Enable HPA |
Example:
# robin app update-hpa a1 server --disable --wait
Job: 64 Name: ApplicationUpdateHPA State: PROCESSED Error: 0
Job: 64 Name: ApplicationUpdateHPA State: WAITING Error: 0
Job: 64 Name: ApplicationUpdateHPA State: COMPLETED Error: 0
Enables/disables horizontal pod autoscaling for a particular role within an application. Note when HPA is enabled for the role, manual horizontal scaling operations are disabled.
End Point: /api/v3/robin_server/apps/<app_name>
Method: PUT
URL Parameters: None
Data Parameters:
action: update_hpa
- This mandatory field within the payload specifies that the add HPA operation is to be performed.name: <app_name>
- This mandatory field within the payload specifies the app for which to configure HPA.role: <role_name>
- This mandatory field within the payload specifies the role whose pods will be controlled by the autoscaler.enable_hpa: [true|false]
- This mandatory field within the payload specifies whether or not the autoscaler should be enabled or not for the specified role.max_instances: <max_instances_value>
- Utilizing this parameter within the payload, by specifying an integer, results in the max number of pods that can be spawned by the autoscaler being set to the value specified. If not specified, the value will be retained from the Kubernetes spec file of the autoscaler.min_instances: <min_instances_value>
- Utilizing this parameter within the payload, by specifying an integer, results in the minimum number of pods that can be present when the autoscaler is in control being set to the value specified. If not specified, the value will be retained from the Kubernetes spec file of the autoscaler.
Port: RCM Port (default value is 29442)
Headers:
Authorization: <auth_token>
: Authorization token to identify which user is sending the request. The token can be acquired from the login API.
Success Response Code: 202
Error Response Code: 500 (Internal Server Error), 404 (Not Found Error), 401 (Unauthorized Error), 400 (Invalid API Usage Error)
Example Response:
Output
{
"plan": {
"opcode":"None",
"role":"server",
"current_user":{
"tenant":"Administrators",
"user_id":3,
"tenants":[
"t2",
"Administrators"
],
"tenant_id":1,
"user_permissions":{
},
"username":"robin",
"namespace":"random",
"user_context":"robin",
"user_capabilities":[
"AllSuperAdminCapabilities"
],
"ip_addr":"172.17.0.1",
"tenant_role":"superadmin",
"session_expires":"2020-10-15T03:25:40",
"user_contexts":[
"robin",
"robin"
]
},
"kind":"robin",
"max_instances":3,
"name":"demo",
"namespace":"random",
"action":"update_hpa",
"enable_hpa":false
},
"jobid":258
}
11.31.6.2. Considerations for Stateless and Stateful Applications¶
Autoscaling is useful for purely stateless applications where the cost of data redistribution due to scale operations is near zero or minimal, or if the state is in-core and can be very easily rebuilt. Thus workloads such as webservers, REST-endpoints, or stateless business logic applications etc. benefit the most from auto-scaling since they dont suffer from the additional overhead that comes with data replication or movement. However one must exercise caution when considering HPA for stateful applications. This is because not only are they typically data-heavy which introduces the problem of data rebalancing when autoscaling but also there could be a negative impact on the performance of applications running on the same platform due to these operations. The following scenarios expand on these potential issues:
Scenario 1: Let’s say autoscaling is applied to a database which has native scale-out capabilities and a policy set such that an auto scale-out is performed by the application when a certain load average is reached. The following will happen behind the scenes when the average load limit is reached. The HPA will kick in wherein which the first step of the scale-out operation, creating the pods and adding storage volumes is performed (Robin does this in seconds). However for the DB to actually use the resources, the data has to be redistributed (the database does this after Robin executes the post-scale hook). This means that the existing data is read from disk and rebalanced by relocating sections of it from the existing pods to the newly created ones. The moved data is purged from the original pods, which internally also reindexes the existing tables. As a result, the total cost of the data movement (including with the consequent network congestion), the impact on existing clients connected to the database, disk load from reads, writes and reindexing far outweighs the cost of adding more “units” to the database. Moreover, the initial trigger for the scale-out action was high load average which is only increased by the resultant data redistribution from the “relieving” operation. This cyclic dependancy will continously reduce the performance of the database.
Scenario 2: Let’s say the threshold for auto-scaling of our database application is met for non-performance related reasons. As explained above, the cost of the consequent scale-out operation due to the necessary data movement is considerably high but in certain scenarios can be acceptable. However the effect of the operation on other applications running on the same platform must be considered too. Even if the performance penalty incurred for the original application is tolerable the network load caused by the scale-out will negatively affect the performance of other applications using that network or sharing the same server. Moreover, in the worst case the performance threshold of the other applications could be crossed which in turn triggers additional scale-out operations for each of the impacted applications. Thus the load on the overall system is compounded in an expontential manner and ultimately could cause the server to crash.
Given the above reasons, Robin recommends that HPA not be used for stateful applications or if it is necessary under extreme caution and rigourous performance testing.
11.31.6.3. Architecture Diagram¶
The following diagram illustrates the architecture and interaction between different components required to enable HPA for Robin Bundle applications.
11.31.7. SSH key support¶
SSH keys provide a secure and scalable way to control Secure Shell (SSH) access to Robin Bundle application containers. An SSH key, which is based on public key infrastructure (PKI) technology, actually consists of the following keys:
A public key which can be shared with others and used by both the user and the remote server.
A private key which must never be shared with anyone and must be secured on a system. The private key can be secured through a passphrase.
Together, these keys form a secure access credential. For more information about the SSH key, see the SSH key.
Robin users can register their personal SSH key pairs for use in a Robin CNP cluster. Only the public key is added to the cluster, however, the private key is maintained by the user. This ensures that only authorized users are able to SSH into the application’s containers. Before deploying a Robin Bundle application, you must specify the SSH key in an application’s manifest file.
Note
You can add SSH keys only to Robin Bundle applications that support the SSH protocol. It is not supported for HELM based applications.
All Robin users can add, view, and delete SSH keys to their cluster. They can also refer to these SSH keys in the Robin Bundle applications they deploy. SSH keys are for the private use of the user who added them. You must not share your SSH keys with other users. With the exception of superadmin users, users cannot access the SSH keys belonging to other users in the cluster.
Robin CNP provides the following role-based access to its users:
User - A user can add, delete, view, or access their own SSH key.
Tenantadmin - A tenantadmin can add, delete, view, or access their own SSH keys, however, the tenantadmin cannot manage the SSH keys for its tenant users.
Superadmin - A superadmin can add, delete, view, or access their own SSH key and other users’ SSH keys in the cluster.
As a user, you can access an application using the SSH key. First, you need to add your SSH key to the cluster, then create a Robin Bundle application using a manifest file that contains the SSH key.
Important
Robin supports only Rivest Shamir Adleman (RSA) SSH key pairs, not Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) SSH key pairs.
The following operations are covered in this section:
|
Add an SSH key |
|
List SSH keys |
|
Delete an SSH key |
11.31.7.1. Add a SSH key¶
To add an SSH key to a cluster such that it can be used by an application for passwordless login, run the following command:
Note
An SSH key pair must be generated beforehand.
# robin ssh-key add <name> <key>
--username <username>
|
Name of the SSH key for future reference |
|
The public key to be added. It includes details such as the key type, the key value, and the key user enclosed in double quotes |
|
Name of the user to associate the SSH key to. Note only a superadmin can add a SSH key for other users |
Example:
# robin ssh-key add Key1 "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxfq02mwYeUUTEmiHtumM5ElPf7KLVj3/locpPvdnnXiDbpACP9nO8NKVKH5ftojrrvgC91CYo9dd8MH+OvXYYwbz3C5Evejs6b7YgWFHwKBtNyVA5kdfjxN1JYNzVYHwLPJqPDRRpCyamn/fj+tG2oR9rIxArl63/7/Rr18N2VGl/GjUUMWGar5UVLSyUyjHiotULm6DaGRZdxtHZQ7dvn+lR1S5a0mnjabwrZ62Edmzhr2B7oKfuzmpfcHXW3SOg1JpJxoWNgzxa3fyy3OmkIxwmXyBb3mnCyCJMkVR+ojjV0nUp root@admin"
Successfully added ssh key.
11.31.7.2. View registered SSH keys¶
To view the list of SSH keys currently present on the cluster, run the following command:
# robin ssh-key list --username <username>
--name <name>
--keyid <keyid>
--full
|
Filter based on the username provided |
|
Filter based on the name of the SSH key provided |
|
Filter based on the ID of the SSH key provided |
|
Display additional information on each registered SSH key |
Note
The ability to view SSH keys is subject to Role Based Access Control (RBAC). Cluster Administrators (users having the superadmin role) are able to view all registered SSH keys in a cluster. All other users with different roles can only view SSH keys that they have registered themseleves.
Example:
# robin ssh-key list --full
+----+----------+----------+
| ID | Username | Key Name |
+----+----------+----------+
| 4 | jay | Key4 |
+----+----------+----------+
SSH Key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC75FipCAYFsIwv1u1twSkO2ZtpV3+VyIzYP1NXmGbkGK//I8LQZViW2K691xcxOyNz8pBVKt+Z5eZoQ/uZW6xT5poGU1zsF1Ir/ML+r3NrVtW0PdcqpFTQtW3T+VZbVUiTXMXI4Zch6SAC6ZYrrVfMOeHaUVX+9s6GsQldTMXU/NgfBHAQT+nttBzdGsa9ICKxPHmEZ6O8dnP/MC5YtoF6YJDOcYZC/jV/9ZtezJhyM5Yhk5KWWEa+3Stj+iM/1z7yy3z/iOksY3CGjJwTdhb+GZRSZV4RXMzRoNUGzpJMR root@master
+----+----------+----------+
| ID | Username | Key Name |
+----+----------+----------+
| 1 | robin | Key1 |
+----+----------+----------+
SSH Key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCGCQ6LoHKk5VvuMaW3/WF0kLxn7DcevkrDsLJX3hSsIMmk3JkAj5fw9waVYaJK5gXu9qABgecC3ORWxK+QH1RNX7W0T0DAG/LHwUA5ZJbL3BKRfHCgN98ZGoFNigRBbpDXiKaYseeKB0CKv48sjF6Lz/BlLfMN98yvzvmzxY7hYw29m0NW7nUGQYB08kc+TscH1NIlK4bXlWYsx+Ve4Ey1h/LSRrGJWZlVPobWnflS2UcZDK4sodq/c+18HvY1BTWz3VTCN/eT3cvmCf2P0nJA7wAKRM1LnXAjnXWTRJcCPIKG root@master
+----+----------+----------+
| ID | Username | Key Name |
+----+----------+----------+
| 2 | robin | Key2 |
+----+----------+----------+
SSH Key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA9om4/HAJk3b5gU4tatCvsD5ZDDYvwlfNwzbQ/sTvyR5D1kAvDzwK6uYZGNaTTnFGEQaFk5VzLBSBzo0Kx1Uu6b3dogRzc67HhlEbgKBjK30v5Ku54H8EnHgzbBrTZ2y/lLWgTGsHN3qhvbrhntNZWMvAAhcGZiOSXJZ/luJ1r0yc7awMsHcomOrs1Dof698WK7alrD8u0g9qguCq2FMY0Bfe6ICTsu4beXw/soLKa5zIp2OFDgXlKwCaLuUIGVdPBYzzlsrWXRUqwt4ndkmG2lNeT1RIV1QUv root@master
11.31.7.3. Delete a SSH key¶
To delete an SSH key such that it cannot be used in future application deployments, run the following command:
Important
When an SSH key is deleted from a cluster, it does not impact any applications deployed with it.
# robin ssh-key delete <keyid> --yes
|
ID of the SSH key to be deleted. |
|
Do not prompt the user for confirmation. |
Note
A superadmin user can delete SSH keys associated with any user within the cluster.
Example:
# robin ssh-key delete 1 --yes
Deleted key 1 (Key1).
11.31.7.4. SSH Key usage¶
After an SSH key is registered, it can be specified at instantiation time within the application template file in order to enable password-less login. It is recommended that the SSH key is provided at essentially runtime as each key is registered on a user basis and the arbitrary name by which each key is referred to is also user dependant. As a result, there is no generic name that can be specified within a manifest file that satisifies all deployments and users should specify the SSH key at the time of deployment. The exact parameters that must be set in the template file are described below.
{
"name": "mysql",
"zoneid": "1579233047",
"bundleid": "1",
"content_id": "f428eeefd6d08ddb7ea91f38e4755771",
"enable_ssh": true,
"ssh_key_names": [
"registered-ssh-key-1"
],
"roles": [...]
}
Note
As shown above, SSH keys must be specified at the global app level and thus are considered to not be tied to any given role.
Once the application is deployed, users can ssh to the exposed IP Address or hostname of the instance without a password.
Example
# ssh 192.0.2.102
Last login: Tue Oct 4 05:18:30 2022 from 192.0.2.64
Note
The IP Address or hostname of a container can be found using the robin instance list
command, detailed here.
11.32. Application Highlight: Virtual Machine Support¶
From version 5.3.3 and above, Robin CNP supports Linux Kernel-based Virtual Machines (KVM) and consequently allows for virtual machines to be deployed within clusters. All necessary KVM parameters can be specified within a Robin bundle and the respective qcow2
images can also be uploaded to a File Collection within the cluster in order to spawn virtual machines with the desired customization. Since virtual machines are deployed via Robin Bundles, they are treated just like any other application on the platform with the full range of lifecycle management operations available for them.
Note
In order to create and manage virtual machines on CNP, knowledge of Robin Bundles and KVM are needed. More information on Robin Bundles can be found here.
In addition, below are some points that should be considered before deploying virtual machines:
OVS Networking for VMs from CNP version 5.3.3 onwards whereas Calico Networking is only supported on IPv4 clusters and from version 5.3.7 onwards.
All recovery workflows such as snapshots, clones, backups, and restorations of VMs are supported.
All virtual machines running an operating system that is compatible with
qcow2
and the underpinning KVM version (1.5.3) are supported.
Note
If your Robin cluster setup has a combination of physical and virtual machines, you must ensure that the KVM VM is deployed on a physical node of the cluster. You can use the Pod affinity policy or Pod placement policy and ensure the KVM VM is deployed on a physical node of the cluster.
11.32.1. High-Level Steps to Create and Manage VMs¶
The following are the high-level steps for creating and managing VMs on Robin CNP.
Check prerequisites.
Verify CNP configuration.
Download required
qcow2
orISO
image from a reliable source.Register the downloaded
qcow2
orISO
image with Robin CNP.Customize the
manifest.yaml
file for creating KVM Robin Bundle.Create a KVM Robin Bundle tar file.
Add the KVM Robin Bundle.
Create a VM using the KVM Bundle.
Lifecycle management of a virtual machine.
11.32.2. Prerequisites¶
11.32.2.1. Software Prerequisites¶
The Robin cluster on which the VM is to be deployed is installed with Robin Cloud Native Platform v5.3.3 or above.
In order to verify this, run the following command:
# robin version
11.32.2.2. Hardware Prerequisites¶
The following must be enabled in the BIOS settings of the bare metal server:
Intel Processors - VD-T
AMD Processors - SVM
BIOS VT-D (Intel)
SVM (AMD)
In order to verify these settings have been appropriately set, run the following command:
# virt-host-validate
11.32.2.3. Image Prerequisites¶
The VM image must be in
qcow2
orISO
format.The VM image should have the
cloud init
service. If the image does havecloud init
service, the networking for the VM must be configured manually.The VM image must mount when booting.
The Robin file collection on which the VM image is to be hosted must be larger than the size of the compressed aforementioned image.
In order to verify the size of the available file collection(s), run the following command:
# robin collection list
11.32.2.4. Robin Install Prerequisites¶
The following Robin installation pre-checks must pass:
KVM Virtualization
KVM vhost-net
KVM Networking
KVM PCI Device Passthrough (For SRIOV support)
In order to verify these pre-checks have passed, run the following command:
# ./robin-install.sh precheck
11.32.2.5. Networking Prerequisites¶
The Robin cluster is configured with a public OVS based IP pool from which the VM IPs are assigned from.
VM IP addresses must be in the same L3 subnet as the hosts. For example this means if the host IP is 101.1.1.10/24 then the IP-Pool must also have a netmask of 24 bits.
VM IP addresses must be in a routable LAN from the hosts on which they are deployed.
The VM image must be configured with static IP addresses.
11.32.2.6. Storage Prerequisites¶
The storage capacity of the nodes within the cluster must be greater than or equal to the planned size of the file system(s) of the VMs as defined in the manifest file for the respective Robin Bundle.
The specified capacity of the rootfs volume of the KVM based application to be deployed must be greater than the size of the associated VM image.
11.32.3. Register a VM Image¶
In order to create a KVM application, the appropriate qcow
or ISO
VM image must first be uploaded to a file collection and registered with Robin. The image can either be present locally or available for download via a registry already known to Robin. An example command for registering a pre-downloaded image is shown below. More details on the robin image add
command can be found here.
Example for qcow image
# robin image add centos7 2009 QCOW ~/centos-kvm/CentOS-7-x86_64-GenericCloud-2009.qcow2
File upload: 100% -- (1391329280/1391329280)
Job: 84 Name: ImageAdd State: VALIDATED Error: 0
Job: 84 Name: ImageAdd State: COMPLETED Error: 0
Example for ISO image
# wget https://mirror.umd.edu/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
--2022-12-07 12:32:14-- https://mirror.umd.edu/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
Resolving mirror.umd.edu (mirror.umd.edu)... 128.8.207.141
Connecting to mirror.umd.edu (mirror.umd.edu)|128.8.207.141|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4712300544 (4.4G) [application/octet-stream]
Saving to: ‘CentOS-7-x86_64-DVD-2009.iso’
CentOS-7-x86_64-DVD-2009.iso 100%[============================================================================================>] 4.39G 34.3MB/s in 2m 39s
2022-12-07 12:34:55 (28.3 MB/s) - ‘CentOS-7-x86_64-DVD-2009.iso’ saved [4712300544/4712300544]
# robin image add centos7 2009 ISO CentOS-7-x86_64-DVD-2009.iso
File uploaded: Calculating hash. This could take a while depending on image size
Job: 87 Name: ImageAdd State: PROCESSED Error: 0
Job: 87 Name: ImageAdd State: COMPLETED Error: 0
# robin bundle add centos kvm http://builds.robinsystems.com:8080/job/robin-bundles/job/master/lastSuccessfulBuild/artifact/BUNDLES/kvm-centos-7-745_master.tar.gz --wait
File uploaded: Calculating hash. This could take a while depending on image size
Job: 88 Name: BundleAdd State: PROCESSED Error: 0
Job: 88 Name: BundleAdd State: COMPLETED Error: 0
11.32.4. Create a KVM Robin Bundle¶
A KVM Robin Bundle is a tar file containing the following components: a manifest file, a directory for icons and a directory for scripts. The following section focuses on the manifest file as it is a mandatory file and is considered the blueprint for the application. The other components are optional and can be populated at the user’s descretion. More details on the aforementioned components and how to customize them can be found here.
Note
Given that a KVM bundles are treated similarly to other application bundles, the process of creating and registering them is the same. These steps are detailed here whilst the sections detailed below focus on customizing manifest file attributes which differentiate KVM based bundles from other application bundles.
11.32.4.1. Sample Manifest file¶
The following is an example of a manifest file for a KVM application running the CentOS operating system.
name: CentOS
version: "7"
icon: icon.png
snapshot: enabled
clone: enabled
roles: [server]
server:
name: CentOS
multinode: true
scaleout: enabled
scaledown_mem: enabled
addvolume: enabled
scaledown_mem: enabled
compute:
memory: 8G
hugepages_1gi: 0G
hugepages_2mi: 0G
# hugepages_locked: "yes"
# hugepages_noshared: "yes"
# memballoon: "model=none,stats.period=10"
cpu:
reserve: true
cores: 8
# rt_cores: 1-7
# rt_sched: "fifo"
# rt_priority: 1
# emulatorpin: "outside_cpuset"
# cache_ways: 4
# kvmopts: "mode=host-model,match=exact"
# kvmopts: "mode=host-passthrough,require=tsc-deadline,check=none"
devices:
- name: fec
type: pci
class: "0x120000"
vendor: "0x8086"
count: 0
image:
name: centos7
version: "2009"
engine: kvm
ostype: linux
osvariant: rhel7
graphics: "none"
imgsize: "8G"
storage:
- type: root_fs
media: ssd
bus: scsi
path: /
size: 20G
- type: data
media: ssd
bus: scsi
count: 1
path: /dev/data
fstype: raw
size: 10G
- type: logs
media: ssd
bus: scsi
count: 1
path: /dev/log
fstype: raw
size: 10G
# livenessProbe:
# tcpSocket:
# port: 22
# initialDelaySeconds: 180
# periodSeconds: 10
env:
# KVM specific env variables
- CLOUD_INIT:
type: boolean
value: true
- CLOUD_INIT_ADMIN_USER: robin
- CLOUD_INIT_ADMIN_PASSWORD:
type: password
value: "robin123"
- CLOUD_INIT_USERDATA:
type: yaml
value: |
# cloud-config
password: "{{ROLES.server.ENV.CLOUD_INIT_ADMIN_PASSWORD}}"
chpasswd:
list: |
root: "{{ROLES.server.ENV.CLOUD_INIT_ADMIN_PASSWORD}}"
expire: False
- QEMU_GUEST_AGENT: qemu-guest-agent-2.12.0-3.el7.x86_64.rpm
11.32.4.2. Customizing the Manifest file¶
The following are the Role level sections that need to be edited for VM deployment. More details on all customisable sections and/or attributes within the manifest file can be found here.
Image
Within each role an image
section must be specified. For VM deployment this section is associated to the KVM image that was uploaded to a file collection earlier. Below are the attributes that need to be customized for the respective image.
name
- This name must match the image name supplied when the image was registered.version
- This version must match the image version supplied when the image was registered.engine
- Engine can be docker/kvm/lxc. Docker for docker containers, KVM for VM’s and LXC for Linux containers.ostype
- The guest configuration for a type of operating system (Example: Linux, Windows). This will attempt to pick the most suitable ACPI and APIC settings, optimally supported mouse drivers, Virtio, and generally accommodate other operating system quirks..osvariant
- It is the kind of GuestOS. It is an optional specification. However, it provides some default parameters for each virtual machine that can help improve performance for a specific operating system or distribution.graphics
- Name of the graphics device to allow for graphical interaction with the guest OS. Specify ‘none’ to indicate no such device.imagesize
- Specify the size of the image.
Note
Details for all of the above attributes apart from name
and version
with regards to valid values that can be specified for each of them, can be found in the official KVM documentation.
Devices
name
- Name of the device.type
- PCI is the default type of device.class
- FPGA class.vendor
- Vendor name of the PCI card.count
- Number of devices to be allocated
Storage
Within each role a storage
section must be specified. Below are the key attributes that need to be edited for storage space availability within the VM.
type
- The value specified for this attribute indicates the volume type (e.g. data / commitlog / root_fs / etc.). There can be multiple volume types per role depending on the number of volumes however they all need to be unique within the role.size
- The size of volume created for the specified volume type within the role.
Note
Non root_fs
partitions are created with a raw
file system type and so will need to be formatted to the required file system type from within the VM.
Environment Variables
Within each role an env
section can be used to specify environment variables to be exposed within the VM. Below are environment variables that Robin recommends be exposed for VM configuration.
CLOUD_INIT
- This variable should be specified with its type set to boolean and the value as True for images that support the use of Cloud Init configurations.CLOUD_INIT_ADMIN_USER
- This variable should be set to the name of admin user that should be created as part of the VM deployment.CLOUD_INIT_ADMIN_PASSWORD
- This variable should be specified with its type set to password and the value being the password for the aforementioned admin user.KVM_SKIP_NETWORKING
- This variable should be specified with its type set to boolean and the value as False so that networking is automatically managed by Robin via the Cloud Init config. Set it to true if the networking is configured manually outside of the config specified.
Note
For more details on Cloud Init configurations and the possible values that can be specified, review the documentation here.
11.32.5. Create a Virtual Machine¶
After the respective VM images and associated KVM based application bundles are registered, a VM can be created using the robin app create from-bundle
command. More details about this command can be found here. An example usage of the command is shown below.
Example
# robin app create from-bundle demo-vm 1 --rpool default --ip-pool public --wait
Job: 6365 Name: ApplicationCreate State:VALIDATED Error: 0
Job: 6365 Name: ApplicationCreate State:PROCESSED Error: 0
Job: 6365 Name: ApplicationCreate State:WAITING Error: 0
Job: 6365 Name: ApplicationCreate State:COMPLETED Error: 0
11.32.5.1. Create a VM Using Cisco DCNM E1000 Virtual Interface¶
Robin CNP supports Cisco Data Center Network Manager (DCNM) E1000 virtual network interface for KVMs. You can deploy the Cisco DCNM E1000 interface when creating a KVM on a Robin CNP cluster.
Note
The Cisco DCNM E1000 Virtual Interface is supported only on KVMs with OVS. You can deploy a KVM bundle to use an OVS IP Pool with the model as E1000 only using an input.yaml
file.
Sample input.yaml file
roles:
- name: server
ippools:
- ippool: ovs-3
model: e1000
- ippool: sec-3
primary: ovs-3
Example
# robin app create from-bundle --rpool default --namespace z1 sec-pool 1 /root/e1000_input.yaml --wait
Job: 86 Name: ApplicationCreate State: PROCESSED Error: 0
Job: 86 Name: ApplicationCreate State: WAITING Error: 0
Job: 86 Name: ApplicationCreate State: COMPLETED Error: 0
11.32.5.2. Create a VM with a custom UUID¶
Robin CNP provides you an option to provide a custom Universally Unique Identifier (UUID) manually for a KVM-based application via the input.yaml
at runtime when creating the application. This feature enables the use of application licenses which are tied to the UUID of the VM.
Note
Only standard UUIDs can be specified and their uniqueness must be verified externally ensuring that it hasnt been used previously for another VM.
Sample input.yaml file
The following is the sample input.yaml file with the UUID:
appname: "kvm-centos-8-1"
roles:
- name: server
uuid: ["7dc29533-b055-4dd7-a9ef-5799db2c098a"]
ippools:
- ippool: ovs-mgmt-0
Example
# robin app create from-bundle --rpool default --namespace default ovs 1 /root/uuid_input.yaml --wait
Job: 86 Name: ApplicationCreate State: PROCESSED Error: 0
Job: 86 Name: ApplicationCreate State: WAITING Error: 0
Job: 86 Name: ApplicationCreate State: COMPLETED Error: 0
Note
You can verify the provided UUID is present by running this command on the host: virsh dumpxml <vmname_or_vmid> | grep uuid
. In addition, the following command can also be run within the VM to verify the UUID is properly stamped: sudo dmidecode -t system | grep UUID
11.32.5.3. Create a VM with static MAC address¶
Robin CNP provides you an option to specify a static MAC address for a KVM-based application through the input.yaml
at runtime when creating the application. This feature enables you to use the VM licenses, which are tied to the MAC addresses of the VMs. For more information, see Static MAC address.
The following key is used to specify the static MAC address for the KVM-based application in the input.yaml
:
static_macs
Note
For KVM-based applications, only MACVLAN, OVS, and SR-IOV with VFIO-PCI drivers are supported.
Sample input.yaml file
roles:
- name: server
multinode_value: 2
ippools:
- ippool: bond-1
static_macs: ["fa:16:3e:11:12:11", "fa:16:3e:11:12:12", "fa:16:3e:11:12:13", "fa:16:3e:11:12:14"]
static_ips: ["fd74:ca9b:3a09:8829:0010:0009:0001:0001", "fd74:ca9b:3a09:8829:0010:0009:0001:0002"]
- ippool: bond-2
static_macs: ["fa:16:3e:11:13:11", "fa:16:3e:11:13:12", "fa:16:3e:11:13:13", "fa:16:3e:11:13:14"]
static_ips: ["fd74:ca9b:3a09:8830:0010:0009:0001:0001", "fd74:ca9b:3a09:8830:0010:0009:0001:0002"]
Example
# robin app create from-bundle --rpool default --namespace default ovs 2 /root/staticmac_input.yaml --wait
Job: 86 Name: ApplicationCreate State: PROCESSED Error: 0
Job: 86 Name: ApplicationCreate State: WAITING Error: 0
Job: 86 Name: ApplicationCreate State: COMPLETED Error: 0
Note
To specify the static MAC address for KVM-based applications, you must pass the IP-Pool name in the input.yaml
, not in the --ip-pools
option of the robin app create
command.
11.32.6. Access a Virtual Machine¶
To access a VM, the IP Address of the aforementioned machine needs to be determined first. In order to do so use the robin instance list
command. More details about this command can be found here. An example usage of the command is shown below.
Example
# robin instance list
ID | Owner/Tenant | ResPool | Container | Hostname | IP Addresses | Status | Autopilot | LastOpr | Host | Engine | Cores | GPUs | Mem (GB) | Ctime
---+----------------------+---------+-------------------+--------------------------+----------------+--------+-----------+---------+--------+--------+-------+------+----------+----------------------
1 | robin/Administrators | default | demo-vm.server.01 | vnode74.robinsystems.com | 10.7.201.74/16 | ONLINE | Enabled | STARTED | demo15 | kvm | 8 | 0 | 8.0 | 26 Jan 2021 15:58:46
After the obtaining the IP Address for the relevant VM container, any supported remote access method, such as SSH, can be used to access the aforementioned machine alongside the credentials specified in the respective application bundle’s manifest file. An example is shown below.
Example
# ssh vmuser@10.7.201.74
vmuser@10.7.201.74's password:
Last login: Thu Jan 28 06:04:40 2021 from 10.10.100.116
11.32.7. Lifecycle Management of a Virtual Machine¶
11.32.7.1. Start a Virtual Machine¶
In order to start a previously stopped VM, use the robin app start
command. More details about this command can be found here. An example usage of this command is shown below. If the application name is not known, the robin app list
command can be used. Additional details for this command can be found here.
Note
If an application consists of multiple VM containers, and only individual containers need to be started use the respective robin instance start
and robin instance list
commands. More details for these commands can be found here.
Example
# robin app start demo-vm --wait
Job: 6589 Name: ApplicationStart State: PROCESSED Error: 0
Job: 6589 Name: ApplicationStart State: AGENT_WAIT Error: 0
Job: 6589 Name: ApplicationStart State: COMPLETED Error: 0
After a VM is started, it might be the case that the VM’s IP Address is not pingable even though the VM container is available and the IP Address can be used to gain access to the console. This can result in the above operation failing. One reason for this could be that the networking for the VM is customised directly in the manifest file for the associated application bundle. To avoid this issue enable networking using cloud-init
in order to ensure the VM is always pingable. This can be achieved by modifying the VM image to be inline with cloud-init
specifications.
Note
To disable ping checks entirely, set the attribute ping_check
to have a value of false within the manifest file of the respective application bundle under the role level image
section. This results in the platform not performing any ping checks on the VM’s IP Addresses as part of a health check during any lifecycle management operations.
11.32.7.2. Stop a Virtual Machine¶
In order to stop a running VM, use the robin app stop
command. More details about this command can be found here. An example usage of this command is shown below. If the application name is not known, the robin app list
command can be used. Additional details for this command can be found here.
Note
If an application consists of multiple VM containers, and only individual containers need to be stopped use the respective robin instance stop
and robin instance list
commands. More details for these commands can be found here.
Example
# robin app stop demo-vm --wait
Job: 6589 Name: ApplicationStop State: PROCESSED Error: 0
Job: 6589 Name: ApplicationStop State: AGENT_WAIT Error: 0
Job: 6589 Name: ApplicationStop State: COMPLETED Error: 0
11.32.7.3. Shutdown a Virtual Machine from Console¶
In order to shutdown a VM via the console, first access the console using the steps provided here. Next run the following command in the console:
# shutdown -h
When a VM is shutdown via console, the respective VM container is automatically restarted unless the Autopilot feature for the concerned application is disabled. More details on how to disable Autopilot via the robin ap disable
command, can be found here.
11.32.7.4. Restart a Virtual Machine¶
In order to restart a VM, use the robin app restart
command. More details about this command can be found here. An example usage of this command is shown below. If the application name is not known, the robin app list
command can be used. Additional details for this command can be found here.
Note
If an application consists of multiple VM containers, and only individual containers need to be restarted use the respective robin instance restart
and robin instance list
commands. More details for these commands can be found here.
Example
# robin app restart demo-vm --wait
Job: 234 Name: ApplicationStart State: VALIDATED Error: 0
Job: 234 Name: ApplicationStart State: PREPARED Error: 0
Job: 234 Name: ApplicationStart State: AGENT_WAIT Error: 0
Job: 234 Name: ApplicationStart State: COMPLETED Error: 0
Note
When an VM container is restarted, the VM itself is rebooted.
11.32.7.5. Delete a Virtual Machine¶
In order to delete a VM, use the robin app delete
command. More details about this command can be found here. An example usage of this command is shown below. If the application name is not known, the robin app list
command can be used. Additional details for this command can be found here.
Note
If an application consists of multiple VM containers, and only individual containers need to be restarted use the respective robin instance delete
and robin instance list
commands however this is not recommended. More details for these commands can be found here.
Example
# robin app delete demo-vm --wait
Job: 238 Name: ApplicationDelete State: VALIDATED Error: 0
Job: 238 Name: ApplicationDelete State: PREPARED Error: 0
Job: 238 Name: ApplicationDelete State: AGENT_WAIT Error: 0
Job: 238 Name: ApplicationDelete State: COMPLETED Error: 0
11.32.7.6. View Virtual Machine Images¶
In order to view a list of registered VM images, run the robin image list
command. More details about this command can be found here. An example usage of the command is shown below.
Example
# robin image list
Image Id | Owner/Tenant | Name | Version | Format | Content Id | File Object Id | File Name
---------+----------------------+--------+---------+--------+----------------------------------+----------------+-----------------------------------------
1 | robin/Administrators | centos | 2003 | QCOW | ef7f109590094e37c54aead73f3cdedc | 1611689015480 | CentOS-7-x86_64-GenericCloud-2003.qcow2
2 | robin/Administrators | centos | 1907 | QCOW | 160aa274e7a69f2edb50e2d89f54270b | 1611689714495 | CentOS-7-x86_64-GenericCloud-1907.qcow2
11.32.7.7. Delete Virtual Machine Bundle¶
In order to delete a VM bundle, use the robin bundle delete
command as a VM bundle is treated the same to any other bundle. More details about this command can be found here. An example usage of this command is shown below. If the necessary parameters, namely bundle ID and zone ID, are not known the robin bundle list
command can be used. Additional details for this command can be found here.
Note
Before a VM bundle can be deleted, all applications consisting of VM’s deployed from the respective bundle must be deleted via the robin app delete
command. Details of this command can be found here.
Example
# robin bundle remove 1599768542 2 --wait
Are you sure you want to delete [y/n] ? y
Job: 437 Name: BundleRemove State: VALIDATED Error: 0
Job: 437 Name: BundleRemove State: PREPARED Error: 0
Job: 437 Name: BundleRemove State: FINALIZED Error: 0
Job: 437 Name: BundleRemove State: COMPLETED Error: 0
11.32.7.8. Delete Virtual Machine Images¶
In order to delete a VM image, use the robin image delete
command. More details about this command can be found here. An example usage of this command is shown below. If the necessary parameter, namely the image ID, is not known the robin image list
command can be used. Additional details for this command can be found here.
Note
Before a VM image can be deleted, all bundles (and consequently all applications) that refer to the respective image must be deleted via the robin bundle delete
command. Details of this command can be found here.
Example
# robin image delete 1
Are you sure you want to delete [y/n] ? y
Job: 897 Name: ImageRemove State: VALIDATED Error: 0
Job: 897 Name: ImageRemove State: COMPLETED Error: 0