Air-gapped deployment
The standard deployment cannot be used in air-gapped environments, because it downloads the distribution with the AWS CLI and pulls the container images from the Axiomatics registry.
For air-gapped environments, you download the Authorization Hub distribution and pull the container images on a machine that has internet access, and then transfer them into your environment. You push the images to your own container registry and install the Helm chart from that registry. No component needs internet access after the files are transferred.
The procedure involves two machines:
- Transfer machine: Has internet access. It is used only to download the distribution, pull the container images, and move the files into your environment, for example on removable media.
- Air-gapped machine: Has no internet access. It has access to your container registry and the Kubernetes cluster, and is used for all remaining steps.
Prerequisites
Before you begin, ensure the prerequisites listed at the beginning of the Deployment page are met, with the following differences.
-
Private container registry
A registry that the cluster nodes and the air-gapped machine can reach. It must be able to store images that are referenced by digest, which any registry that supports the Docker Registry HTTP API V2 does. Allow enough storage for the nine images listed in Container images. If your registry uses a certificate from an internal CA, or plain HTTP, configure the cluster nodes to trust it. Configure the Docker daemon on the air-gapped machine in the same way before step 4, because that step runs
docker pushfrom that machine. To do so, install the CA certificate, or, for plain HTTP, add the registry toinsecure-registriesindaemon.json. -
Docker
Installed on both machines. The transfer machine uses it to pull and save the images. The air-gapped machine uses it to load the images and push them to your registry.
-
AWS CLI and Axiomatics credentials
Installed and configured on the transfer machine only, as described in the Preparation section. They are not needed on the air-gapped machine.
-
Command-line tools
On Linux and macOS,
unzipandsha256sum. On macOS, useshasum -a 256in place ofsha256sum. On Windows, Windows PowerShell 5.1 or later is used and no additional tools are needed. The commands on Windows usecurl.exe, which is part of Windows 10 and later. Do not usecurlin Windows PowerShell 5.1, because it is an alias ofInvoke-WebRequest. -
Correct system clock
The date of the machines that run Authorization Hub must be correct. A machine that has never been online can have a wrong clock, which causes license validation to fail.
What you need from Axiomatics
The distribution and the container images are the same as for the standard deployment. Contact Axiomatics Customer SupportOpens in a new tab to obtain the following.
- The Access key ID and Secret access key for the Axiomatics AWS account. They give access to the distribution and to the Amazon ECR registry. Read the Preparation section for details.
- The license file,
axiomatics_HUB.license.
The distribution, hub-<version>.zip, contains the Helm chart in kubernetes/charts/hub. It does not include the license or the container images.
Container images
Authorization Hub uses the following images. The tags are those of version 26.2.0.
| Image | Tag | Source | Required |
|---|---|---|---|
hub-frontend | 1.5.2 | Amazon ECR | Yes |
hub-keycloak | 1.3.3 | Amazon ECR | Yes |
hub-service | 1.3.2 | Amazon ECR | Yes |
hub-service-aggregator | 3.34.1 | Amazon ECR | Yes |
adm | 1.5.1 | Amazon ECR | Yes |
console-api-gateway | 2.4.2 | Amazon ECR | Yes |
redis | 8.8-alpine | Docker Hub | Yes |
hub-ai-service | 1.0.0 | Amazon ECR | Only to use the AI assistant, which is disabled by default |
postgres | 17.6 | Docker Hub | Only if you deploy the local database instead of using an external one |
The Helm chart references the Authorization Hub images by digest. Each tag in the table corresponds to the digest that the chart requires. You verify this in step 6.
The Redis and PostgreSQL images are public tags and can change over time. The chart references them by tag, so step 6 cannot check them. Step 2 records the digests of the images you ship. Keep them with the archive.
Deployment
Replace all $CHANGE_ME placeholders in the commands below with your actual values before running them.
Step 1: Download the distribution
On the transfer machine, follow steps 1 to 3 of the Preparation section to configure the AWS CLI, download the distribution, and log in to the Amazon ECR registry.
Then download the checksum of the distribution and verify it.
aws s3api get-object --bucket axiomatics-customer-artifacts --key releases/com/axiomatics/hub/26.2.0/hub-26.2.0.zip.sha256 hub-26.2.0.zip.sha256
- Linux/macOS
- Windows (PowerShell)
echo "$(cut -d' ' -f1 hub-26.2.0.zip.sha256) hub-26.2.0.zip" | sha256sum -c -
The output must be hub-26.2.0.zip: OK.
$expected = (Get-Content .\hub-26.2.0.zip.sha256).Trim().Split(" ")[0].ToLower()
$actual = (Get-FileHash .\hub-26.2.0.zip -Algorithm SHA256).Hash.ToLower()
if ($expected -eq $actual) { "SHA256 OK $actual" } else { "SHA256 MISMATCH expected $expected got $actual" }
The output must start with SHA256 OK.
If the checksums do not match, download the distribution again.
Step 2: Pull and save the images
On the transfer machine, pull the images from Container images, tag them for your registry, and save them to a single archive. $REGISTRY is the hostname of your registry, optionally followed by a path, without a trailing slash. For example, registry.example.com/hub.
The axiomatics/ path of the Amazon ECR images is not kept.
Omit hub-ai-service and postgres from the lists if you do not need them.
- Linux/macOS
- Windows (PowerShell)
export REGISTRY=$CHANGE_ME
ECR=748131003707.dkr.ecr.eu-central-1.amazonaws.com/axiomatics
AXIOMATICS_IMAGES="hub-frontend:1.5.2 hub-keycloak:1.3.3 hub-service:1.3.2 hub-service-aggregator:3.34.1 adm:1.5.1 console-api-gateway:2.4.2 hub-ai-service:1.0.0"
THIRD_PARTY_IMAGES="redis:8.8-alpine postgres:17.6"
for i in $AXIOMATICS_IMAGES; do
docker pull --platform linux/amd64 "$ECR/$i"
docker tag "$ECR/$i" "$REGISTRY/$i"
done
for i in $THIRD_PARTY_IMAGES; do
docker pull --platform linux/amd64 "$i"
docker tag "$i" "$REGISTRY/$i"
done
$REGISTRY = '$CHANGE_ME'
$ECR = "748131003707.dkr.ecr.eu-central-1.amazonaws.com/axiomatics"
$AxiomaticsImages = "hub-frontend:1.5.2", "hub-keycloak:1.3.3", "hub-service:1.3.2", "hub-service-aggregator:3.34.1", "adm:1.5.1", "console-api-gateway:2.4.2", "hub-ai-service:1.0.0"
$ThirdPartyImages = "redis:8.8-alpine", "postgres:17.6"
foreach ($i in $AxiomaticsImages) {
docker pull --platform linux/amd64 "$ECR/$i"
docker tag "$ECR/$i" "$REGISTRY/$i"
}
foreach ($i in $ThirdPartyImages) {
docker pull --platform linux/amd64 $i
docker tag $i "$REGISTRY/$i"
}
The --platform linux/amd64 option pulls the images for x86-64 cluster nodes. Replace it if your nodes use a different architecture.
Check the pulled images before you save the archive. Extract the distribution from step 1 on this machine, in the same shell session, and compare the digest of every Authorization Hub image that you pulled with the digests that the chart requires. This finds a moved tag or a wrong image now, instead of after the transfer.
- Linux/macOS
- Windows (PowerShell)
unzip hub-26.2.0.zip
for i in $AXIOMATICS_IMAGES; do
pulled=$(docker inspect --format '{{index .RepoDigests 0}}' "$ECR/$i" | sed 's/.*@//')
grep -qF "$pulled" hub-26.2.0/kubernetes/charts/hub/values.yaml && echo "MATCH $i" || echo "DIFFERS $i"
done
Expand-Archive .\hub-26.2.0.zip -DestinationPath .
foreach ($i in $AxiomaticsImages) {
$d = (docker inspect --format '{{index .RepoDigests 0}}' "$ECR/$i").Split('@')[1]
if (Select-String -Path .\hub-26.2.0\kubernetes\charts\hub\values.yaml -Pattern $d -SimpleMatch -Quiet) { "MATCH $i" } else { "DIFFERS $i" }
}
Every image must be reported as MATCH. If an image is reported as DIFFERS, do not save the archive. Pull the image again, and if it still differs, contact Axiomatics Customer SupportOpens in a new tab.
Record the digests of the third-party images that you are shipping, and keep them with the archive. The Redis and PostgreSQL tags can change, as described in Container images. Docker Hub also limits anonymous pulls. If a pull is refused, wait, or log in to Docker Hub on the transfer machine.
docker inspect --format '{{index .RepoDigests 0}}' redis:8.8-alpine postgres:17.6
Save the images to a single archive.
- Linux/macOS
- Windows (PowerShell)
docker save -o hub-images.tar $(for i in $AXIOMATICS_IMAGES $THIRD_PARTY_IMAGES; do echo "$REGISTRY/$i"; done)
docker save -o hub-images.tar ($AxiomaticsImages + $ThirdPartyImages | ForEach-Object { "$REGISTRY/$_" })
Step 3: Transfer the files
-
On the transfer machine, put the following files into one directory.
hub-26.2.0.ziphub-images.taraxiomatics_HUB.license
Plan the space:
hub-images.taris approximately 1.6 GB with a current Docker that uses the containerd image store. With the classic image store,docker savewrites uncompressed layers and the archive can be several times larger. Ensure that the transfer medium and both machines have enough free disk space. -
Create a checksum for each file.
- Linux/macOS
- Windows (PowerShell)
sha256sum hub-26.2.0.zip hub-images.tar axiomatics_HUB.license > SHA256SUMS.txt$lines = Get-ChildItem hub-26.2.0.zip, hub-images.tar, axiomatics_HUB.license | ForEach-Object { "$((Get-FileHash -Algorithm SHA256 -LiteralPath $_.FullName).Hash.ToLower()) $($_.Name)" }($lines -join "`n") + "`n" | Set-Content -NoNewline -Encoding ascii SHA256SUMS.txt -
Copy the three files and
SHA256SUMS.txtto the air-gapped machine, and run the following commands from the directory that contains them. This verifies that the files were not damaged during the transfer.- Linux/macOS
- Windows (PowerShell)
sha256sum -c SHA256SUMS.txtEvery line must end with
OK.$bad = 0; $n = 0Get-Content .\SHA256SUMS.txt | ForEach-Object { $h, $f = $_ -split ' ', 2; $n++; if ((Get-FileHash -Algorithm SHA256 -LiteralPath $f).Hash.ToLower() -ne $h) { "FAIL $f"; $bad++ } }"checked: $n failed: $bad"The output must end with
failed: 0.If a file fails the check, copy it again from the transfer machine.
-
Extract the distribution on the air-gapped machine.
- Linux/macOS
- Windows (PowerShell)
unzip hub-26.2.0.zipExpand-Archive .\hub-26.2.0.zip -DestinationPath .The Helm chart is in
hub-26.2.0/kubernetes/charts/hub. In the remaining steps,kubernetes/chartsis the directory that contains thehubdirectory.
Step 4: Load the images and push them to your registry
On the air-gapped machine, load the images into Docker and push them to your registry. Run the commands from the directory that contains hub-images.tar. Use the same $REGISTRY value as in step 2.
If your registry requires authentication, run docker login first.
- Linux/macOS
- Windows (PowerShell)
export REGISTRY=$CHANGE_ME
docker load -i hub-images.tar
docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -F "$REGISTRY/" | xargs -n 1 docker push
$REGISTRY = '$CHANGE_ME'
docker load -i .\hub-images.tar
docker image ls --format "{{.Repository}}:{{.Tag}}" | Where-Object { $_.StartsWith("$REGISTRY/") } | ForEach-Object { docker push $_ }
Verify that all images have arrived in your registry. Under your chosen path, the list should contain the images that you pulled in step 2. For example:
- adm
- console-api-gateway
- hub-ai-service
- hub-frontend
- hub-keycloak
- hub-service
- hub-service-aggregator
- postgres
- redis
For a registry that implements the Docker Registry HTTP API V2, you can list them with the following command. Add -u <user> if the registry requires authentication.
- Linux/macOS
- Windows (PowerShell)
curl -s https://$CHANGE_ME/v2/_catalog
curl.exe -s https://$CHANGE_ME/v2/_catalog
The push command in this step pushes every local image whose name starts with $REGISTRY/. On an upgrade, older versions that are still on the machine are pushed again. Remove them first if you do not want that.
The Authorization Hub images are referenced by digest in the Helm chart. Push the images as they are, and do not rebuild or convert them. If you copy the images with another tool, use a method that preserves their digests. You verify this in step 6.
Step 5: Configure the Helm chart
-
Copy
axiomatics_HUB.licenseinto thekubernetes/charts/hub/configurationsdirectory. The chart reads the license when Helm renders it, so this must be done before the next step. -
Create a file named
values-airgap.yamlinkubernetes/charts, outside the chart directory, with the location of your images. Use the same file for every installation and upgrade.hubHostname: "$CHANGE_ME"registry: "$CHANGE_ME/"services:redis:image:repository: "$CHANGE_ME/redis"postgres:image:repository: "$CHANGE_ME/postgres"hubHostname: the DNS name users use to access Authorization Hub.registry: the same value as$REGISTRYin step 2, with a trailing slash. The chart adds it as a prefix to the name of each Authorization Hub image, including the AI assistant image, so without the trailing slash the image names are invalid.services.redis.image.repositoryandservices.postgres.image.repository: the same value as$REGISTRY, followed by/redisand/postgres. Redis and PostgreSQL do not use theregistryvalue, so both must be overridden. Redis is always deployed, so without this override the installation fails. Thepostgresvalue is used only when you deploy the local database. Read step 7.
warningOrder of the values files. The local database file,
hub/values-local-database.yaml, sets the PostgreSQL image to the publicpostgresimage. Pass it beforevalues-airgap.yamlin everyhelm install,helm upgrade, andhelm templatecommand. The last file wins, so if the local database file comes aftervalues-airgap.yaml, it silently replaces your registry value, and the PostgreSQL pod is pulled from Docker Hub, which fails without internet access. -
If your registry requires authentication, create a secret that the cluster uses to pull the images and reference it in the file.
- Linux/macOS
- Windows (PowerShell)
kubectl create secret docker-registry regcred \--docker-server=$CHANGE_ME \--docker-username=$CHANGE_ME \--docker-password=$CHANGE_MEkubectl create secret docker-registry regcred `--docker-server=$CHANGE_ME `--docker-username=$CHANGE_ME `--docker-password=$CHANGE_MEimagePullSecrets:- name: regcredSkip this step if your registry does not require authentication.
Step 6: Verify the images
Before you install, verify that every image that the chart uses is taken from your registry, and that your registry holds the digests that the chart requires. Run the commands from the kubernetes/charts directory, which contains the hub directory and values-airgap.yaml.
-
Render the chart and list the images.
- Linux/macOS
- Windows (PowerShell)
helm template hub hub -f hub/values.yaml -f values-airgap.yaml | grep "image:" | sort -uhelm template hub .\hub -f .\hub\values.yaml -f .\values-airgap.yaml | Select-String "image:" | ForEach-Object { $_.Line.Trim() } | Sort-Object -UniqueIf you deploy the local database, add
-f hub/values-local-database.yamlbetween-f hub/values.yamland-f values-airgap.yaml(on Windows,-f .\hub\values-local-database.yaml) in thehelm templatecommands of this step, exactly as in step 7. Without it, the render shows no PostgreSQL image, and a missing or overridden PostgreSQL value is not detected.Every line must refer to your registry. The Authorization Hub images are referenced by
@sha256digest, and the Redis and PostgreSQL images by tag. A line that refers todocker.io, to the Amazon ECR registry, or to an unqualifiedredisorpostgresimage means that a value is missing fromvalues-airgap.yaml. Correct it before you continue.noteIf this command reports a license error, the license file was not copied to
hub/configurations. -
Check that your registry holds each digest.
- Linux/macOS
- Windows (PowerShell)
ACCEPT="application/vnd.docker.distribution.manifest.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.index.v1+json"helm template hub hub -f hub/values.yaml -f values-airgap.yaml \| grep "image:" | grep -oE '[^"[:space:]]+@sha256:[0-9a-f]{64}' | sort -u \| while read -r ref; dorepo="${ref%@*}"; digest="${ref#*@}"if curl -fsSI -H "Accept: $ACCEPT" "https://${repo%%/*}/v2/${repo#*/}/manifests/${digest}" > /dev/null; thenecho "FOUND $ref"elseecho "MISSING $ref"fidoneTo use a registry over plain HTTP, replace
https://withhttp://. If your registry requires authentication, add-u <user>to thecurlcommand.$acc = "application/vnd.docker.distribution.manifest.v2+json, application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.oci.image.manifest.v1+json, application/vnd.oci.image.index.v1+json"$refs = helm template hub .\hub -f .\hub\values.yaml -f .\values-airgap.yaml | Select-String -Pattern 'image:\s*"?([^"\s@]+)@(sha256:[0-9a-f]+)' -AllMatches |ForEach-Object { $_.Matches } | ForEach-Object { "$($_.Groups[1].Value)@$($_.Groups[2].Value)" } | Sort-Object -Uniqueforeach ($r in $refs) {$repo, $dig = $r -split '@'$hostName = $repo.Split('/')[0]$path = $repo.Substring($repo.IndexOf('/') + 1)try {Invoke-WebRequest -UseBasicParsing -Method Head -Headers @{Accept=$acc} -Uri "https://$hostName/v2/$path/manifests/$dig" | Out-Null"FOUND $r"} catch { "MISSING $r" }}To use a registry over plain HTTP, replace
https://withhttp://.Every digest must be reported as
FOUND. The Authorization Hub images that are disabled by default, such ashub-ai-service, are not listed.If a digest is reported as
MISSING, first confirm that the registry is reachable and that you are authorized to read from it, because an unreachable registry also reportsMISSING. If the registry is reachable, the images in the registry do not have the digests that the chart requires. This can happen if an image was pushed under a different digest, or if a tag in Container images does not match the chart. Do not install, and do not change the chart to use tags instead. Contact Axiomatics Customer SupportOpens in a new tab and provide the output of the check.
Step 7: Create the secrets and install
-
Create the secrets that Authorization Hub requires following steps 3 (Keycloak secret) to 7 (Redis secret) of the Deployment section. Skip step 4, because email notifications are not supported in air-gapped environments. In other words, create the secrets
keycloak,db-connection,principal, andredis.If your registry requires authentication, do not create the ECR pull secret (step 2). Use the
regcredsecret from step 5 of this page instead. -
Install the Helm chart from the
kubernetes/chartsdirectory.- Linux/macOS
- Windows (PowerShell)
helm install hub \-f hub/values.yaml \-f values-airgap.yaml \hubhelm install hub `-f hub/values.yaml `-f values-airgap.yaml `hubIf you don't have an external database, add
-f hub/values-local-database.yamlbefore the-f values-airgap.yamlline to deploy a PostgreSQL pod automatically. The order matters, as described in step 5.- Linux/macOS
- Windows (PowerShell)
helm install hub \-f hub/values.yaml \-f hub/values-local-database.yaml \-f values-airgap.yaml \hubhelm install hub `-f hub/values.yaml `-f hub/values-local-database.yaml `-f values-airgap.yaml `hub -
Wait for the pods to become ready.
kubectl wait --for=condition=ready pod --all --timeout=900skubectl get podsAll pods must be
Running:admapi-gatewayfrontendhubkeycloakservice-aggregator- the three
redispods postgresif you deployed the local database
noteThe
hubandadmpods may restart once or twice during the first minutes, because they start before the database accepts connections. This is expected. A pod that keeps restarting requires investigation.If a pod is in the
ImagePullBackOffstate, runkubectl describe pod <pod-name>. The Events section names the image reference that cannot be pulled. Compare it with the images in your registry. -
Expose Authorization Hub.
Read the Cloud deployment section for the ingress requirements, or use a local test deployment. Authorization Hub is then available at
hubHostname.
Considerations for air-gapped environments
-
TLS certificates
Certificates that are issued by public authorities, such as Let's Encrypt, and cloud-managed certificates cannot be used without internet access. Use a certificate that your internal certificate authority has issued for the Authorization Hub hostname, and make sure that browsers and the services that connect to Authorization Hub trust that authority.
-
User interface
The Authorization Hub user interface does not load resources from the internet, so users do not need internet access to sign in and work. Only the Help link, which opens docs.axiomatics.comOpens in a new tab, require internet access when they are clicked.
-
Email notifications
Email notifications are not supported in air-gapped environments. Features that depend on email, such as password reset, user invitations, and email verification, are therefore not available.
-
Attribute connectors
Attribute connectors can reach only the data sources that are accessible from your network.
-
Authentication
Configure user authentication with an identity provider that is reachable from the cluster.
AI assistant
The AI assistant is disabled by default. It requires a language model that the cluster can reach through an OpenAI-compatible API. In an air-gapped environment, this requires a model that is hosted inside your network. Read the AI assistant deployment section for the requirements.
Upgrade
To upgrade an air-gapped deployment, repeat step 1 and step 2 on the transfer machine for the new version, and then:
-
Repeat step 3 and step 4 of this page to transfer the new files and push the new images to your registry.
-
Copy your
axiomatics_HUB.licenseinto thehub/configurationsdirectory of the new chart. Copy yourvalues-airgap.yamlinto thekubernetes/chartsdirectory of the new version, next to the newhubdirectory. -
Repeat step 6 to verify the images.
-
Back up your PostgreSQL database and read the Upgrade section for the version-specific steps, such as creating new secrets. Then upgrade the Helm chart with the same
values-airgap.yamlfile.- Linux/macOS
- Windows (PowerShell)
helm upgrade hub \-f hub/values.yaml \-f values-airgap.yaml \hubhelm upgrade hub `-f hub/values.yaml `-f values-airgap.yaml `hubwarningIf you deployed the local PostgreSQL pod, which means that you installed with
-f hub/values-local-database.yaml, keep that file in every upgrade, beforevalues-airgap.yaml. Without it, the upgrade removes the database and its data. Omit the file only if you use an external database.- Linux/macOS
- Windows (PowerShell)
helm upgrade hub \-f hub/values.yaml \-f hub/values-local-database.yaml \-f values-airgap.yaml \hubhelm upgrade hub `-f hub/values.yaml `-f hub/values-local-database.yaml `-f values-airgap.yaml `hubnoteDuring the upgrade, the new PostgreSQL pod can restart once, because it starts while the old pod is still shutting down on the same volume. Wait until
kubectl get podsshows itRunningagain.
Applying a renewed license, or any other change to the chart configuration, uses the same helm upgrade command. Read the License section for details. On this page, use the command above: the commands on the License page use the Amazon ECR registry and are for the standard deployment. Add settings with --set, for example --set services.apiGateway.env.warningThresholdDays=45.
Test in a local minikube cluster
For testing purposes only, you can verify an air-gapped installation on a single machine with minikube and a local registry. The registry in this procedure stands in for your own registry.
A local cluster that is created without internet access needs the minikube node image and the Kubernetes images to be available locally. Prepare them on a machine with internet access, using the same minikube version as on the offline machine. This is not needed for a cluster that your organization already operates.
This procedure was verified with minikube v1.38.1, Kubernetes v1.35.1, and the node image kicbase:v0.0.50. Docker, minikube, kubectl, and Helm must already be installed on the air-gapped machine.
Before you begin, ensure that Docker has at least 4 CPUs and 11 GB of memory available, because the cluster in this procedure is given 10 GB. Ports 80 and 5000 must be free: port 80 is used by the minikube tunnel and port 5000 by the registry. The local test on the Deployment page uses 8 GB. This procedure needs more because it also runs the registry and the local database, and on Windows the service-aggregator needs fork: 2 in the values below.
-
On a machine with internet access, download the minikube cache and save the registry image.
minikube start --download-only --driver=docker --kubernetes-version=$CHANGE_MEdocker pull registry:2docker save registry:2 -o registry-2.tarCopy the
kicandpreloaded-tarballdirectories from the minikube cache,~/.minikube/cache(on Windows,%USERPROFILE%\.minikube\cache), together withregistry-2.tar, to the air-gapped machine. -
On the air-gapped machine, put the two cache directories into the same location, and load the images into Docker.
docker load -i registry-2.tardocker load -i <path-to>/kicbase.tar<path-to>/kicbase.taris the file in thekicdirectory of the cache. -
Create the cluster. The
--base-imageoption is required: the node image is loaded under its tag only, and minikube's default reference, which includes a digest, would make Docker try to download it. The--insecure-registryoption allows the cluster to pull from the local registry, which uses plain HTTP.- Linux/macOS
- Windows (PowerShell)
minikube start --driver=docker --kubernetes-version=$CHANGE_ME \--memory=10000 --cpus=4 \--insecure-registry="192.168.49.0/24" \--base-image=gcr.io/k8s-minikube/kicbase:$CHANGE_MEminikube start --driver=docker --kubernetes-version=$CHANGE_ME `--memory=10000 --cpus=4 `--insecure-registry="192.168.49.0/24" `--base-image=gcr.io/k8s-minikube/kicbase:$CHANGE_MEReplace the
kicbasetag with the one in the name of the file in thekicdirectory, for examplev0.0.50. Verify that the minikube network uses the subnet in--insecure-registry. If it does not, delete the cluster and start it again with that subnet.docker network inspect minikube -f "{{(index .IPAM.Config 0).Subnet}}" -
Start the registry and connect it to the cluster network.
docker run -d --name registry --restart=always -p 5000:5000 registry:2docker network connect minikube registrydocker inspect -f "{{.NetworkSettings.Networks.minikube.IPAddress}}" registryNote the IP address in the output of the last command, for example
192.168.49.3. Verify that the registry answers, both from your machine and from the cluster node. Replace<registry-ip>with the IP address.- Linux/macOS
- Windows (PowerShell)
curl http://localhost:5000/v2/_catalogminikube ssh -- curl -s http://<registry-ip>:5000/v2/_catalogcurl.exe http://localhost:5000/v2/_catalogminikube ssh -- curl -s http://<registry-ip>:5000/v2/_catalogBoth commands must return
{"repositories":[]}. If the node cannot reach the registry, the cluster cannot pull any image. The IP address can change when Docker restarts, so look it up again if it does. -
Follow step 1 to step 4, with
localhost:5000as$REGISTRY. Complete steps 1 and 2 while the machine still has internet access. Because a single machine is used, the transfer and the checksums in step 3 are not needed, but you must still extract the distribution.Before step 4, remove the images from local Docker, so that step 4 really loads them from the archive. On a single machine, the images are still there from step 2. Without this,
docker loadrestores nothing and the push sends the pulled images, so a damaged or wrong archive is not detected.- Linux/macOS
- Windows (PowerShell)
docker image ls --format '{{.Repository}}:{{.Tag}} {{.ID}}' | grep -E "^($REGISTRY|748131003707|redis|postgres)" | awk '{print $2}' | sort -u | xargs docker rmi -fdocker image ls --format "{{.Repository}}:{{.Tag}} {{.ID}}" | Select-String "^($REGISTRY|748131003707|redis|postgres)" | ForEach-Object { ($_.Line -split ' ')[1] } | Sort-Object -Unique | ForEach-Object { docker rmi -f $_ }The cluster pulls from the registry through its IP address, so use the following values in
values-airgap.yaml, andlocalhostas the hostname.hubHostname: "localhost"hubProtocol: "http"registry: "192.168.49.3:5000/"services:apiGateway:service:type: LoadBalancerserviceAggregator:env:fork: 2redis:image:repository: "192.168.49.3:5000/redis"postgres:image:repository: "192.168.49.3:5000/postgres"Replace
192.168.49.3with the IP address from the previous step. -
Continue with
Step Note 5 Skip the regcredsecret.6 The second check cannot reach the registry through the IP address from the chart. Replace the registry host in its URL with localhost:5000, and usehttp://. Include-f hub/values-local-database.yamlin the render commands, beforevalues-airgap.yaml.7 Add -f hub/values-local-database.yamlto the install command, before-f values-airgap.yaml, as shown in step 7. -
Start the minikube tunnel in a separate terminal window and keep it running.
minikube tunnelAuthorization Hub is available at
http://localhost.
Next step
Once Authorization Hub is deployed, configure user authentication before you begin inviting users. Read the User authentication section for details.