Ingress: Improve port opening

Update nginx replica counts and rollout strategy.
What proxy-backend configmap changes and reload auto proxy nginx.
Make ingress optional.
Use <PREFIX>.<CLUSTER_NAME>.clusters.p.<DOMAIN> addresses for remote
cluster services.

Change-Id: Ideb146a8c0275822ee5cd28311c00a817f4202aa
diff --git a/apps/reload/Dockerfile b/apps/reload/Dockerfile
new file mode 100644
index 0000000..1f2e54c
--- /dev/null
+++ b/apps/reload/Dockerfile
@@ -0,0 +1,7 @@
+# FROM gcr.io/distroless/static:nonroot
+# TODO(gio): remove busybox
+FROM busybox:latest
+
+ARG TARGETARCH
+
+COPY reload_${TARGETARCH} /usr/bin/reload
diff --git a/apps/reload/Makefile b/apps/reload/Makefile
new file mode 100644
index 0000000..aeba9ff
--- /dev/null
+++ b/apps/reload/Makefile
@@ -0,0 +1,35 @@
+repo_name ?= giolekva
+podman ?= docker
+docker_flags=--provenance=false --sbom=false
+ifeq ($(podman), podman)
+manifest_dest=docker://docker.io/$(repo_name)/reload:latest
+endif
+
+clean:
+	rm -f reload
+
+build_arm64: export CGO_ENABLED=0
+build_arm64: export GO111MODULE=on
+build_arm64: export GOOS=linux
+build_arm64: export GOARCH=arm64
+build_arm64:
+	go build -o reload_arm64 *.go
+
+build_amd64: export CGO_ENABLED=0
+build_amd64: export GO111MODULE=on
+build_amd64: export GOOS=linux
+build_amd64: export GOARCH=amd64
+build_amd64:
+	go build -o reload_amd64 *.go
+
+push_arm64: clean build_arm64
+	$(podman) build --platform linux/arm64 --tag=$(repo_name)/reload:arm64 $(docker_flags) .
+	$(podman) push $(repo_name)/reload:arm64
+
+push_amd64: clean build_amd64
+	$(podman) build --platform linux/amd64 --tag=$(repo_name)/reload:amd64 $(docker_flags) .
+	$(podman) push $(repo_name)/reload:amd64
+
+push: push_arm64 push_amd64
+	$(podman) manifest create $(repo_name)/reload:latest $(repo_name)/reload:arm64 $(repo_name)/reload:amd64
+	$(podman) manifest push --purge $(repo_name)/reload:latest $(manifest_dest)
diff --git a/apps/reload/go.mod b/apps/reload/go.mod
new file mode 100644
index 0000000..a45c664
--- /dev/null
+++ b/apps/reload/go.mod
@@ -0,0 +1,3 @@
+module github.com/giolekva/pcloud/apps/reload
+
+go 1.23.1
diff --git a/apps/reload/main.go b/apps/reload/main.go
new file mode 100644
index 0000000..a06d16f
--- /dev/null
+++ b/apps/reload/main.go
@@ -0,0 +1,68 @@
+package main
+
+import (
+	"crypto/sha256"
+	"flag"
+	"fmt"
+	"io"
+	"os"
+	"syscall"
+	"time"
+)
+
+var watch = flag.String("watch", "", "Path to watch")
+var reload = flag.String("reload", "", "Path to PID file")
+
+func check(err error) {
+	if err != nil {
+		panic(err)
+	}
+}
+
+func main() {
+	flag.Parse()
+	var prev string
+	for {
+		cur := func() string {
+			inp, err := os.Open(*watch)
+			check(err)
+			defer inp.Close()
+			h := sha256.New()
+			_, err = io.Copy(h, inp)
+			check(err)
+			return string(h.Sum(nil))
+		}()
+		if prev == "" {
+			prev = cur
+			continue
+		}
+		if prev != cur {
+			prev = cur
+			fmt.Println("changed")
+			pid := func() int {
+				inp, err := os.Open(*reload)
+				// TODO(gio): check error type
+				if err != nil {
+					return -1
+				}
+				defer inp.Close()
+				var ret int
+				_, err = fmt.Fscanf(inp, "%d", &ret)
+				check(err)
+				return ret
+			}()
+			if pid != -1 {
+				p, err := os.FindProcess(pid)
+				check(err)
+				fmt.Println("found process")
+				fmt.Println("%+v\n", p)
+				// TODO(gio): take signal value from flags
+				check(p.Signal(syscall.SIGKILL))
+				fmt.Println("sent signall")
+			}
+		} else {
+			fmt.Println("no change")
+		}
+		time.Sleep(5 * time.Second)
+	}
+}