_generate_kind_port_mappings now reads ports from compose services and
adds them to Kind's extraPortMappings with correct protocol handling
(TCP/UDP). Previously only port 80 for the ingress controller was mapped,
so application ports like Solana gossip/RPC were unreachable from the host.
Also adds hostNetwork support: when any compose service declares
network_mode: host, the K8s pod spec gets hostNetwork: true and
dnsPolicy: ClusterFirstWithHostNet. Required for workloads like Solana
validators that need direct host networking for UDP gossip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
In kind, when we bind-mount a host directory it is first mounted into the kind container at /mnt, then into the pod at the desired location.
We accidentally picked this up for full-blown k8s, and were creating volumes at /mnt. This changes the behavior for both kind and regular k8s so that bind mounts are only allowed if a fully-qualified path is specified. If no path is specified at all, a default storageClass is assumed to be present, and the volume managed by a provisioner.
Eg, for kind, the default provisioner is: https://github.com/rancher/local-path-provisioner
```
stack: test
deploy-to: k8s-kind
config:
test-variable-1: test-value-1
network:
ports:
test:
- '80'
volumes:
# this will be bind-mounted to a host-path
test-data-bind: /srv/data
# this will be managed by the k8s node
test-data-auto:
configmaps:
test-config: ./configmap/test-config
```
Reviewed-on: #741
Co-authored-by: Thomas E Lackey <telackey@bozemanpass.com>
Co-committed-by: Thomas E Lackey <telackey@bozemanpass.com>