Using a9s Search
This chapter describes how to interact with a9s Search using the Kubernetes API.
Pre-requisite
Choose your Kubernetes Environment
As a developer, you have the flexibility to choose between using an existing Kubernetes cluster or creating a new one for your testing and development needs.
If you choose to create a new cluster on your development machine, you can use kind for this purpose. Simply execute the following command:
kind create cluster --name=consumer-cluster
This cluster, referred to as the consumer cluster, does not run anything special; its true power lies in its seamless integration with a9s Data Services. Developers can effortlessly interact with the Data Services using Kubernetes Custom Resources provided by the a9s Kubernetes API.
Create Bindings to Data Services
Prior to creating new bindings, it is essential to confirm that they do not already exist. This verification process helps avoid unnecessary execution of commands. To ascertain the presence of bindings, please execute the following commands within a terminal session connected to your designated Kubernetes cluster.
kubectl get searchinstances.anynines.com
kubectl get servicebindings.anynines.com
kubectl get backups.anynines.com
kubectl get restores.anynines.com
If bindings exist you should not get the following error
error: the server doesn't have a resource type "<resource-name>"
If there are no existing bindings from the tenant cluster to a9s Data Services, you can create them by following the provided instructions.
Binding a Tenant Cluster
We use kube-bind to bind a9s Kubernetes API into tenant cluster.
In order to utilize the kubectl bind
command, you'll need to have the kubectl-bind
binary installed and properly
added to your system's path.
Download the appropriate kubectl-bind
binary for your system's architecture from the provided options:
- MacOS
- Linux
- Windows
Download links:
Open the folder to where you downloaded the file and open a terminal window
I. Create a new directory to add to your PATH environment variable
mkdir <installation-directory>/bin
II. Give the folder executable permission
chmod 755 <installation-directory>/bin
III. Copy the binary to the newly created folder
cp ./kubectl-bind <installation-directory>/bin
IV. Add the path to PATH environment variable
export PATH=$PATH:<installation-directory>/bin
V. If everything is configured correctly you should see some output when you run the following command
kubectl bind
When running the command above, you might encounter the error message:
'kubectl-bind' can't be opened because Apple cannot check it for malicious software.
To resolve this error, you can follow the instructions provided here.
Download links:
Open the folder to where you downloaded the file and open a terminal window
I. Create a new directory to add to your PATH environment variable
mkdir <installation-directory>/bin
II. Give the folder executable permission
chmod 755 <installation-directory>/bin
III. Copy the binary to the newly created folder
cp ./kubectl-bind <installation-directory>/bin
IV. Add the path to PATH environment variable
export PATH=$PATH:<installation-directory>/bin
V. If everything is configured correctly you should see some output when you run the following command
kubectl bind
Download links:
Open the folder to where you downloaded the file and open a terminal window
I. Create a directory anywhere you feel is appropriate and move the executable to that folder.
II. Copy the path of the folder containing the executable.
III. Right-click My Computer(either on the Desktop or the Start menu) and click Properties.
IV. In the System Properties dialog box, click the Advanced tab and click Environment Variables.
V. In the top list, scroll down to the PATH variable, select it, and click Edit. Click New and enter PATH for the Variable Name. In the Variable Value box, scroll to the end of the variable. If there is no semi-colon (;) at the end of the current path, add one, and then enter the path to the executable folder. Finally, click OK.
VI. If everything is configured correctly you should see some output when you run the following command
kubectl bind
Replace
<A9S-BIND-BACKEND-URL>
with the domain provided to you by the platform operators.kubectl bind http://<A9S-BIND-BACKEND-URL>:443/export --konnector-image=public.ecr.aws/w5n9a2g2/anynines/konnector:v0.4.0-pre-release3
Authenticate with provided URL using your OIDC credentials. Grant access in browser and respond
Yes
in the terminal to grant required access. Bind one at a time by usingkubectl bind
and logging into the browser.You can select the service to bind by using the web UI, as shown in the following image:
You are now all set to apply Kubernetes Custom Resources supported by the a9s Kubernetes API.
Create a Search Service Instance
To provision a Search, apply a Service Instance Claim. Before applying the Service Instance Claim, make sure to
configure the required fields: service
and plan
.
The supported values for service
and plan
can be found in the following tables:
Supported Services
Service name | Description |
---|---|
a9s-search2 | a9s Search 2 |
Supported Plans
Plan name | Description |
---|---|
search-cluster-small-ssl | A cluster of 3 nodes with small resources. |
search-cluster-medium-ssl | A cluster of 3 nodes with medium resources. |
search-cluster-big-ssl | A cluster of 3 nodes with big resources. |
search-single-nano-ssl | A single node with nano resources. |
search-single-small-ssl | A single node with small resources. |
search-single-medium-ssl | A single node with medium resources. |
search-single-big-ssl | A single node with big resources. |
Create a Search Kubernetes Object
To set up a Search Kubernetes Object, simply replace the placeholder values denoted by < >
in the provided yaml.
Kindly select one of the supported values for spec.service
and spec.plan
.
Optional: To set up a clustered Search with small specifications, apply the yaml manifest provided in the
Example
tab below. Feel free to modify the fields in order to create a Data Service tailored to your requirements.
- Template
- Example
apiVersion: anynines.com/v1
kind: SearchInstance
metadata:
name: <name>
namespace: <namespace>
spec:
service: <service-name>
plan: <plan-name>
compositionRef:
name: a9s-search
apiVersion: anynines.com/v1
kind: SearchInstance
metadata:
name: example-search-instance
namespace: default
spec:
service: a9s-search2
plan: search-cluster-small-ssl
compositionRef:
name: a9s-search
Applying this Kubernetes yaml manifest is as straightforward as working with any default Kubernetes resource.
kubectl apply -f <filename.yaml>
After applying the manifest, please allow some time for the remote resources to be deployed. If you've deployed the provided example, you should observe an output similar to the following:
kubectl get searchinstances.anynines.com
NAME SYNCED READY CONNECTION-SECRET AGE
example-search-instance True True 9m
You can also obtain additional information about the status of Search Objects using the following command:
kubectl describe searchinstances.anynines.com
Name: example-search-instance
Namespace: default
...
Status:
Conditions:
Last Transition Time: 2023-08-07T09:57:49Z
Reason: ReconcileSuccess
Status: True
Type: Synced
Last Transition Time: 2023-08-07T10:04:11Z
Reason: Available
Status: True
Type: Ready
Managed:
Conditions:
Last Transition Time: 2023-08-07T09:57:50Z
Reason: ReconcileSuccess
Status: True
Type: Synced
Last Transition Time: 2023-08-07T10:04:00Z
Reason: Available
Status: True
Type: Ready
Created At: 2023-08-07T09:57:50.556Z
Provisioned At: 2023-08-07T10:03:40.445Z
State: provisioned
Updated At: 2023-08-07T10:03:40.500Z
No Search pod is running locally in the consumer cluster.
Behind the scenes the Custom Resources synced up to the a9s Data Service platform which ensures the database is provisioned and healthy. The status information reflecting the database status synced back to the tenant cluster to signify service readiness.
Bind an Application to a Search Database
The ServiceBinding
Custom Resource is all that you need to quickly start using the database. To target a specific
Search instance, set the spec.instanceRef
field.
Optional: If you've followed the example from the previous step, where we create a Search Kubernetes Object, you can now proceed to apply the yaml manifest provided in the Example tab below. This will bind the previously created Search instance.
- Template
- Example
apiVersion: anynines.com/v1
kind: ServiceBinding
metadata:
name: <name>
namespace: <namespace>
spec:
instanceRef: <search-instance-name>
serviceInstanceType: search
compositionRef:
name: a9s-servicebinding
apiVersion: anynines.com/v1
kind: ServiceBinding
metadata:
name: sample-search-servicebinding
namespace: default
spec:
instanceRef: example-search-instance
serviceInstanceType: search
compositionRef:
name: a9s-servicebinding
After a few seconds, the ServiceBinding will be ready. You can then access the credentials and network details required
for database connectivity by describing the Secret that was automatically created. The Data Service automation generates
a Secret, named {service-binding-name}-creds
, in the same namespace as the ServiceBinding.
For instance, if you have already applied the provided examples, upon the successful deployment of the ServiceBinding, you can access credentials and network details by describing the corresponding Kubernetes Secret using the following command:
kubectl get secret sample-search-servicebinding-creds -o yaml
apiVersion: v1
data:
cacrt: <base64 encoded value>
host: <base64 encoded value>
hosts: <base64 encoded value>
password: <base64 encoded value>
port: <base64 encoded value>
scheme: <base64 encoded value>
username: <base64 encoded value>
...
Backup a Search Database
The a9s platform provides an easy way to create backups and restore if needed. You can use the Kubernetes Custom
Resource Backup
from the API group anynines.com
to create backups of Data Service Instances. To do this, simply
target the specific Data Service Instance you want to back up, as shown in the following yaml manifest:
- Template
- Example
apiVersion: anynines.com/v1
kind: Backup
metadata:
name: <name>
namespace: <namespace>
spec:
instanceRef: <search-instance-name>
serviceInstanceType: search
compositionRef:
name: a9s-backup
apiVersion: anynines.com/v1
kind: Backup
metadata:
name: backup-search-sample
namespace: default
spec:
instanceRef: example-search-instance
serviceInstanceType: search
compositionRef:
name: a9s-backup
And then apply the yaml manifest:
kubectl apply -f <filename.yaml>
You can inspect the status of the backup to determine when it is complete, similar to how we did it for the Search instance, using the following command:
kubectl get backup.anynines.com -o yaml
You can observe the status transition from queued
to done
as the backup process completes.
apiVersion: anynines.com/v1
kind: Backup
...
status:
...
managed:
...
status: queued
apiVersion: anynines.com/v1
kind: Backup
...
status:
...
managed:
...
size: 736
status: done
Restore a Search Database Backup
To restore a backup, you must apply a Restore from the API group anynines.com
, targeting an existing Search Backup.
Below is the yaml file you can utilize for this purpose:
- Template
- Example
apiVersion: anynines.com/v1
kind: Restore
metadata:
name: <name>
spec:
backupRef: <backup-name>
serviceInstanceType: search
compositionRef:
name: a9s-restore
apiVersion: anynines.com/v1
kind: Restore
metadata:
name: restore-search-sample
spec:
backupRef: backup-search-sample
serviceInstanceType: search
compositionRef:
name: a9s-restore
And then apply the yaml manifest:
kubectl apply -f <filename.yaml>
You can observe the state transition from queued
to running
and done
as the restore completes.
kubectl get restore.anynines.com -o yaml
apiVersion: v1
items:
- apiVersion: anynines.com/v1
kind: Restore
...
status:
...
managed:
...
state: queued
apiVersion: v1
items:
- apiVersion: anynines.com/v1
kind: Restore
...
status:
...
managed:
...
state: done
Delete a9s Kubernetes Custom Resources
Delete the Custom Resources using the kubectl delete
command. Replace <resource-type>
with the actual resource type
and <resource-name>
with the name of the Custom Resource you want to delete.
kubectl delete <resource-type> <resource-name>
Alternatively, you can use the following command to delete Custom Resources by specifying the filename of the yaml manifest:
kubectl delete -f <filename.yaml>
Coming soon
a9s Search offers a range of features that will soon be supported for a9s Search through Kubernetes integration. See the following table for a summary of these upcoming features.
Feature | Description |
---|---|
Metrics | Monitor, collect, and manage metrics for comprehensive insights into the service. |
Logging | Stream log data to a third-party service for centralized log management and analysis. |
Disk Usage Alerts | Create disk usage alerts to be notified when ephemeral or persistent disk usage exceeds a certain threshold. |
OpenSearch Settings Configuration | Configure advanced OpenSearch settings such as TLS protocol version, and cipher suites. |
OpenSearch plugins | Extend the functionality of a9s Search with OpenSearch plugins, such as analysis-phonetic for phonetic analysis. |
Service Migration and Management | Migrate data to another Search instance. View service listings and initiate Data Service restarts as needed. |