diff --git a/.taskfiles/Flux/Taskfile.yaml b/.taskfiles/Flux/Taskfile.yaml index 62ae2f82..99b2f3d7 100644 --- a/.taskfiles/Flux/Taskfile.yaml +++ b/.taskfiles/Flux/Taskfile.yaml @@ -18,14 +18,14 @@ tasks: - kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/{{.PROMETHEUS_OPERATOR_VERSION}}/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml - kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/{{.PROMETHEUS_OPERATOR_VERSION}}/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml - kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --kustomize {{.KUBERNETES_DIR}}/bootstrap - - cat {{.SOPS_AGE_FILE}} | kubectl -n flux-system create secret generic sops-age --from-file=age.agekey=/dev/stdin + - cat {{.SOPS_AGE_KEY_FILE}} | kubectl -n flux-system create secret generic sops-age --from-file=age.agekey=/dev/stdin - sops --decrypt {{.CLUSTER_SECRET_SOPS_FILE}} | kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename - - kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename {{.CLUSTER_SETTINGS_FILE}} - kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --kustomize {{.KUBERNETES_DIR}}/flux/config preconditions: - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - { msg: "Flux already installed", sh: "kubectl get namespace flux-system --kubeconfig {{.KUBECONFIG_FILE}} &>/dev/null && exit 1 || exit 0" } - - { msg: "Missing Sops Age key file", sh: "test -f {{.SOPS_AGE_FILE}}" } + - { msg: "Missing Sops Age key file", sh: "test -f {{.SOPS_AGE_KEY_FILE}}" } apply: desc: Apply a Flux Kustomization resource for a cluster diff --git a/.taskfiles/Sops/Taskfile.yaml b/.taskfiles/Sops/Taskfile.yaml index 84dc4b2e..e4506aae 100644 --- a/.taskfiles/Sops/Taskfile.yaml +++ b/.taskfiles/Sops/Taskfile.yaml @@ -9,9 +9,9 @@ tasks: age-keygen: desc: Initialize Age Key for Sops - cmd: age-keygen --output {{.SOPS_AGE_FILE}} + cmd: age-keygen --output {{.SOPS_AGE_KEY_FILE}} status: - - test -f "{{.SOPS_AGE_FILE}}" + - test -f "{{.SOPS_AGE_KEY_FILE}}" encrypt: desc: Encrypt all Kubernetes SOPS secrets that are not already encrypted @@ -31,7 +31,7 @@ tasks: vars: ["file"] preconditions: - { msg: "Missing Sops config file", sh: "test -f {{.SOPS_CONFIG_FILE}}" } - - { msg: "Missing Sops Age key file", sh: "test -f {{.SOPS_AGE_FILE}}" } + - { msg: "Missing Sops Age key file", sh: "test -f {{.SOPS_AGE_KEY_FILE}}" } .reset: internal: true diff --git a/README.md b/README.md index 7e31b995..e1067e24 100644 --- a/README.md +++ b/README.md @@ -455,7 +455,7 @@ _Mic check, 1, 2_ - In a few moments applications should be lighting up like Chr #### 🌐 Public DNS -The `external-dns` application created in the `networking` namespace will handle creating public DNS records. By default, `echo-server` and the `flux-webhook` are the only subdomains reachable from the public internet. In order to make additional applications public you must set set the correct ingress class name and ingress annotations like in the HelmRelease for `echo-server`. +The `external-dns` application created in the `networking` namespace will handle creating public DNS records. By default, `echo-server-external` and the `flux-webhook` are the only subdomains reachable from the public internet. In order to make additional applications public you must set set the correct ingress class name and ingress annotations like in the HelmRelease for `echo-server`. #### 🏠 Home DNS @@ -469,7 +469,7 @@ The `external-dns` application created in the `networking` namespace will handle > server=/${bootstrap_cloudflare_domain}/${bootstrap_k8s_gateway_addr} > ``` > 2. Restart dnsmasq on the server. -> 3. Query an internal-only subdomain from your workstation (any `internal` class ingresses): `dig @${home-dns-server-ip} hubble.${bootstrap_cloudflare_domain}`. It should resolve to `${bootstrap_internal_ingress_addr}`. +> 3. Query an internal-only subdomain from your workstation (any `internal` class ingresses): `dig @${home-dns-server-ip} echo-server-internal.${bootstrap_cloudflare_domain}`. It should resolve to `${bootstrap_internal_ingress_addr}`. If you're having trouble with DNS be sure to check out these two GitHub discussions: [Internal DNS](https://github.com/onedr0p/flux-cluster-template/discussions/719) and [Pod DNS resolution broken](https://github.com/onedr0p/flux-cluster-template/discussions/635). diff --git a/Taskfile.yaml b/Taskfile.yaml index 7334eb9d..ec000164 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -13,7 +13,7 @@ vars: KUBECONFIG_FILE: "{{.ROOT_DIR}}/kubeconfig" MAKEJINJA_CONFIG_FILE: "{{.ROOT_DIR}}/makejinja.toml" PIP_REQUIREMENTS_FILE: "{{.ROOT_DIR}}/requirements.txt" - SOPS_AGE_FILE: "{{.ROOT_DIR}}/age.key" + SOPS_AGE_KEY_FILE: "{{.ROOT_DIR}}/age.key" # Binaries PYTHON_BIN: python3 # Python diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/issuers.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/issuers.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/issuers.yaml.j2 rename to bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/issuers.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/kustomization.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/kustomization.yaml.j2 rename to bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/kustomization.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/secret.sops.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/secret.sops.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/issuers/secret.sops.yaml.j2 rename to bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/app/secret.sops.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/ks.yaml.j2 new file mode 100644 index 00000000..c473bd3a --- /dev/null +++ b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager-issuers/ks.yaml.j2 @@ -0,0 +1,23 @@ + +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: &app cert-manager-issuers + namespace: flux-system +spec: + targetNamespace: cert-manager + commonMetadata: + labels: + app.kubernetes.io/name: *app + dependsOn: + - name: cert-manager + path: ./kubernetes/apps/cert-manager/cert-manager-issuers/app + prune: true + sourceRef: + kind: GitRepository + name: home-kubernetes + wait: true + interval: 30m + retryInterval: 1m + timeout: 5m diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/ks.yaml.j2 index ea0d2af9..43cdf52e 100644 --- a/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/ks.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/cert-manager/cert-manager/ks.yaml.j2 @@ -18,25 +18,3 @@ spec: interval: 30m retryInterval: 1m timeout: 5m ---- -apiVersion: kustomize.toolkit.fluxcd.io/v1 -kind: Kustomization -metadata: - name: &app cert-manager-issuers - namespace: flux-system -spec: - targetNamespace: cert-manager - commonMetadata: - labels: - app.kubernetes.io/name: *app - dependsOn: - - name: cert-manager - path: ./kubernetes/apps/cert-manager/cert-manager/issuers - prune: true - sourceRef: - kind: GitRepository - name: home-kubernetes - wait: true - interval: 30m - retryInterval: 1m - timeout: 5m diff --git a/bootstrap/templates/kubernetes/apps/cert-manager/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/cert-manager/kustomization.yaml.j2 index a0a3e5ed..6b5358a8 100644 --- a/bootstrap/templates/kubernetes/apps/cert-manager/kustomization.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/cert-manager/kustomization.yaml.j2 @@ -4,3 +4,4 @@ kind: Kustomization resources: - ./namespace.yaml - ./cert-manager/ks.yaml + - ./cert-manager-issuers/ks.yaml diff --git a/bootstrap/templates/kubernetes/apps/kube-system/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/kube-system/kustomization.yaml.j2 index 2336c26f..b93c7c8a 100644 --- a/bootstrap/templates/kubernetes/apps/kube-system/kustomization.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/kube-system/kustomization.yaml.j2 @@ -11,3 +11,4 @@ resources: #% if bootstrap_distribution in ['k0s', 'talos'] %# - ./spegel/ks.yaml #% endif %# + - ./reloader/ks.yaml diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/certificates/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/certificates/app/kustomization.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/certificates/kustomization.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/certificates/app/kustomization.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/certificates/production.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/certificates/app/production.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/certificates/production.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/certificates/app/production.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/certificates/staging.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/certificates/app/staging.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/certificates/staging.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/certificates/app/staging.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/certificates/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/certificates/ks.yaml.j2 new file mode 100644 index 00000000..97409a50 --- /dev/null +++ b/bootstrap/templates/kubernetes/apps/network/certificates/ks.yaml.j2 @@ -0,0 +1,22 @@ +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: &app certificates + namespace: flux-system +spec: + targetNamespace: network + commonMetadata: + labels: + app.kubernetes.io/name: *app + dependsOn: + - name: cert-manager-issuers + path: ./kubernetes/apps/network/certificates/app + prune: true + sourceRef: + kind: GitRepository + name: home-kubernetes + wait: true + interval: 30m + retryInterval: 1m + timeout: 5m diff --git a/bootstrap/templates/kubernetes/apps/network/cloudflared/app/configs/config.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/cloudflared/app/configs/config.yaml.j2 index 452047ac..fed9b18e 100644 --- a/bootstrap/templates/kubernetes/apps/network/cloudflared/app/configs/config.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/cloudflared/app/configs/config.yaml.j2 @@ -1,14 +1,10 @@ --- originRequest: - http2Origin: true + originServerName: "external.${SECRET_DOMAIN}" ingress: - hostname: "${SECRET_DOMAIN}" service: https://nginx-external-controller.network.svc.cluster.local:443 - originRequest: - originServerName: "external.${SECRET_DOMAIN}" - hostname: "*.${SECRET_DOMAIN}" service: https://nginx-external-controller.network.svc.cluster.local:443 - originRequest: - originServerName: "external.${SECRET_DOMAIN}" - service: http_status:404 diff --git a/bootstrap/templates/kubernetes/apps/network/cloudflared/app/helmrelease.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/cloudflared/app/helmrelease.yaml.j2 index 4550db3d..f84a9ea0 100644 --- a/bootstrap/templates/kubernetes/apps/network/cloudflared/app/helmrelease.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/cloudflared/app/helmrelease.yaml.j2 @@ -38,6 +38,7 @@ spec: NO_AUTOUPDATE: "true" TUNNEL_CRED_FILE: /etc/cloudflared/creds/credentials.json TUNNEL_METRICS: 0.0.0.0:8080 + TUNNEL_ORIGIN_ENABLE_HTTP2: true TUNNEL_TRANSPORT_PROTOCOL: quic TUNNEL_POST_QUANTUM: true TUNNEL_ID: diff --git a/bootstrap/templates/kubernetes/apps/network/cloudflared/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/cloudflared/ks.yaml.j2 index eb8d8da0..ca0995e6 100644 --- a/bootstrap/templates/kubernetes/apps/network/cloudflared/ks.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/cloudflared/ks.yaml.j2 @@ -10,6 +10,7 @@ spec: labels: app.kubernetes.io/name: *app dependsOn: + - name: certificates - name: external-dns path: ./kubernetes/apps/network/cloudflared/app prune: true diff --git a/bootstrap/templates/kubernetes/apps/network/echo-server/app/helmrelease.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/echo-server/app/helmrelease.yaml.j2 index 871c19a7..fb40ca4e 100644 --- a/bootstrap/templates/kubernetes/apps/network/echo-server/app/helmrelease.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/echo-server/app/helmrelease.yaml.j2 @@ -25,7 +25,6 @@ spec: values: controllers: main: - replicas: 2 strategy: RollingUpdate containers: main: @@ -66,12 +65,27 @@ spec: port: *port ingress: main: + enabled: false + external: enabled: true className: external annotations: external-dns.alpha.kubernetes.io/target: "external.${SECRET_DOMAIN}" hosts: - - host: &host "{{ .Release.Name }}.${SECRET_DOMAIN}" + - host: &host "{{ .Release.Name }}-external.${SECRET_DOMAIN}" + paths: + - path: / + service: + name: main + port: http + tls: + - hosts: + - *host + internal: + enabled: true + className: internal + hosts: + - host: &host "{{ .Release.Name }}-internal.${SECRET_DOMAIN}" paths: - path: / service: diff --git a/bootstrap/templates/kubernetes/apps/network/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/kustomization.yaml.j2 index 4ad531cd..e31d0cd8 100644 --- a/bootstrap/templates/kubernetes/apps/network/kustomization.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/kustomization.yaml.j2 @@ -3,8 +3,10 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ./namespace.yaml + - ./certificates/ks.yaml - ./cloudflared/ks.yaml - ./echo-server/ks.yaml - ./external-dns/ks.yaml - ./k8s-gateway/ks.yaml - - ./nginx/ks.yaml + - ./nginx-external/ks.yaml + - ./nginx-internal/ks.yaml diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/external/helmrelease.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-external/app/helmrelease.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/external/helmrelease.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/nginx-external/app/helmrelease.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/external/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-external/app/kustomization.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/external/kustomization.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/nginx-external/app/kustomization.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/nginx-external/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-external/ks.yaml.j2 new file mode 100644 index 00000000..43a88b89 --- /dev/null +++ b/bootstrap/templates/kubernetes/apps/network/nginx-external/ks.yaml.j2 @@ -0,0 +1,22 @@ +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: &app nginx-external + namespace: flux-system +spec: + targetNamespace: network + commonMetadata: + labels: + app.kubernetes.io/name: *app + dependsOn: + - name: certificates + path: ./kubernetes/apps/network/nginx-external/app + prune: true + sourceRef: + kind: GitRepository + name: home-kubernetes + wait: false + interval: 30m + retryInterval: 1m + timeout: 5m diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/internal/helmrelease.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-internal/app/helmrelease.yaml.j2 similarity index 96% rename from bootstrap/templates/kubernetes/apps/network/nginx/internal/helmrelease.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/nginx-internal/app/helmrelease.yaml.j2 index 4135dc58..4e2bca9e 100644 --- a/bootstrap/templates/kubernetes/apps/network/nginx/internal/helmrelease.yaml.j2 +++ b/bootstrap/templates/kubernetes/apps/network/nginx-internal/app/helmrelease.yaml.j2 @@ -3,7 +3,7 @@ apiVersion: helm.toolkit.fluxcd.io/v2beta2 kind: HelmRelease metadata: name: nginx-internal - namespace: &namespace network + namespace: network spec: interval: 30m chart: @@ -29,7 +29,6 @@ spec: replicaCount: 1 service: annotations: - external-dns.alpha.kubernetes.io/hostname: "internal.${SECRET_DOMAIN}" io.cilium/lb-ipam-ips: "#{ bootstrap_internal_ingress_addr }#" externalTrafficPolicy: Cluster ingressClassResource: diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/internal/kustomization.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-internal/app/kustomization.yaml.j2 similarity index 100% rename from bootstrap/templates/kubernetes/apps/network/nginx/internal/kustomization.yaml.j2 rename to bootstrap/templates/kubernetes/apps/network/nginx-internal/app/kustomization.yaml.j2 diff --git a/bootstrap/templates/kubernetes/apps/network/nginx-internal/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx-internal/ks.yaml.j2 new file mode 100644 index 00000000..3a207567 --- /dev/null +++ b/bootstrap/templates/kubernetes/apps/network/nginx-internal/ks.yaml.j2 @@ -0,0 +1,22 @@ +--- +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: &app nginx-internal + namespace: flux-system +spec: + targetNamespace: network + commonMetadata: + labels: + app.kubernetes.io/name: *app + dependsOn: + - name: certificates + path: ./kubernetes/apps/network/nginx-internal/app + prune: true + sourceRef: + kind: GitRepository + name: home-kubernetes + wait: false + interval: 30m + retryInterval: 1m + timeout: 5m diff --git a/bootstrap/templates/kubernetes/apps/network/nginx/ks.yaml.j2 b/bootstrap/templates/kubernetes/apps/network/nginx/ks.yaml.j2 deleted file mode 100644 index b5d14421..00000000 --- a/bootstrap/templates/kubernetes/apps/network/nginx/ks.yaml.j2 +++ /dev/null @@ -1,66 +0,0 @@ ---- -apiVersion: kustomize.toolkit.fluxcd.io/v1 -kind: Kustomization -metadata: - name: &app nginx-certificates - namespace: flux-system -spec: - targetNamespace: network - commonMetadata: - labels: - app.kubernetes.io/name: *app - dependsOn: - - name: cert-manager-issuers - path: ./kubernetes/apps/network/nginx/certificates - prune: true - sourceRef: - kind: GitRepository - name: home-kubernetes - wait: true - interval: 30m - retryInterval: 1m - timeout: 5m ---- -apiVersion: kustomize.toolkit.fluxcd.io/v1 -kind: Kustomization -metadata: - name: &app nginx-external - namespace: flux-system -spec: - targetNamespace: network - commonMetadata: - labels: - app.kubernetes.io/name: *app - dependsOn: - - name: nginx-certificates - path: ./kubernetes/apps/network/nginx/external - prune: true - sourceRef: - kind: GitRepository - name: home-kubernetes - wait: false - interval: 30m - retryInterval: 1m - timeout: 5m ---- -apiVersion: kustomize.toolkit.fluxcd.io/v1 -kind: Kustomization -metadata: - name: &app nginx-internal - namespace: flux-system -spec: - targetNamespace: network - commonMetadata: - labels: - app.kubernetes.io/name: *app - dependsOn: - - name: nginx-certificates - path: ./kubernetes/apps/network/nginx/internal - prune: true - sourceRef: - kind: GitRepository - name: home-kubernetes - wait: false - interval: 30m - retryInterval: 1m - timeout: 5m