Skip to main content
Skip table of contents

Installing with x-install Tool (Kubernetes)

The x-install tool is the newest Exostellar installer designed to simplify the setup process. It offers a variety of subcommands to provision a sandbox environment, install Exostellar products, and verify post-installation readiness.

Prerequisites

Before using the x-install tool, ensure that your environment meets the following requirements:

  • Terraform: Version 1.8+

  • kubectl: Version 1.28+

  • Helm: Version 3.14.2+

  • AWS CLI

  • AWS Authentication, Credentials, and Region
    Please properly configure AWS authentication and default region in your local environment.

AWS Authentication and Credentials Setup Methods

You can set up credentials using various methods such as command-line options, environment variables, assume role, credentials files, configuration files, etc.

  • Command-line Options

    BASH
    aws configure sso
    BASH
    aws s3 ls --profile profile1
  • Environment Variables

    BASH
    export AWS_ACCESS_KEY_ID=<AccessKeyId>
    export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
    export AWS_SESSION_TOKEN=<SessionToken>
  • Assume role

    CODE
    aws sts assume-role \
        --role-arn arn:aws:iam::123456789012:role/xaccounts3access \
        --role-session-name s3-access-example
  • Credentials and Configuration File:
    Update in ~/.aws/credentials and ~/.aws/config

    BASH
    aws configure

Please ensure the default region is set for deployment. If not set above, use the following command:

BASH
aws configure set default.region us-east-2

Ensure the account has the following IAM permissions:

IAM Permissions for the AWS Account
JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudtrail:LookupEvents",
                "cloudtrail:DescribeTrails",
                "cloudtrail:GetTrailStatus",
                "cloudtrail:GetEventSelectors",
                "cloudformation:ListStacks",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:ListStackResources",
                "cloudformation:CreateStack",
                "cloudformation:GetTemplateSummary",
                "cloudformation:CreateUploadBucket",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DeleteStack",
                "cloudformation:ExecuteChangeSet",
                "ec2:RunInstances",
                "ec2:CreateNetworkAclEntry",
                "ec2:DescribeSubnets",
                "ec2:DescribeKeyPairs",
                "ec2:DescribeVpcs",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSecurityGroupRules",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CreateTags",
                "ec2:CreateSecurityGroup",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:DeleteSecurityGroup",
                "ec2:StopInstances",
                "ec2:ModifyInstanceAttribute",
                "ec2:TerminateInstances",
                "ec2:DescribeVpcAttribute",
                "ec2:DescribeTags",
                "ec2:DescribeNetworkInterfaces",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:CreateVpc",
                "ec2:DeleteVpc",
                "ec2:CreateSubnet",
                "ec2:DeleteSubnet",
                "ec2:CreateRouteTable",
                "ec2:CreateRoute",
                "ec2:AssociateRouteTable",
                "ec2:ReplaceRouteTableAssociation",
                "ec2:DeleteRouteTable",
                "ec2:CreateInternetGateway",
                "ec2:AttachInternetGateway",
                "ec2:AllocateAddress",
                "ec2:ReleaseAddress",
                "ec2:CreateNatGateway",
                "ec2:DeleteNatGateway",
                "ec2:CreateLaunchTemplate",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeInternetGateways",
                "ec2:DetachInternetGateway",
                "ec2:ModifyVpcAttribute",
                "ec2:ModifySubnetAttribute",
                "ec2:DescribeNatGateways",
                "ec2:DescribeInstanceTypeOfferings",
                "ec2:DescribeEgressOnlyInternetGateways",
                "ec2:DescribeLaunchTemplateVersions",
                "ec2:DeleteLaunchTemplate",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeImages",
                "ec2:DescribeImageAttribute",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeAccountAttributes",
                "ec2:DescribeRouteTables",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeAddresses",
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumes",
                "ec2:DescribeVolumeStatus",
                "ec2:DescribeVolumesModifications",
                "ec2:DescribeInstanceAttribute",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:DescribeAddressesAttribute",
                "ec2:DeleteNetworkAclEntry",
                "ec2:DisassociateRouteTable",
                "ec2:DeleteInternetGateway",
                "ec2:DisassociateAddress",
                "ec2:DeleteRoute",
                "s3:CreateBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteBucket",
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:GetBucketPolicy",
                "s3:PutBucketPolicy",
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:ListRoles",
                "iam:TagRole",
                "iam:PutRolePolicy",
                "iam:CreateInstanceProfile",
                "iam:AddRoleToInstanceProfile",
                "iam:PassRole",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "iam:GetRole",
                "iam:ListPolicies",
                "iam:ListAttachedRolePolicies",
                "iam:CreateServiceLinkedRole",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:DeleteInstanceProfile",
                "iam:ListEntitiesForPolicy",
                "iam:GetInstanceProfile",
                "iam:ListInstanceProfiles",
                "iam:ListInstanceProfilesForRole",
                "iam:ListOpenIDConnectProviders",
                "iam:GetOpenIDConnectProvider",
                "iam:DeleteOpenIDConnectProvider",
                "iam:GetRolePolicy",
                "iam:ListRolePolicies",
                "iam:CreatePolicy",
                "iam:DeletePolicy",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:DetachRolePolicy",
                "iam:GetUserPolicy",
                "iam:GetGroupPolicy",
                "iam:ListUsers",
                "iam:ListAccessKeys",
                "iam:CreateAccessKey",
                "iam:ListPolicyVersions",
                "iam:CreateOpenIDConnectProvider",
                "iam:TagOpenIDConnectProvider",
                "iam:TagInstanceProfile",
                "eks:ListClusters",
                "eks:DescribeCluster",
                "eks:ListNodegroups",
                "eks:DescribeNodegroup",
                "eks:DescribeAddon",
                "eks:DisassociateAccessPolicy",
                "eks:ListAddons",
                "eks:DescribeIdentityProviderConfig",
                "eks:CreateCluster",
                "eks:DeleteCluster",
                "eks:DeleteNodegroup",
                "eks:UpdateClusterConfig",
                "eks:UpdateClusterVersion",
                "eks:CreateNodegroup",
                "eks:UpdateNodegroupConfig",
                "eks:UpdateNodegroupVersion",
                "eks:DescribeAddonVersions",
                "eks:CreateAddon",
                "eks:DeleteAddon",
                "eks:UpdateAddon",
                "eks:TagResource",
                "eks:AccessKubernetesApi",
                "eks:ListAccessPolicies",
                "eks:ListAccessEntries",
                "eks:ListIdentityProviderConfigs",
                "eks:DescribeAccessEntry",
                "eks:ListPodIdentityAssociations",
                "eks:ListAssociatedAccessPolicies",
                "eks:CreateAccessEntry",
                "eks:AssociateAccessPolicy",
                "eks:DeleteAccessEntry",
                "elasticloadbalancing:CreateLoadBalancer",
                "elasticloadbalancing:DescribeLoadBalancers",
                "elasticloadbalancing:DeleteLoadBalancer",
                "elasticloadbalancing:CreateTargetGroup",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:RegisterTargets",
                "autoscaling:CreateAutoScalingGroup",
                "autoscaling:UpdateAutoScalingGroup",
                "autoscaling:DeleteAutoScalingGroup",
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeScalingActivities",
                "logs:CreateLogGroup",
                "logs:DeleteLogGroup",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents",
                "logs:FilterLogEvents",
                "logs:ListTagsForResource",
                "logs:PutRetentionPolicy",
                "logs:TagResource",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:ListMetrics",
                "ssm:ListAssociations",
                "sns:ListTopics",
                "kms:TagResource",
                "kms:ListAliases",
                "kms:CreateAlias",
                "kms:DeleteAlias",
                "kms:CreateKey",
                "aws-marketplace:ListEntities",
                "aws-marketplace:ViewSubscriptions"
            ],
            "Resource": "*"
        }
    ]
}
SSH Key Creation

Use the following command to create a new SSH key pair:

BASH
aws ec2 create-key-pair --key-name 'my-dev-key' --query 'KeyMaterial' --output text --region us-east-2 > my-dev-key.pem

Modify the permission to secure the key:

BASH
chmod 400 my-dev-key.pem
  • x-install tool: Version 0.0.15+

x-install Download Options

Platform

Architecture

File

Release Date

macOS

ARM64

x-install-darwin-arm64-.0.0.15.tar.gz

macOS

x86_64

x-install-darwin-x86_64-.0.0.15.tar.gz

Linux

ARM64

x-install-linux-arm64-.0.0.15.tar.gz

Linux

i386

x-install-linux-i386-.0.0.15.tar.gz

Linux

x86_64

x-install-linux-x86_64-.0.0.15.tar.gz

Windows

ARM64

x-install-windows-arm64-.0.0.15.zip

Windows

i386

x-install-windows-i386-.0.0.15.zip

Windows

x86_64

x-install-windows-x86_64-.0.0.15.zip

For macOS users, please grant x-install permissions by clicking the “Allow Anyway” button in the Security settings. This button is available for about an hour after you try to open the app. You can access the Security settings by choosing Apple Menu System Settings, then clicking Privacy & Security in the sidebar.

Installation Steps

Creating a Sandbox EKS Cluster and Deploying the Management Server

1. Create a Standalone Stack

Navigate to the directory where x-install is downloaded and use the following command to create a standalone stack, customizing the cluster name, VPC CIDR, SSH key pair, and region to suit your environment:

BASH
x-install create-standalone \
  --cluster=xio-standalone \
  --vpc-cidr=10.0.0.0/16 \
  --ssh-key-pair-name=my-dev-key \
  --region=us-east-2
  • The new VPC and EKS cluster will inherit the stack name.

  • The VPC will be assigned the CIDR block 10.0.0.0/16.

  • The EC2 SSH key pair, my-dev-key, will be used to access the Exostellar Management Server.

By default, x-install auto-detects the latest Management Server AMI in the region within the AWS account. To specify a version or custom AMI ID, use --mgmt-server-ami-id:

BASH
x-install create-standalone \
  --cluster=xio-standalone \
  --vpc-cidr=10.0.0.0/16 \
  --ssh-key-pair-name=my-dev-key \
  --region=us-east-2 \
  --mgmt-server-ami-id=ami-053b51fb9abf27xxx

2. Verify Post-Installation Readiness

After the standalone stack is successfully created, use the following command to check if the stack is ready:

BASH
x-install post-install --cluster=xio-standalone --ssh-private-key-file=my-dev-key.pem --ssh-username=rocky

It might take a few attempts for post-install to pass all system units and containers readiness checks, due to infrastructure readiness latency.

Deploying the Management Server into an Existing EKS Cluster

1. Add Necessary IAM Permissions

Ensure all required IAM resources are present by running:

BASH
x-install apply-iam --cluster xio-standalone --region us-east-2

2. Check the Target Environment

Verify the existing EKS cluster meets installation prerequisites:

BASH
x-install precheck --cluster xio-standalone --ssh-key-pair-name=my-dev-key.pem

3. Install the Management Server

Deploy the Management Server into the existing EKS Cluster:

BASH
x-install apply --cluster xio-standalone

4. Integrate the Management Server with the Existing EKS Cluster

Run the following command to complete the integration:

BASH
x-install eksconfig --cluster xio-standalone

To update the integration configurations:

BASH
x-install eksconfig --cluster xio-standalone --override-existing-params

Adding X-Compute Nodes to the EKS Cluster via eks-node-cli

1. Access the Management Server

SSH into the Exostellar Management Server using:

BASH
ssh -i "my-dev-key.pem" rocky@<management-server-public-ip>

2. Add a New Node

Run this command on the server to add a new node to the EKS cluster:

BASH
eks-node-cli add -n node-00 -c 1 -m 4096 -p pool-a -r az1 -k xio-standalone

The new node can be verified using the kubectl command:

CODE
kubectl get node -l eks.amazonaws.com/nodegroup=x-compute

The output should display the new nodes as ready:

CODE
NAME                                          STATUS   ROLES    AGE     VERSION
ip-10-0-39-220.us-west-1.x-compute.internal   Ready    <none>   4m17s   v1.29.3-eks-ae9a62a

Please ensure ~/.kube/config is set up properly. It takes a couple of minutes for the x-compute node to boot and show up.

By default, the EKS token used to access the standalone EKS cluster expired after 60 minutes. Following that, all attempts to access the cluster will fail with Unauthorized errors.

To generate a new EKS token and use it with your existing kubeconfig file, run:

BASH
x-install update-kubeconfig --cluster=xio-standalone

Adding X-Compute Nodes to the EKS Cluster via Exostellar Karpenter

Reference deployment example:

BASH
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:
      - key: "exokarpenter.sh/x-compute"
        operator: "Exists"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: exokarpenter.sh/nodepool
                operator: In
                values:
                - pool-a
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
            requests:
              cpu: 1
EOF

Cleaning Up

The entire standalone stack can be deleted with the destroy command:

BASH
x-install destroy --cluster=xio-standalone

In some cases, Terraform might time out during the destroy process. If this happens, simply re-run the command to allow Terraform to reconcile its final state.

At this time, all controllers and workers EC2 instances need to be manually terminated.

Additional Help and Support

To explore other subcommands, use the following command for a list of available options:

CODE
x-install --help

If you encounter any issues, please take a screenshot of your x-install output and download your ~/.xio/ folder. Then, submit both to Exostellar Customer Support for further assistance.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.