Tutorial 06
Use a local package and service-to-service dependency
Run a local reverse-proxy package and inspect its dependency on a backend service.
So far, each tutorial cluster has had one service. This tutorial adds the first service-to-service relationship.
You will run the 06-service-dep example from kix-examples: an nginx
gateway proxies to a backend echo-server. The gateway package asks Kix for a
backend dependency, then uses the backend’s public out values to build its
nginx config. You will use and inspect the local package here; the next
tutorial will spend more time on package anatomy.
Prerequisites
Section titled “Prerequisites”- Finish the basic graph and deploy loop tutorial.
- Keep the same
kix-examplescheckout and kind cluster.
This tutorial returns to a checked-in example, so you do not need to keep the files from tutorial 04 staged.
What This Example Builds
Section titled “What This Example Builds”Open:
tutorials/06-service-dep/cluster.nixtutorials/06-service-dep/reverse-proxy-package.nixThe cluster has two instances in the tutorial-06 namespace:
| Instance | Package | Job |
|---|---|---|
backend | packages.echo-server | answers HTTP with a fixed message |
gateway | local reverse-proxy-package.nix | proxies HTTP traffic to backend |
When you curl the gateway, the request path is:
localhost:8080 -> gateway pod -> backend Service -> backend podNo Ingress or LoadBalancer is involved. This is just two ClusterIP Services and one dependency edge.
Import A Local Package
Section titled “Import A Local Package”The previous tutorials used a catalog package from kixpkgs:
packages.echo-server.
This example also imports a package from the example folder:
let reverseProxyPackage = import ./reverse-proxy-package.nix;inlet ... in ... creates a local binding. Here it means: evaluate
./reverse-proxy-package.nix once, call it reverseProxyPackage, and use that
name later in the cluster definition.
This keeps cluster composition and package implementation separate:
cluster.nixsays which package instances are installed;reverse-proxy-package.nixsays how the local package builds Kubernetes resources.
Install Two Instances
Section titled “Install Two Instances”The cluster installs two package instances:
backend = { package = packages.echo-server; config = { message = "Hello from the backend!"; };};
gateway = { package = reverseProxyPackage;};The backend instance is a normal echo-server. The gateway instance uses
the local reverse-proxy package.
Notice what the gateway instance does not say: it does not include a Service
name, namespace, DNS name, or port for the backend. The package asks for a
backend dependency, and Kix resolves that request to the instance named
backend in the same namespace.
That same-namespace name match is the first dependency resolution rule you need to learn. Later tutorials will make cross-namespace dependencies explicit.
Ask For A Dependency In The Package
Section titled “Ask For A Dependency In The Package”Open tutorials/06-service-dep/reverse-proxy-package.nix. The package’s
build function receives named arguments from Kix:
build = { self, scope, kix, backend, ... }:Do not try to unpack every argument yet. The important new one is backend.
That is the dependency. Inside the package,
backend exposes an out API with values the package can use safely.
For now, treat out as the public interface another instance exposes. It gives
you names, DNS names, ports, selectors, and similar values without hardcoding
them.
Use The Backend’s out Values
Section titled “Use The Backend’s out Values”The reverse proxy writes an nginx config into a ConfigMap:
configmap = scope.mkResource { apiVersion = "v1"; kind = "ConfigMap"; inherit name; data."default.conf" = '' server { listen 80; location /healthz { default_type text/plain; return 200 'ok\n'; } location / { proxy_pass http://${backend.out.fqdn}:${backend.out.port}/; } } ''; };The important line is the proxy_pass target:
proxy_pass http://${backend.out.fqdn}:${backend.out.port}/;That line does two jobs:
- it builds a real nginx upstream URL using the backend Service DNS name and port;
- it consumes the backend’s public values instead of repeating Kubernetes names by hand.
You do not need to hand-copy the backend Service name into the gateway config. The package dependency creates the relationship; the package code reads the backend’s public interface.
Check The Example
Section titled “Check The Example”Before deploying, ask Kix to evaluate and check the cluster:
❱ kix check 06-service-dep
TOOL RESULT DETAILS
eval pass 15 manifests evaluated
scorecard pass 0 errors, 8 warnings, 1 info Deploy The Example
Section titled “Deploy The Example”Deploy the example:
❱ kix deploy 06-service-dep -y Show outputHide output · 47 lines
Building cluster '06-service-dep'...
Cluster 06-service-dep: 14 manifests
Connecting to cluster...
No previous activation on cluster. First deploy.
_cluster
~ cluster-level resources (4 added)
kube-system
+ platform-dns (0 resources)
tutorial-06
+ backend 1.27 (3 resources)
+ gateway 0.0.1 (3 resources)
Plan: cluster-level changes, 3 added
Resources: 4 real content, 0 dep-affected
plan: 14 nodes
+ Namespace/tutorial-06 created
✔ Namespace/tutorial-06 ready
~ CustomResourceDefinition/packageinstances.kix.run configured
+ ConfigMap/backend@tutorial-06 created
✔ ConfigMap/backend@tutorial-06 ready
✔ CustomResourceDefinition/packageinstances.kix.run ready
+ Deployment/backend@tutorial-06 created
~ Namespace/kube-system configured
✔ Namespace/kube-system ready
~ CustomResourceDefinition/activations.kix.run configured
~ PackageInstance/platform-dns@kube-system configured
✔ PackageInstance/platform-dns@kube-system ready
✔ CustomResourceDefinition/activations.kix.run ready
✔ Deployment/backend@tutorial-06 ready
+ Service/backend@tutorial-06 created
✔ Service/backend@tutorial-06 ready
+ ConfigMap/gateway@tutorial-06 created
✔ ConfigMap/gateway@tutorial-06 ready
+ PackageInstance/backend@tutorial-06 created
✔ PackageInstance/backend@tutorial-06 ready
+ Deployment/gateway@tutorial-06 created
✔ Deployment/gateway@tutorial-06 ready
+ Service/gateway@tutorial-06 created
✔ Service/gateway@tutorial-06 ready
+ PackageInstance/gateway@tutorial-06 created
✔ PackageInstance/gateway@tutorial-06 ready
~ Activation/06-service-dep-6jq6594w342d configured
✔ Activation/06-service-dep-6jq6594w342d ready
• activation '06-service-dep-6jq6594w342d' → Active
Deploy complete: 9 created, 5 configured, 0 unchanged, 0 failed Port-forward to the gateway:
❱ kix pf 06-service-dep gateway 8080:80 In another terminal:
❱ curl http://localhost:8080/
Hello from the backend! The response comes from the backend pod. The gateway only proxies the request.
Stop the port-forward with Ctrl-C.
Inspect The Wiring
Section titled “Inspect The Wiring”Ask Kix to show the dependency graph:
❱ kix graph 06-service-dep --format tree Show outputHide output · 69 lines
CustomResourceDefinition/activations.kix.run
└── Activation/06-service-dep-7nv3mcyd5zad
CustomResourceDefinition/packageinstances.kix.run
├── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── PackageInstance/backend@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── PackageInstance/platform-storage@kube-system (import)
│ └── Activation/06-service-dep-7nv3mcyd5zad
└── PackageInstance/platform-dns@kube-system (import)
├── Activation/06-service-dep-7nv3mcyd5zad
└── Deployment/gateway@tutorial-06
└── Service/gateway@tutorial-06
└── PackageInstance/gateway@tutorial-06
└── Activation/06-service-dep-7nv3mcyd5zad
Namespace/kube-system
├── PackageInstance/platform-storage@kube-system (import)
│ └── Activation/06-service-dep-7nv3mcyd5zad
└── PackageInstance/platform-dns@kube-system (import)
├── Activation/06-service-dep-7nv3mcyd5zad
└── Deployment/gateway@tutorial-06
└── Service/gateway@tutorial-06
└── PackageInstance/gateway@tutorial-06
└── Activation/06-service-dep-7nv3mcyd5zad
Namespace/tutorial-06
├── Service/gateway@tutorial-06
│ └── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── Service/backend@tutorial-06
│ ├── ConfigMap/gateway@tutorial-06
│ │ └── Deployment/gateway@tutorial-06
│ │ └── Service/gateway@tutorial-06
│ │ └── PackageInstance/gateway@tutorial-06
│ │ └── Activation/06-service-dep-7nv3mcyd5zad
│ └── PackageInstance/backend@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── ConfigMap/gateway@tutorial-06
│ └── Deployment/gateway@tutorial-06
│ └── Service/gateway@tutorial-06
│ └── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── ConfigMap/backend@tutorial-06
│ └── Deployment/backend@tutorial-06
│ └── Service/backend@tutorial-06
│ ├── ConfigMap/gateway@tutorial-06
│ │ └── Deployment/gateway@tutorial-06
│ │ └── Service/gateway@tutorial-06
│ │ └── PackageInstance/gateway@tutorial-06
│ │ └── Activation/06-service-dep-7nv3mcyd5zad
│ └── PackageInstance/backend@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── PackageInstance/backend@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
├── Deployment/gateway@tutorial-06
│ └── Service/gateway@tutorial-06
│ └── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
└── Deployment/backend@tutorial-06
└── Service/backend@tutorial-06
├── ConfigMap/gateway@tutorial-06
│ └── Deployment/gateway@tutorial-06
│ └── Service/gateway@tutorial-06
│ └── PackageInstance/gateway@tutorial-06
│ └── Activation/06-service-dep-7nv3mcyd5zad
└── PackageInstance/backend@tutorial-06
└── Activation/06-service-dep-7nv3mcyd5zad
15 resources, 27 dependencies Look for the gateway instance and the backend resources it depends on.
You can also render the manifests and inspect the generated nginx config:
❱ kix build 06-service-dep Show outputHide output · 429 lines
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
kix.run/identity-hash: gvrlspcfgh9a2qnsx5kqxw9f4l3x52jj
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/managed-by: kix
name: activations.kix.run
spec:
group: kix.run
names:
kind: Activation
listKind: ActivationList
plural: activations
singular: activation
scope: Cluster
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
properties:
apiVersion:
type: string
kind:
type: string
metadata:
type: object
spec:
type: object
x-kubernetes-preserve-unknown-fields: true
status:
type: object
x-kubernetes-preserve-unknown-fields: true
type: object
served: true
storage: true
subresources:
status: {}
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
kix.run/identity-hash: pk4hih6jm4yj336rlaqk2qycz2k46xvs
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/managed-by: kix
name: packageinstances.kix.run
spec:
group: kix.run
names:
kind: PackageInstance
listKind: PackageInstanceList
plural: packageinstances
singular: packageinstance
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
properties:
apiVersion:
type: string
kind:
type: string
metadata:
type: object
spec:
type: object
x-kubernetes-preserve-unknown-fields: true
status:
type: object
x-kubernetes-preserve-unknown-fields: true
type: object
served: true
storage: true
subresources:
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,wlzmynapx327962105rsvvnmaqyw2vyn'
kix.run/identity-hash: j8cml44phbwvsadkgynhg26k4cjh6z41
kix.run/package: backend
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: backend
app.kubernetes.io/managed-by: kix
app.kubernetes.io/name: backend
name: backend
namespace: tutorial-06
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/instance: backend
app.kubernetes.io/name: backend
template:
metadata:
labels:
app.kubernetes.io/instance: backend
app.kubernetes.io/name: backend
spec:
containers:
- image: docker.io/nginxinc/nginx-unprivileged:1.30.5-alpine@sha256:ed04ec1ff34502c339ee5c3ae3f855442398edc1d05591e2b98981dcbbd20b1e
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8080
periodSeconds: 10
name: nginx
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
failureThreshold: 1
httpGet:
path: /healthz
port: 8080
periodSeconds: 5
resources:
limits:
cpu: '100m'
memory: '64Mi'
requests:
cpu: '50m'
memory: '32Mi'
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
volumeMounts:
- mountPath: /etc/nginx/conf.d
name: config
readOnly: true
- mountPath: /tmp
name: tmp
terminationGracePeriodSeconds: 30
volumes:
- configMap:
name: backend
name: config
- emptyDir: {}
name: tmp
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,45s9v6ay46lbfgdqay8db07z3i35p7dm,requires:jh345cnnffy1bnj4cz5x0hwq6ibxvkkr'
kix.run/identity-hash: ny8470iq2gln3qlfk4sqi7vi9959mw1h
kix.run/package: gateway
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/managed-by: kix
app.kubernetes.io/name: gateway
name: gateway
namespace: tutorial-06
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/name: gateway
template:
metadata:
labels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/name: gateway
spec:
containers:
- image: nginx:1.27-alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: http
protocol: TCP
readinessProbe:
httpGet:
path: /healthz
port: 80
periodSeconds: 5
volumeMounts:
- mountPath: /etc/nginx/conf.d
name: config
readOnly: true
volumes:
- configMap:
name: gateway
name: config
---
apiVersion: kix.run/v1alpha1
kind: Activation
metadata:
annotations:
kix.run/built-via: /nix/store/11xam5wza95q3xbfqz4mb5drw2r9ivrl-k8s-activation-06-service-dep
kix.run/depends-on: jh345cnnffy1bnj4cz5x0hwq6ibxvkkr,qi1g33g63yg34a53ihk2p71azvjk5vrw,r5sgwjk8w3m41l0xaj0s16xxsacd0nk6,wqbjg92xkv0b7xr9bv0zwd0vqpm1wkxc,requires:gvrlspcfgh9a2qnsx5kqxw9f4l3x52jj
kix.run/identity-hash: '7nv3mcyd5zad10npxwic91x5wh9vi5cq'
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/managed-by: kix
kix.run/cluster: '06-service-dep'
name: '06-service-dep-7nv3mcyd5zad'
spec:
instances:
kube-system:
platform-dns: platform-dns
platform-storage: platform-storage
tutorial-06:
backend: backend
gateway: gateway
---
apiVersion: kix.run/v1alpha1
kind: PackageInstance
metadata:
annotations:
kix.run/depends-on: sj0fv5bs2hnh9zcqdh62ph34l2wm0b1m,requires:pk4hih6jm4yj336rlaqk2qycz2k46xvs
kix.run/identity-hash: jh345cnnffy1bnj4cz5x0hwq6ibxvkkr
kix.run/import-apiversion: apps/v1
kix.run/import-fqdn: kube-dns.kube-system.svc.cluster.local
kix.run/import-kind: Deployment
kix.run/import-name: coredns
kix.run/mode: import
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/instance: platform-dns
app.kubernetes.io/managed-by: kix
name: platform-dns
namespace: kube-system
spec:
instanceName: platform-dns
mode: import
namespaceName: kube-system
---
apiVersion: kix.run/v1alpha1
kind: PackageInstance
metadata:
annotations:
kix.run/depends-on: sj0fv5bs2hnh9zcqdh62ph34l2wm0b1m,requires:pk4hih6jm4yj336rlaqk2qycz2k46xvs
kix.run/identity-hash: r5sgwjk8w3m41l0xaj0s16xxsacd0nk6
kix.run/import-apiversion: storage.k8s.io/v1
kix.run/import-kind: StorageClass
kix.run/import-name: standard
kix.run/mode: import
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/instance: platform-storage
app.kubernetes.io/managed-by: kix
name: platform-storage
namespace: kube-system
spec:
instanceName: platform-storage
mode: import
namespaceName: kube-system
---
apiVersion: kix.run/v1alpha1
kind: PackageInstance
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,pldbj73ylma3pwnh69c1i02dkbmhqrwl,requires:pk4hih6jm4yj336rlaqk2qycz2k46xvs'
kix.run/identity-hash: qi1g33g63yg34a53ihk2p71azvjk5vrw
kix.run/package: _cluster
kix.run/package-namespace: _cluster
kix.run/root: backend
labels:
app.kubernetes.io/instance: backend
app.kubernetes.io/managed-by: kix
name: backend
namespace: tutorial-06
spec:
instanceName: backend
namespaceName: tutorial-06
version: '1.30.5'
---
apiVersion: kix.run/v1alpha1
kind: PackageInstance
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,y5zxg5jkkwxrl1jrln37hqnfywd4s9q1,requires:pk4hih6jm4yj336rlaqk2qycz2k46xvs'
kix.run/identity-hash: wqbjg92xkv0b7xr9bv0zwd0vqpm1wkxc
kix.run/package: _cluster
kix.run/package-namespace: _cluster
kix.run/root: gateway
labels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/managed-by: kix
name: gateway
namespace: tutorial-06
spec:
instanceName: gateway
namespaceName: tutorial-06
version: '0.0.1'
---
apiVersion: v1
data:
default.conf: |
server {
listen 8080;
location / {
default_type text/plain;
return 200 'Hello from the backend!\n';
}
location /healthz {
default_type text/plain;
return 200 'ok\n';
}
}
kind: ConfigMap
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc'
kix.run/identity-hash: wlzmynapx327962105rsvvnmaqyw2vyn
kix.run/package: backend
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: backend
app.kubernetes.io/managed-by: kix
name: backend
namespace: tutorial-06
---
apiVersion: v1
data:
default.conf: |
server {
listen 80;
location /healthz {
default_type text/plain;
return 200 'ok\n';
}
location / {
proxy_pass http://backend.tutorial-06.svc.cluster.local:80/;
}
}
kind: ConfigMap
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,pldbj73ylma3pwnh69c1i02dkbmhqrwl'
kix.run/identity-hash: '45s9v6ay46lbfgdqay8db07z3i35p7dm'
kix.run/package: gateway
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/managed-by: kix
name: gateway
namespace: tutorial-06
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
kix.run/identity-hash: sj0fv5bs2hnh9zcqdh62ph34l2wm0b1m
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/managed-by: kix
kubernetes.io/metadata.name: kube-system
name: kube-system
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
kix.run/identity-hash: '1wz2372bgznyyc56m28alsibkgfcq4dc'
kix.run/package: _cluster
kix.run/package-namespace: _cluster
labels:
app.kubernetes.io/managed-by: kix
kubernetes.io/metadata.name: tutorial-06
name: tutorial-06
---
apiVersion: v1
kind: Service
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,j8cml44phbwvsadkgynhg26k4cjh6z41'
kix.run/identity-hash: pldbj73ylma3pwnh69c1i02dkbmhqrwl
kix.run/package: backend
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: backend
app.kubernetes.io/managed-by: kix
name: backend
namespace: tutorial-06
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/instance: backend
app.kubernetes.io/name: backend
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
annotations:
kix.run/depends-on: '1wz2372bgznyyc56m28alsibkgfcq4dc,ny8470iq2gln3qlfk4sqi7vi9959mw1h'
kix.run/identity-hash: y5zxg5jkkwxrl1jrln37hqnfywd4s9q1
kix.run/package: gateway
kix.run/package-namespace: tutorial-06
labels:
app.kubernetes.io/instance: gateway
app.kubernetes.io/managed-by: kix
name: gateway
namespace: tutorial-06
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app.kubernetes.io/instance: gateway
app.kubernetes.io/name: gateway
type: ClusterIP In the gateway ConfigMap, the proxy_pass URL should contain the backend’s
cluster DNS name. The package code did not hardcode that name; it came from
backend.out.fqdn.
Try Breaking The Name Match
Section titled “Try Breaking The Name Match”In tutorials/06-service-dep/cluster.nix, rename the backend instance to
api:
api = { package = packages.echo-server; config = { message = "Hello from the backend!"; };};Then run:
❱ kix check 06-service-dep Show outputHide output · 24 lines
TOOL RESULT DETAILS
eval fail could not read the built resources and their dependencies: nix build failed: warning: not writing modified lock file of flake 'path:kix-examples':
• Updated input 'kixpkgs':
'git+https://github.com/kix-run/kixpkgs?ref=refs/heads/main&rev=9dcf5b3e33b728ef3fc76a693e4feda2921b1913' (2026-09-10)
→ 'path:/nix/store/y987fl3ssw1130fh2gai5n82h1167dc7-source/docs/..?lastModified=0&narHash=sha256-SBH07wTy4boKkMii0JnCl6fpORWVXKtJDZ3StdHJ%2BMY%3D' (1970-01-01)
error:
… while calling the 'derivationStrict' builtin
at <nix/derivation-internal.nix>:37:12:
36|
37| strict = derivationStrict drvAttrs;
| ^
38|
… while evaluating the derivation attribute 'name'
at /nix/store/4rg99msfmkk9gppakagpgkzcixwg7yxq-source/pkgs/stdenv/generic/make-derivation.nix:624:11:
623| derivationArg = removeAttrs attrs removedOrReplacedAttrNames // {
624| ${if (attrs ? name || (attrs ? pname && attrs ? version)) then "name" else null} =
| ^
625| let
(stack trace truncated; use '--show-trace' to show the full, detailed trace)
error: tutorial-06/gateway: dependency 'backend' was not found for namespace 'tutorial-06'. Add an instance with that name or alias, or set deps.backend explicitly.
(exit code: 1) Kix should fail because the gateway package asks for backend, but there is no
same-namespace instance with that name anymore.
Change api back to backend before continuing. Later tutorials assume this
example is back in its working state.
What You Learned
Section titled “What You Learned”You added the first real edge to the tutorial path:
- a cluster can import a local package
- an instance installs that local package just like a catalog package
- a package can ask for another instance by argument name
- Kix resolves that argument to a matching same-namespace instance
-
outlets one package use another package’s public values without hardcoded Service names
The next dependency tutorial puts the two services in different namespaces and
uses ref to make the wiring explicit.