Deploying to Azure Kubernetes Service Using Azure Files
- Launch the Cluster
- Navigate to the Microsoft Azure portal in a web browser.
- Navigate to the Kubernetes services section.
- Click Add.
- On the Basics tab, specify the parameters:
- Subscription: Specify your subscription and resource group that Kubernetes will run in.
- Cluster Details: Specify a name for the cluster and the region to launch it. The Kubernetes version can remain as the default.
- Nodes:For each FME Server Core you wish to run, you need approximately 8GB of memory. For a single-Core deployment, we recommend 2 vCPUS, 8GB RAM, and 2 nodes. For a two-Core deployment, we recommend 4 vCPUs, 16GB RAM, and 3 nodes.
- For a test deployment, leave all other parameters at their default settings.
- Click Review + Create.
- After validation checks complete, review the settings, and click Create.
- Install Helm and an NGINX Ingress Controller
- Using Azure Cloud Shell, connect to the Kubernetes cluster.
- Check that Helm is installed. Run:
helm version.
If not installed, install Helm.
- Give Helm deploy permissions.
- Install the NGINX ingress controller:
- Setup Shared Storage using Azure Files
- Using Azure Cloud Shell, run:
- Create a general-purpose storage account. Using the Azure CLI, run:
- Create a storage class in Kubernetes using the new Azure Files storage account. Use vi or nano to create the following file in Azure Cloud Shell:
- Run:
- If RBAC is enabled, grant permissions to Azure Files:
- Deploy FME Server
- Add the Safe Software Helm repository:
- Get the IP address of the ingress controller:
-
Create a namespace in which to deploy. Run:
- Create a values.yaml file that will pass user-supplied parameter values into the Helm chart.
- (Optional) Update parameters in values.yaml.
- Install FME Server.
- To access FME Server after it deploys, invoke the external IP in your browser.

Note: For Microsoft Azure documentation on deploying and connecting to an AKS cluster, click here.
Note: More than one Core container requires a minimum of two nodes due to a constraint in the Helm chart that prevents Core containers residing on the same node. To ensure fault tolerance, we recommend three nodes because if a node is lost, two Cores can still run on the remaining two nodes.

Run:
kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/cloud/deploy.yaml

To deploy FME Server across multiple nodes, create a storage class that defines a shared storage volume backed by Azure Files.
az aks show --resource-group <resource_group> --name <cluster_name> --query nodeResourceGroup -o tsv
Replacing <resource_group> and <cluster_name> with what you defined when you deployed your cluster. This command provides the AKS node resource group for your cluster.
az storage account create --resource-group <node_resource_group> --name <storageaccountname> --sku Premium_LRS --kind FileStorage
Replacing <node_resource_group> with the result of the command in the previous step, and <storageaccountname> with a unique name for the storage account.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: azurefiles-fmeserver
provisioner: kubernetes.io/azure-file
parameters:
skuName: Premium_LRS
storageAccount: <storageaccountname>
mountOptions:
- uid=1363
- gid=1363
Replacing <storageaccountname> with the name you specified previously when creating the account.
kubectl apply -f <path_to_file>
Where <path_to_file> is the YAML file created above.
To see azurefiles-fmeserver in the list, run:
kubectl get sc
kubectl create clusterrolebinding add-on-cluster-vol-binder --clusterrole=cluster-admin --serviceaccount=kube-system:persistent-volume-binder

Perform the following in the Azure Cloud Shell:
helm repo add safesoftware https://safesoftware.github.io/helm-charts/
kubectl get services --namespace ingress-nginx
Note the "External IP" of the nginx-ingress-controller. This is the ingress into the cluster. In a production environment, set up a DNS that points to this IP address and use that as the hostname when deploying FME Server. In this procedure, we access FME Server directly using the IP.
kubectl create namespace <namespace_name>
For example:
kubectl create namespace fmeserver
To get the default Helm chart values file, run:
helm show values <chart>
For example:
helm show values safesoftware/fmeserver-2021.0.3
To write the values to a file:
helm show values safesoftware/fmeserver-2021.0.3 >> values.yaml
For more information on value files, see the Helm Docs.
A current list of supported parameters for FME Server can be found on GitHub.
The following are parameters you may want to change in the values.yaml file:

Parameter |
Example or Possible Value |
Description |
---|---|---|
fmeserver.image.tag | 21326 | Set to the FME Server build number you want to deploy. You must also update the FME Server version when installing the chart; for example, safesoftware/fmeserver-2021.0.3 |
fmeserver.engines[].name | “standard-group” | The name of the engine group. This can be changed, particularly if creating multiple engine groups. |
fmeserver.engines[].engines | 2 | Controls the number of engine pods to start. |
fmeserver.engines[].type | STANDARD | DYNAMIC | Controls the type of engine to start. |
deployment.hostname | Set to the IP address of the ingress controller noted previously. | |
deployment.numCores | 2 | Starts two FME Server Core pods for fault tolerance and load balancing. |
deployment.useHostnameIngress | true | false | If DNS is set up for the ingress controller, specify the DNS name for deployment.hostname and leave this parameter to true. If not, specify false. |
storage.fmeserver.class | azurefiles-fmeserver | Uses the Azure Files storage account set up previously. |
helm install <name> <chart> -f values.yaml
For example:
helm install fmeserver safesoftware/fmeserver-2021.0.3 -f values.yaml
If you make changes to the values.yaml file after FME Server is installed (such as to scale FME Server engines), use the helm upgrade command:
helm upgrade <name> <chart> -f values.yaml
For example:
helm upgrade fmeserver safesoftware/fmeserver-2021.0.3 -f values.yaml