Skip to main content
Version: 3.1.0

Voiceprint Comparison Helm Chart

Version: 1.1.0-helm Type: application AppVersion: 1.1.0

Phonexia Voiceprint Comparison microservice

Maintainers​

NameEmailUrl
Phonexiasupport@phonexia.comhttps://www.phonexia.com

Helm: >= 3.2.0

Values​

KeyTypeDefaultDescription
affinityobject{}Affinity for pod assignment
annotationsobject{}
config.license.useSecretboolfalseGet license from a secret object
config.license.valuestring"invalidLicenseKey"License key
config.listeningAddressstring"[::]"Override address where the server will listen
config.logLevelstringinfoOverride log level. Supported values: error, warning, info, debug, trace
config.model.filestring""Name of a model file inside the volume, for example "xl-5.0.0.model"
config.model.volumeobject{}Volume with the Phonexia model
config.portint8080Port where the service will listen. The value must be the same as service.port
fullnameOverridestring""String to fully override the voiceprint-comparison.fullname template
image.pullPolicystring"IfNotPresent"Image pull policy
image.registrystring"registry.cloud.phonexia.com"Image registry
image.repositorystring"phonexia/dev/technologies/microservices/voiceprint-comparison"Image repository
image.tagstringappVersion specified in Chart.yamlSee voiceprint-comparison on Docker Hub for available tags
imagePullSecretslist[]Specify Docker registry secret names as an array
ingress.annotationsobject{}Additional annotations for the Ingress resource
ingress.classNamestring""Set the ingressClassName on the ingress record for k8s 1.18+
ingress.enabledboolfalseEnable ingress record generation
ingress.hosts[0]object{"host":"voiceprint-comparison.example.com","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}Default host for the ingress resource
ingress.hosts[0].paths[0].pathTypestring"ImplementationSpecific"Ingress path type
ingress.tlslist[]TLS configuration for the ingress
initContainerslist[]Init containers evaluated as a template
nameOverridestring""String to partially override the voiceprint-comparison.fullname template (will maintain the release name)
nodeSelectorobject{}Node labels for pod assignment
podAnnotationsobject{}Annotations for pods
podSecurityContextobject{}Security context for pods
replicaCountint1Number of replicas to deploy
resourcesobject{}Resource limits/requests for the voiceprint-comparison container
securityContextobject{}Security context for the voiceprint-comparison container
service.clusterIPstring""Use None to create a headless service
service.portint8080Service port. The port must be the same as config.port
service.typestring"ClusterIP"Service type
serviceAccount.annotationsobject{}Annotations to add to the service account
serviceAccount.createbooltrueSpecifies whether a service account should be created
serviceAccount.namestring""The name of the service account to use. If not set and create is true, a name is generated using the fullname template
tolerationslist[]Tolerations for pod assignment

Installation​

To successfully install the chart, you have to obtain a license and model at first. The service is unable to start without the model and/or license. Feel free to contact phonexia support to obtain model and license for evaluation purposes.

Model​

There are 2 ways how to pass a model to pods:

  • Pass the model via initContainer
  • Pass the model via volume

Pass the model via initContainer​

With this approach, no persistent volume is needed. An InitContainer is added to the pod instead. It downloads the model from a specified location to ephemeral volume, which is shared with main container. This happens each time the pod is re-deployed.

In the values file it looks like:

# Set config.model.volume to emptyDir
config:
model:
volume:
emptyDir: {}
file: "xl-5.0.0.model"

initContainers:
- name: init-copy-model
image: alpine
command:
- sh
- -c
- |
set -e

# Install aws-cli package
apk add --no-cache aws-cli

# Create directory for models
mkdir -p /models

# Download model from s3 and store it to volume
aws s3 cp s3://some-bucket/some-path-to-model/xl-5.0.0.model ${PHX_MODEL_PATH}
env:
# PHX_MODEL_PATH variable must be same as in main container
- name: "PHX_MODEL_PATH"
value: "/models/{{ .Values.config.model.file }}"
# Set AWS_* variables to make aws cli work
- name: "AWS_DEFAULT_REGION"
value: "us-east-1"
- name: "AWS_ACCESS_KEY_ID"
value: "AKAI...CN"
- name: "AWS_SECRET_ACCESS_KEY"
value: "0lW...Yw"
# Mount empty volume to initContainer
volumeMounts:
- name: '{{ include "voiceprint-comparison.fullname" . }}-models-volume'
mountPath: /models

Pass the model via volume​

With this approach you need to create a persistent volume, copy the model there, and mount it to the pod.

The following example shows how to do it in EKS with EBS-based dynamic provisioning.

  1. Create persistentVolumeClaim
# filename: voiceprint-comparison.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: voiceprint-comparison
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ebs-sc

and apply it

kubectl apply -f voiceprint-comparison.yaml
  1. Create a job that downloads the model to a persistent volume:
# filename: job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: voiceprint-comparison-download-model
spec:
template:
spec:
containers:
- name: download-model
image: alpine
command:
- sh
- -c
- |
set -e

# Install aws-cli package
apk add --no-cache aws-cli

# Create directory for models
mkdir -p /models

# Download model from s3 and store it to volume
aws s3 cp s3://some-bucket/some-path-to-model/xl-5.0.0.model ${PHX_MODEL_PATH}
env:
# PHX_MODEL_PATH variable must be same as .Values.config.model.file in values files
- name: "PHX_MODEL_PATH"
value: "/models/xl-5.0.0.model"
# Set AWS_* variables to make aws cli work
- name: "AWS_DEFAULT_REGION"
value: "us-east-1"
- name: "AWS_ACCESS_KEY_ID"
value: "AKAI...CN"
- name: "AWS_SECRET_ACCESS_KEY"
value: "0lW...Yw"
volumeMounts:
- name: persistent-storage
mountPath: /models
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: voiceprint-comparison
restartPolicy: Never
backoffLimit: 3

Apply it and wait until the job is finished:

kubectl apply -f job.yaml
  1. Configure values file to use existing PVC:
config:
model:
# Volume with Phonexia model
volume:
persistentVolumeClaim:
claimName: voiceprint-comparison

# Name of a model file inside the volume, for example "xl-5.0.0.model"
file: "xl-5.0.0.model"

License​

There are 2 ways to pass the license key to the chart:

  • Pass the license key directly into the values files
  • Pass the license key via Kubernetes secret

Pass the license key directly into values files​

Use config.license.value to set license key in values file:

config:
license:
useSecret: false
value: "<license_key>"

Replace <license_key> with the actual license key, which is a long string, something like eyJ...ifQ==.

Pass the license key via Kubernetes secret​

Create kubernetes secret at first:

kubectl --namespace <my-namespace> create secret generic <my-secret> --from-literal=license=<license_key>

where <my-namespace> is the namespace where you plan to install the chart, my-secret is name of the secret to be created and <license_key> is actual license key.

In the end it should look like:

kubectl --namespace my-namespace create secret generic my-secret --from-literal=license=eyJ...ifQ==

Reference the secret in the values file:

config:
license:
useSecret: true
secret: "my-secret"
key: "license"

Installing the Chart​

When you have configured the model and license, you can proceed with the installation itself. To install the chart with the release name my-release:

helm install my-release oci://registry-1.docker.io/phonexia/voiceprint-comparison

This command deploys voiceprint-comparison on the Kubernetes cluster in the default configuration.

Use --version parameter to install specific version:

helm install my-release oci://registry-1.docker.io/phonexia/voiceprint-comparison --version 1.0.0-helm

Exposing the service​

To expose the service outside of the Kubernetes cluster follow Using a Service to Expose Your App.

Ingress​

The service is using GRPC protocol which can be exposed by some ingress controllers. For example, the nginx-ingress controller supports this. To expose the voiceprint-comparison service via ingress use the following configuration:

ingress:
# Deploy ingress object
enabled: true
# Ingress class name
className: "nginx"
annotations:
# Force redirect to SSL
nginx.ingress.kubernetes.io/ssl-redirect: "true"

# Tell nginx that backend service use GRPC
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
hosts:
# Hostnames
- host: voiceprint-comparison.example.com
paths:
- path: /
pathType: ImplementationSpecific
# Use tls
tls:
# Secret containing TLS certificate
- secretName: voiceprint-comparison-tls
# TLS hostnames
hosts:
- voiceprint-comparison.example.com

Use grpcurl to check if everything works as expected. Output of the following command

$ grpcurl --insecure voiceprint-comparison.example.com:443 grpc.health.v1.Health/Check

should be

{
"status": "SERVING"
}

Uninstalling the Chart​

To uninstall/delete the my-release release:

helm delete my-release

The command removes all the Kubernetes components associated with the chart and deletes the release.