From b6f5ae58abe32355ab36be2cedad04b86eba220d Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 18:40:55 +0200 Subject: [PATCH 001/101] wip --- stacks/_templates/argo-cd.yaml | 18 ++++++++ .../applications/commons-operator.yaml | 42 ++++++++++++++++++ .../argo-cd/applications/secret-operator.yaml | 43 +++++++++++++++++++ .../argo-cd/projects/stackable-operators.yaml | 19 ++++++++ stacks/stacks-v2.yaml | 30 +++++++++++++ 5 files changed, 152 insertions(+) create mode 100644 stacks/_templates/argo-cd.yaml create mode 100644 stacks/argo-cd/applications/commons-operator.yaml create mode 100644 stacks/argo-cd/applications/secret-operator.yaml create mode 100644 stacks/argo-cd/projects/stackable-operators.yaml diff --git a/stacks/_templates/argo-cd.yaml b/stacks/_templates/argo-cd.yaml new file mode 100644 index 00000000..1c72ab9c --- /dev/null +++ b/stacks/_templates/argo-cd.yaml @@ -0,0 +1,18 @@ +--- +releaseName: argocd +name: argo-cd +repo: + name: argo-cd + url: https://argoproj.github.io/argo-helm +version: v7.8.23 +options: + configs: + secret: + argocdServerAdminPassword: "{{ argocdAdminPassword }}" + # We have to set the time otherwise error message: + # invalid session: Account password has changed since token issued + argocdServerAdminPasswordMtime: "2025-01-01T00:00:00Z" + dex: + enabled: false + notifications: + enabled: false diff --git a/stacks/argo-cd/applications/commons-operator.yaml b/stacks/argo-cd/applications/commons-operator.yaml new file mode 100644 index 00000000..97fafa90 --- /dev/null +++ b/stacks/argo-cd/applications/commons-operator.yaml @@ -0,0 +1,42 @@ +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: commons-operator +spec: + # this interferes with stackablectl's templating and + # cannot really be used here properly but must be provided. + generators: + - list: + elements: + - cluster: development + template: + metadata: + name: commons-operator + spec: + project: stackable-operators + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: "{{ stackableVersion }}" + chart: commons-operator + helm: + releaseName: commons-operator + destination: + server: https://kubernetes.default.svc + namespace: "{{ stackableOperatorNamespace }}" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/applications/secret-operator.yaml b/stacks/argo-cd/applications/secret-operator.yaml new file mode 100644 index 00000000..e8e46e42 --- /dev/null +++ b/stacks/argo-cd/applications/secret-operator.yaml @@ -0,0 +1,43 @@ +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: secret-operator +spec: + generators: + - list: + elements: + - cluster: development + url: https://kubernetes.default.svc + helmChartRevision: 25.3.0 + targetRevision: HEAD + template: + metadata: + name: secret-operator + spec: + project: stackable-operators + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: 25.3.0 + chart: secret-operator + helm: + releaseName: secret-operator + destination: + server: "{{url}}" + namespace: stackable-operators + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/projects/stackable-operators.yaml b/stacks/argo-cd/projects/stackable-operators.yaml new file mode 100644 index 00000000..3e3e82a0 --- /dev/null +++ b/stacks/argo-cd/projects/stackable-operators.yaml @@ -0,0 +1,19 @@ +apiVersion: argoproj.io/v1alpha1 +kind: AppProject +metadata: + name: stackable-operators +spec: + description: Stackable operators ArgoCD Project + sourceRepos: + - "*" + destinations: + - namespace: argo-cd + server: https://kubernetes.default.svc + - namespace: stackable-operators + server: https://kubernetes.default.svc + - namespace: stackable-products + server: https://kubernetes.default.svc + # required to deploy clusterwide resources like clusteroles etc. + clusterResourceWhitelist: + - group: "*" + kind: "*" diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index d013c95f..d48df9dc 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -1,5 +1,35 @@ --- stacks: + argocd: + description: TODO + stackableRelease: dev + # we dont not want to install operators... + stackableOperators: + - listener + labels: + - argocd + manifests: + #- helmChart: https://raw.githubusercontent.com/stackabletech/demos/main/stacks/_templates/argocd.yaml + - helmChart: stacks/_templates/argo-cd.yaml + - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml + - plainYaml: stacks/argo-cd/applications/commons-operator.yaml + supportedNamespaces: + - argo-cd + resourceRequests: + memory: 2000Mi + cpu: 2000m + pvc: 20Gi + parameters: + - name: stackableVersion + description: Stackable release to be installed via Argo + default: 25.3.0 + - name: stackableOperatorNamespace + description: Stackable namespace for the operators + default: stackable-operators + - name: argocdAdminPassword + description: Password of the ArgoCD admin user + # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` + default: $2y$10$HhJC3pGHTlk8RyBoS39N/.wC72mdWxV2X8QS1wROUwCFxl.2tGfky monitoring: description: Stack containing Prometheus and Grafana stackableRelease: dev From 3e983a028465c5a3bb8ec8b4194dcc4c7d0fd0ca Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 20:02:36 +0200 Subject: [PATCH 002/101] argocd / airflow stack working --- .../applications/airflow-postgres.yaml | 31 ++++++++++++++ stacks/argo-cd/applications/airflow.yaml | 20 +++++++++ .../applicationsets/airflow-operator.yaml | 42 +++++++++++++++++++ .../commons-operator.yaml | 2 +- .../applicationsets/listener-operator.yaml | 42 +++++++++++++++++++ .../secret-operator.yaml | 11 +++-- stacks/argo-cd/projects/airflow.yaml | 14 +++++++ .../argo-cd/projects/stackable-operators.yaml | 6 +-- stacks/stacks-v2.yaml | 23 +++++++++- 9 files changed, 177 insertions(+), 14 deletions(-) create mode 100644 stacks/argo-cd/applications/airflow-postgres.yaml create mode 100644 stacks/argo-cd/applications/airflow.yaml create mode 100644 stacks/argo-cd/applicationsets/airflow-operator.yaml rename stacks/argo-cd/{applications => applicationsets}/commons-operator.yaml (95%) create mode 100644 stacks/argo-cd/applicationsets/listener-operator.yaml rename stacks/argo-cd/{applications => applicationsets}/secret-operator.yaml (79%) create mode 100644 stacks/argo-cd/projects/airflow.yaml diff --git a/stacks/argo-cd/applications/airflow-postgres.yaml b/stacks/argo-cd/applications/airflow-postgres.yaml new file mode 100644 index 00000000..d59f9961 --- /dev/null +++ b/stacks/argo-cd/applications/airflow-postgres.yaml @@ -0,0 +1,31 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: airflow-postgres +spec: + project: airflow + destination: + server: https://kubernetes.default.svc + namespace: stackable-airflow + source: + repoURL: "registry-1.docker.io/bitnamicharts" + path: postgresql + # helm inspect chart oci://registry-1.docker.io/bitnamicharts/postgresql + targetRevision: 16.6.3 # 17.4.0 + chart: postgresql + helm: + # TODO this breaks naming as long as we use the airflow stack yaml which needs this svc name + releaseName: postgresql-airflow + valuesObject: + commonLabels: + stackable.tech/vendor: Stackable + auth: + username: airflow + password: airflow + database: airflow + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/applications/airflow.yaml b/stacks/argo-cd/applications/airflow.yaml new file mode 100644 index 00000000..4789efe9 --- /dev/null +++ b/stacks/argo-cd/applications/airflow.yaml @@ -0,0 +1,20 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: airflow +spec: + project: airflow + destination: + namespace: stackable-airflow + server: https://kubernetes.default.svc + source: + repoURL: https://github.com/stackabletech/demos.git + targetRevision: "{{ demoTargetRevision }}" + # TODO: change to other directory + path: stacks/airflow/ + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/applicationsets/airflow-operator.yaml b/stacks/argo-cd/applicationsets/airflow-operator.yaml new file mode 100644 index 00000000..109ecc94 --- /dev/null +++ b/stacks/argo-cd/applicationsets/airflow-operator.yaml @@ -0,0 +1,42 @@ +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: airflow-operator +spec: + # this interferes with stackablectl's templating and + # cannot really be used here properly but must be provided. + generators: + - list: + elements: + - cluster: development + template: + metadata: + name: airflow-operator + spec: + project: stackable-operators + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: "{{ stackableReleaseVersion }}" + chart: airflow-operator + helm: + releaseName: airflow-operator + destination: + server: https://kubernetes.default.svc + namespace: "{{ stackableOperatorNamespace }}" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/applications/commons-operator.yaml b/stacks/argo-cd/applicationsets/commons-operator.yaml similarity index 95% rename from stacks/argo-cd/applications/commons-operator.yaml rename to stacks/argo-cd/applicationsets/commons-operator.yaml index 97fafa90..19a2bbc6 100644 --- a/stacks/argo-cd/applications/commons-operator.yaml +++ b/stacks/argo-cd/applicationsets/commons-operator.yaml @@ -25,7 +25,7 @@ spec: - .spec.versions[].additionalPrinterColumns | select(. == []) source: repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableVersion }}" + targetRevision: "{{ stackableReleaseVersion }}" chart: commons-operator helm: releaseName: commons-operator diff --git a/stacks/argo-cd/applicationsets/listener-operator.yaml b/stacks/argo-cd/applicationsets/listener-operator.yaml new file mode 100644 index 00000000..9053f49e --- /dev/null +++ b/stacks/argo-cd/applicationsets/listener-operator.yaml @@ -0,0 +1,42 @@ +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: listener-operator +spec: + # this interferes with stackablectl's templating and + # cannot really be used here properly but must be provided. + generators: + - list: + elements: + - cluster: development + template: + metadata: + name: listener-operator + spec: + project: stackable-operators + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: "{{ stackableReleaseVersion }}" + chart: listener-operator + helm: + releaseName: listener-operator + destination: + server: https://kubernetes.default.svc + namespace: "{{ stackableOperatorNamespace }}" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/applications/secret-operator.yaml b/stacks/argo-cd/applicationsets/secret-operator.yaml similarity index 79% rename from stacks/argo-cd/applications/secret-operator.yaml rename to stacks/argo-cd/applicationsets/secret-operator.yaml index e8e46e42..7312c0bd 100644 --- a/stacks/argo-cd/applications/secret-operator.yaml +++ b/stacks/argo-cd/applicationsets/secret-operator.yaml @@ -4,13 +4,12 @@ kind: ApplicationSet metadata: name: secret-operator spec: + # this interferes with stackablectl's templating and + # cannot really be used here properly but must be provided. generators: - list: elements: - cluster: development - url: https://kubernetes.default.svc - helmChartRevision: 25.3.0 - targetRevision: HEAD template: metadata: name: secret-operator @@ -26,13 +25,13 @@ spec: - .spec.versions[].additionalPrinterColumns | select(. == []) source: repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: 25.3.0 + targetRevision: "{{ stackableReleaseVersion }}" chart: secret-operator helm: releaseName: secret-operator destination: - server: "{{url}}" - namespace: stackable-operators + server: https://kubernetes.default.svc + namespace: "{{ stackableOperatorNamespace }}" syncPolicy: syncOptions: - CreateNamespace=true diff --git a/stacks/argo-cd/projects/airflow.yaml b/stacks/argo-cd/projects/airflow.yaml new file mode 100644 index 00000000..3661434f --- /dev/null +++ b/stacks/argo-cd/projects/airflow.yaml @@ -0,0 +1,14 @@ +apiVersion: argoproj.io/v1alpha1 +kind: AppProject +metadata: + name: airflow +spec: + description: Project to manage Stackable Airflow via Git + sourceRepos: + - "*" + destinations: + - namespace: stackable-airflow + server: https://kubernetes.default.svc + clusterResourceWhitelist: + - group: "*" + kind: "*" diff --git a/stacks/argo-cd/projects/stackable-operators.yaml b/stacks/argo-cd/projects/stackable-operators.yaml index 3e3e82a0..3ee37fc2 100644 --- a/stacks/argo-cd/projects/stackable-operators.yaml +++ b/stacks/argo-cd/projects/stackable-operators.yaml @@ -3,16 +3,12 @@ kind: AppProject metadata: name: stackable-operators spec: - description: Stackable operators ArgoCD Project + description: Project to manage Stackable Operators via Helm sourceRepos: - "*" destinations: - - namespace: argo-cd - server: https://kubernetes.default.svc - namespace: stackable-operators server: https://kubernetes.default.svc - - namespace: stackable-products - server: https://kubernetes.default.svc # required to deploy clusterwide resources like clusteroles etc. clusterResourceWhitelist: - group: "*" diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index d48df9dc..f9bf053f 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -11,8 +11,18 @@ stacks: manifests: #- helmChart: https://raw.githubusercontent.com/stackabletech/demos/main/stacks/_templates/argocd.yaml - helmChart: stacks/_templates/argo-cd.yaml + # projects - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml - - plainYaml: stacks/argo-cd/applications/commons-operator.yaml + - plainYaml: stacks/argo-cd/projects/airflow.yaml + # operators + - plainYaml: stacks/argo-cd/applicationsets/commons-operator.yaml + # listener is currently deployed via stackablectl since it complains if no operators are deployed... + #- plainYaml: stacks/argo-cd/applicationsets/listener-operator.yaml + - plainYaml: stacks/argo-cd/applicationsets/secret-operator.yaml + - plainYaml: stacks/argo-cd/applicationsets/airflow-operator.yaml + # products + - plainYaml: stacks/argo-cd/applications/airflow-postgres.yaml + - plainYaml: stacks/argo-cd/applications/airflow.yaml supportedNamespaces: - argo-cd resourceRequests: @@ -20,9 +30,12 @@ stacks: cpu: 2000m pvc: 20Gi parameters: - - name: stackableVersion + - name: stackableReleaseVersion description: Stackable release to be installed via Argo default: 25.3.0 + - name: demoTargetRevision + description: The target revision, HEAD or e.g. release-25.3 + default: release-25.3 - name: stackableOperatorNamespace description: Stackable namespace for the operators default: stackable-operators @@ -30,6 +43,12 @@ stacks: description: Password of the ArgoCD admin user # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` default: $2y$10$HhJC3pGHTlk8RyBoS39N/.wC72mdWxV2X8QS1wROUwCFxl.2tGfky + - name: airflowAdminPassword + description: Password of the Airflow admin user + default: adminadmin + - name: airflowSecretKey + description: Airflow's secret key used to generate e.g. user session tokens + default: airflowSecretKey monitoring: description: Stack containing Prometheus and Grafana stackableRelease: dev From d64a4170f5e01668b74d4e19c1945dd12452457e Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 20:23:55 +0200 Subject: [PATCH 003/101] added spark op --- .../applicationsets/spark-k8s-operator.yaml | 42 +++++++++++++++++++ stacks/stacks-v2.yaml | 18 ++++---- 2 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 stacks/argo-cd/applicationsets/spark-k8s-operator.yaml diff --git a/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml b/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml new file mode 100644 index 00000000..b5686b60 --- /dev/null +++ b/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml @@ -0,0 +1,42 @@ +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: spark-k8s-operator +spec: + # this interferes with stackablectl's templating and + # cannot really be used here properly but must be provided. + generators: + - list: + elements: + - cluster: development + template: + metadata: + name: spark-k8s-operator + spec: + project: stackable-operators + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: "{{ stackableReleaseVersion }}" + chart: spark-k8s-operator + helm: + releaseName: spark-k8s-operator + destination: + server: https://kubernetes.default.svc + namespace: "{{ stackableOperatorNamespace }}" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index f9bf053f..89befdf7 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -3,31 +3,35 @@ stacks: argocd: description: TODO stackableRelease: dev - # we dont not want to install operators... + # TODO: We actually want to deploy all operators via ArgoCD, but we currently *have to* install + # operators with stackablectl. Therefore we install the internal operators via stackablectl. + # stackableOperators: [] stackableOperators: - listener + - commons + - secret labels: - argocd manifests: - #- helmChart: https://raw.githubusercontent.com/stackabletech/demos/main/stacks/_templates/argocd.yaml - helmChart: stacks/_templates/argo-cd.yaml # projects - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml - plainYaml: stacks/argo-cd/projects/airflow.yaml # operators - - plainYaml: stacks/argo-cd/applicationsets/commons-operator.yaml - # listener is currently deployed via stackablectl since it complains if no operators are deployed... + # currently deployed via stackablectl since it complains if no operators are deployed... + #- plainYaml: stacks/argo-cd/applicationsets/commons-operator.yaml #- plainYaml: stacks/argo-cd/applicationsets/listener-operator.yaml - - plainYaml: stacks/argo-cd/applicationsets/secret-operator.yaml + #- plainYaml: stacks/argo-cd/applicationsets/secret-operator.yaml - plainYaml: stacks/argo-cd/applicationsets/airflow-operator.yaml + - plainYaml: stacks/argo-cd/applicationsets/spark-k8s-operator.yaml # products - plainYaml: stacks/argo-cd/applications/airflow-postgres.yaml - plainYaml: stacks/argo-cd/applications/airflow.yaml supportedNamespaces: - argo-cd resourceRequests: - memory: 2000Mi - cpu: 2000m + memory: 10000Mi + cpu: 8000m pvc: 20Gi parameters: - name: stackableReleaseVersion From 64daa28a701a667ac240fddfdfe37c40c3f61479 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 22:57:10 +0200 Subject: [PATCH 004/101] wip --- stacks/argo-cd/applications/airflow.yaml | 3 +- .../argo-cd/applications/sealed-secrets.yaml | 28 ++ stacks/argo-cd/manifests/airflow/airflow.yaml | 308 ++++++++++++++++++ .../airflow/sealed-airflow-credentials.yaml | 24 ++ .../argo-cd/secrets/sealed-secrets-key.yaml | 90 +++++ stacks/stacks-v2.yaml | 22 +- 6 files changed, 465 insertions(+), 10 deletions(-) create mode 100644 stacks/argo-cd/applications/sealed-secrets.yaml create mode 100644 stacks/argo-cd/manifests/airflow/airflow.yaml create mode 100644 stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml create mode 100644 stacks/argo-cd/secrets/sealed-secrets-key.yaml diff --git a/stacks/argo-cd/applications/airflow.yaml b/stacks/argo-cd/applications/airflow.yaml index 4789efe9..9db9f6a7 100644 --- a/stacks/argo-cd/applications/airflow.yaml +++ b/stacks/argo-cd/applications/airflow.yaml @@ -10,8 +10,7 @@ spec: source: repoURL: https://github.com/stackabletech/demos.git targetRevision: "{{ demoTargetRevision }}" - # TODO: change to other directory - path: stacks/airflow/ + path: stacks/argo-cd/manifests/airflow/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml new file mode 100644 index 00000000..7faa76b4 --- /dev/null +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -0,0 +1,28 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: sealed-secrets +spec: + project: default + sources: + - repoURL: "registry-1.docker.io/bitnamicharts" + path: sealed-secrets + targetRevision: 2.5.9 # 0.29.0 + chart: sealed-secrets + helm: + releaseName: sealed-secrets-controller + valuesObject: + secretName: sealed-secrets-key + - repoURL: https://github.com/stackabletech/demos.git + # TODO: adapt to release + targetRevision: HEAD + path: stacks/argo-cd/secrets/ + destination: + server: https://kubernetes.default.svc + namespace: kube-system + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml new file mode 100644 index 00000000..703f409c --- /dev/null +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -0,0 +1,308 @@ +--- +# {% raw %} +apiVersion: airflow.stackable.tech/v1alpha1 +kind: AirflowCluster +metadata: + name: airflow + namespace: stackable-airflow +spec: + image: + productVersion: 2.10.4 + clusterConfig: + listenerClass: external-unstable + loadExamples: false + exposeConfig: false + credentialsSecret: airflow-credentials + volumes: + - name: airflow-dags + configMap: + name: airflow-dags + volumeMounts: + - name: airflow-dags + mountPath: /dags/date_demo.py + subPath: date_demo.py + - name: airflow-dags + mountPath: /dags/pyspark_pi.py + subPath: pyspark_pi.py + - name: airflow-dags + mountPath: /dags/pyspark_pi.yaml + subPath: pyspark_pi.yaml + webservers: + config: + resources: + cpu: + min: 400m + max: "1" + memory: + limit: 2Gi + gracefulShutdownTimeout: 30s + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + replicas: 1 + kubernetesExecutors: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + schedulers: + config: + gracefulShutdownTimeout: 30s + resources: + cpu: + min: 400m + max: "1" + memory: + limit: 1Gi + roleGroups: + default: + envOverrides: + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + replicas: 1 +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: airflow-dags + namespace: stackable-airflow +data: + date_demo.py: | + """Example DAG returning the current date""" + from datetime import datetime, timedelta + + from airflow import DAG + from airflow.operators.bash import BashOperator + + with DAG( + dag_id='date_demo', + schedule_interval='0-59 * * * *', + start_date=datetime(2021, 1, 1), + catchup=False, + dagrun_timeout=timedelta(minutes=5), + tags=['example'], + params={}, + ) as dag: + + run_this = BashOperator( + task_id='run_every_minute', + bash_command='date', + ) + pyspark_pi.py: | + """Example DAG demonstrating how to apply a Kubernetes Resource from Airflow running in-cluster""" + from datetime import datetime, timedelta + from airflow import DAG + from typing import TYPE_CHECKING, Optional, Sequence, Dict + from kubernetes import client + from airflow.exceptions import AirflowException + from airflow.sensors.base import BaseSensorOperator + from airflow.models import BaseOperator + from airflow.providers.cncf.kubernetes.hooks.kubernetes import KubernetesHook + import yaml + from airflow.utils import yaml + import os + + if TYPE_CHECKING: + from airflow.utils.context import Context + + class SparkKubernetesOperator(BaseOperator): + template_fields: Sequence[str] = ('application_file', 'namespace') + template_ext: Sequence[str] = ('.yaml', '.yml', '.json') + ui_color = '#f4a460' + + def __init__( + self, + *, + application_file: str, + namespace: Optional[str] = None, + kubernetes_conn_id: str = 'kubernetes_in_cluster', + api_group: str = 'spark.stackable.tech', + api_version: str = 'v1alpha1', + **kwargs, + ) -> None: + super().__init__(**kwargs) + self.application_file = application_file + self.namespace = namespace + self.kubernetes_conn_id = kubernetes_conn_id + self.api_group = api_group + self.api_version = api_version + self.plural = "sparkapplications" + + def execute(self, context: 'Context'): + hook = KubernetesHook(conn_id=self.kubernetes_conn_id) + self.log.info("Creating SparkApplication...") + response = hook.create_custom_object( + group=self.api_group, + version=self.api_version, + plural=self.plural, + body=self.application_file, + namespace=self.namespace, + ) + return response + + + class SparkKubernetesSensor(BaseSensorOperator): + template_fields = ("application_name", "namespace") + # See https://github.com/stackabletech/spark-k8s-operator/pull/460/files#diff-d737837121132af6b60f50279a78464b05dcfd06c05d1d090f4198a5e962b5f6R371 + # Unknown is set immediately so it must be excluded from the failed states. + FAILURE_STATES = ("Failed") + SUCCESS_STATES = ("Succeeded") + + def __init__( + self, + *, + application_name: str, + attach_log: bool = False, + namespace: Optional[str] = None, + kubernetes_conn_id: str = 'kubernetes_in_cluster', + api_group: str = 'spark.stackable.tech', + api_version: str = 'v1alpha1', + poke_interval: float = 60, + **kwargs, + ) -> None: + super().__init__(**kwargs) + self.application_name = application_name + self.attach_log = attach_log + self.namespace = namespace + self.kubernetes_conn_id = kubernetes_conn_id + self.hook = KubernetesHook(conn_id=self.kubernetes_conn_id) + self.api_group = api_group + self.api_version = api_version + self.poke_interval = poke_interval + + def _log_driver(self, application_state: str, response: dict) -> None: + if not self.attach_log: + return + status_info = response["status"] + if "driverInfo" not in status_info: + return + driver_info = status_info["driverInfo"] + if "podName" not in driver_info: + return + driver_pod_name = driver_info["podName"] + namespace = response["metadata"]["namespace"] + log_method = self.log.error if application_state in self.FAILURE_STATES else self.log.info + try: + log = "" + for line in self.hook.get_pod_logs(driver_pod_name, namespace=namespace): + log += line.decode() + log_method(log) + except client.rest.ApiException as e: + self.log.warning( + "Could not read logs for pod %s. It may have been disposed.\n" + "Make sure timeToLiveSeconds is set on your SparkApplication spec.\n" + "underlying exception: %s", + driver_pod_name, + e, + ) + + def poke(self, context: Dict) -> bool: + self.log.info("Poking: %s", self.application_name) + response = self.hook.get_custom_object( + group=self.api_group, + version=self.api_version, + plural="sparkapplications", + name=self.application_name, + namespace=self.namespace, + ) + try: + application_state = response["status"]["phase"] + except KeyError: + self.log.debug(f"SparkApplication status could not be established: {response}") + return False + if self.attach_log and application_state in self.FAILURE_STATES + self.SUCCESS_STATES: + self._log_driver(application_state, response) + if application_state in self.FAILURE_STATES: + raise AirflowException(f"SparkApplication failed with state: {application_state}") + elif application_state in self.SUCCESS_STATES: + self.log.info("SparkApplication ended successfully") + return True + else: + self.log.info("SparkApplication is still in state: %s", application_state) + return False + + with DAG( + dag_id='sparkapp_dag', + schedule_interval=None, + start_date=datetime(2022, 1, 1), + catchup=False, + dagrun_timeout=timedelta(minutes=60), + tags=['example'], + params={"example_key": "example_value"}, + ) as dag: + + def load_body_to_dict(body): + try: + body_dict = yaml.safe_load(body) + except yaml.YAMLError as e: + raise AirflowException(f"Exception when loading resource definition: {e}\n") + return body_dict + + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') + + with open(yaml_path, 'r') as file: + crd = file.read() + with open('/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as file: + ns = file.read() + + document=load_body_to_dict(crd) + application_name='pyspark-pi-'+datetime.utcnow().strftime('%Y%m%d%H%M%S') + document.update({'metadata': {'name': application_name, 'namespace': ns}}) + + t1 = SparkKubernetesOperator( + task_id='spark_pi_submit', + namespace=ns, + application_file=document, + do_xcom_push=True, + dag=dag, + ) + + t2 = SparkKubernetesSensor( + task_id='spark_pi_monitor', + namespace=ns, + application_name="{{ task_instance.xcom_pull(task_ids='spark_pi_submit')['metadata']['name'] }}", + poke_interval=5, + dag=dag, + ) + + t1 >> t2 + pyspark_pi.yaml: | + --- + apiVersion: spark.stackable.tech/v1alpha1 + kind: SparkApplication + metadata: + name: pyspark-pi + spec: + version: "1.0" + sparkImage: + productVersion: 3.5.2 + mode: cluster + mainApplicationFile: local:///stackable/spark/examples/src/main/python/pi.py + job: + config: + resources: + cpu: + min: 500m + max: 500m + memory: + limit: 512Mi + driver: + config: + resources: + cpu: + min: 1000m + max: 1200m + memory: + limit: 1024Mi + executor: + config: + resources: + cpu: + min: 500m + max: 1000m + memory: + limit: 1024Mi + replicas: 3 + +# {% endraw %} diff --git a/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml b/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml new file mode 100644 index 00000000..bc631bc7 --- /dev/null +++ b/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: airflow-credentials + namespace: stackable-airflow +spec: + encryptedData: + adminUser.email: AgCmhs/OLHZ0j4CnTdZvfj76m+y7e62IuAeJ/LksxaTOWbHlvTJ0p8dBsp+WX3RfiuRK8M7kJDundrSKYzbkw8MISjoHF4/v4pSu6qWLBBuDPaMGh3i1bpAJ9gKUti4SGLhp7dr/Lx1oFWnY5T69WMARQqTbhHnpH70LPkFWKRvlIkCN26PbuYsE7stKXaVweEP204sfUChK5qzafE4Lcm5l+1yGFfILBBKAbBGxLX2I3O4n4LuP/iv0Ne14wGnxss80Qapt+ue8Ce16EZiJPtY+ZCXa05fYgtitVr393pYZks/fO9as76ABjWFc2lnE5GaGV58gK9V/5VRd1TBfkK3Y8UZPxqHNULlkwVh4Vy2EHHBMzhtec0m6w72aWuWFecyUNkrwIuivZ8e9tiH6aulpYqgLshnbDZCQi8yQVDNx/xLv4GH0/VvDUEIB7O13CHRL4M+OH+GYgLpJYqhTTkJNvXdrmjyK6kWeiErw8yG77akVplDGSG6LschN0DGhJVoZLLwbjvvM9em6tHu3gRSXAYhfG80bB9PMwmU9Lei+cdq6Fp7RceqxR3F6lnigP2e5gCaEpc6YYzBKEnzgcdlR1iA57D+5lBK9SwvWkppH5/dbPRkzt5+kqWaExRq8VmEnwooiBJ/4Jx4i4FKWFnx3cnDF5OYXovIKPyYPZW1HVvifrjHHZAOe1jORxYpMOwPYOLraDIO83comkVEBzCVUOh8v + adminUser.firstname: AgB3NcEnKhwMsyFPOfSTfxKFkhIg1TyeixtdqW8RSq5I6zrMX9we431QLuOSfxQlaizsm3o670wjO+4yDNpOGB4/vXaSSpA+835tiMDymJ/URR7vb1vvLV/xx6azdn5JmmHWd+yEja47TxQ1ip5KDai1Oxc0BKbgzu2Ogalq1U/56riSKSe8MvRjJ9KY8IwBpoY1rKAjTFJWavUVVt5Ms0fdSB7sL69NoKVzUQEpucTemy6k8RQFabK+KwirQ2KSDcQ5J+df/ODx1/HZKG8j81Wla7dBJ0nwIeie0StAZdZ+j9QlsWQF4zCRaEPxn9p1vken7Na/EqQdYwIV62o3mo66p06t+ObdjxKRHEO5BiY2lYqY3XcgaETBpaDfl2PiMbneLngGpBfOQSKnVZC60svqB/BpvBlMCiwcr+0ZJczFM1f+ptmJGHLJirf1kTYKvm6ezstGussB848Ca/ayhzzt9cestW9UFS/SlAo7d+N+YUKv3O+8QPIb5AdN2nPN9kcQxdh2T+ogtg3yIKsb6makP8LC6Z0Hl8C1DuzSh3Inj5VxcmkRuB9LRYymfNu+6GjkVlAWk58FUdQM5+5syMDgiHdVIMmnoTjRNm3mCm3l6g6rG33ggaAI4X1ypyjnmMlxbpRJi/+KgsQNNByYYQG1Foo3MZ7JFQojABBFMVSCPumMyjR7i8kvYCTr7acrHS3ZSjvR+Msz + adminUser.lastname: AgCYaEJ973OSMSL0vBrQcHbFtmqQls6Ids1xcPVz3/uVpxZw89Phn67Xx6dPSNHqZIYHWbZ/gV24xOJd0XbtlFINUknGgjwqjwGJHm4Q+0F1nmCVmhrRqB+Jc8I7qqb5BT6XpsgQOa0vazDc+NVKlgm2DmbIKz8VvHrhUNRb1rd33RYd3lm0Kj8lSl4QZm8tIX+BZi3J9gSLDIMzGQftg5BxS8Wt8cbYsMW8lFeZ6Dg7Fmx9r0GCeAa7kZWy8UME0saeKj13tg/oYj79MNFCu/Q510Q+YbLcQAJ22ifPgIaPdN4YK03DYL9qiIeo4im8rlgfKqHaNkfNzmXXh758T4s74Nau9KLdG+qE2+j175B9nrYjBYlT2EDoJIF6m1iiOCAc93tk4FIc3fw5RNLkOsAYdEWoECWLOdDloQsDHa+DGwHnF6d9ZpzlATnKLMOJ6F3+RAW10NzD38bWMlUUJoGZTuhVOz9tQCyFs2/SqMC8/LauMrHx2TFbKEq2kpc4MRTYwUQe9L+zQFI2Oc5HXGulXDdteShL6ayT8sXGRIsNI0lCpNhHsUauGJ7sSkW4bklGMEPzRh48+Lua2/QQKOcLWxgPx53b492/7SvWExx7rs+POSZouLdwUlngXC2D1H5yvmnPXEnnTLVGwBNDRBa+BBefocVOmq6yZGX5trkhudTr/Nu/rZQkDGUtSfiMDzd6Uo73LQ== + adminUser.password: AgA7BxW4/FggUvHMVvnYxdP6Pmju3uSskl29Lc1ywr6AbtCSqiysp29Ravyr0muT+PlEb5zmUYrct+HaffstMOudDCYw5wSm50hhelRPFgqppJgoUvXwfeUMkx73rrkddfN2RnCepUZxmkJ8PcXA38+KPwTZM4zZmOHeq7lgKDlsjgin/O0MrAeochZGJ1JmsJ0B3QUxFit4aURq4Pko67ytrWMJBO2KQRLHUm7Swf3umqjCBWuqfqhbRtKrWEOhoAEHDzKOq4fUCaV5rf2uxpvNCC0KJY6zmhPcPgZAO+Wuc+W9iNmM4ROoTFCvDS/stXcneDR7oRObgtXN5gn/0xno3xhdypg0lqfm2bEoEiokwu2GVwrzPr5iNI2HlUVhXeo9bNwjJ1alWjt0faUvwtZRSbKI1AihBF0gelbXhKT9Iyya336TTuz0riW3sFeDixHDTRoVC3ZaHzvCTXLTLtw3xgmhxM1mCebU+pxS8DV4AAIy9MfkK4ZHkjpcCdVbV5D4Mt2A9Ltm1O7qHlKsdWF0+vMmllLn7dZzAmtAiCiI9srOUh0xj+bIOqqN2Ky8a2K73JPh3kXxO5njW9N0/lFFQ4D98VpgI/DDqoZwX97yzLcthLb54xr6OUtduvX6rDakgrRZT4OCSvlGUIWzvtTcoDwuBubSuOnLh6AFNd7xz/Ik+eepInSOCMpd3HIdp5KBB3TPm9eLFcLW + adminUser.username: AgAQWpaTaFTvYsZx0p9Am3iTwoUEZ/pWiETvhVSF0NANgKe17V5b1lQj+DamMVlFUGfGgV8Qcxdyw4Lc71yzGgwEB0fQERoy54Z2lwVpYLJm2qLcXuolkzFSyZEMBBulddkTGhF/zhDZWfpOnayhfAbQyyp/T3KUuZira220DN9HiXDb5BiId1+Gzu6xTW6WD5/c+7yFiD6SWFReGpIuqHofh4y02p8A5RED2jtcr/p7ltCZ/tqjIpnZcTP5K7wauEjDiJmDbLTcdAmzdSEOI4Q952+oK3xjPAIrhhivC3DAtQ0lgV2ye9859tx+CDEEkLkjewascVNwmX1yeYPxnh8ayJfabkEpNM8KOfmrDE/AZB82FeKChmvAcpQAu3fUuxBMyUit6RkNW73fvDf8hIyOmNSZdr0f21FPhJWFYnsF4Qfm3zOo/fXuG1LJz2WB2Qy7RuTmRGW1AE4VQOvzvVDCEOq5BsVfPdlGrSfo5oeI6ctCqTL4S+2CXS3VRUkIX61QdN54CU7ZeT4cAzZGpkUP6elfsrLv0KnQc4KvvzfBNu71j3xgjjYN41aGDNi8dqWaCVebYbuQtDqbcxLxUQNX+VqBdCflMcnCOC4kAEI+B2n/rUrGLWjKUIMhZvZIKJQd437j1fvJo2AHO8TbqtORspg3/H8OuwZpwcDsWl1dVQ1B0EczZweo3I5NkytTVxNEEXjsQA== + connections.celeryBrokerUrl: AgBEl833Xp1UogzJpkpJ1zhjlw6KKAqcfWzSqQ8LIPQ96GaIUfo6G8wx7jozw7yEF0vnAuTTdzdEZ7x8/PVwWQyqNJKiS9o6mIEdkhv9mQ+EG/wzpB8dnbQR4Xl758f+dPRqbIA0RYetmcD9NsiF08obXIIzZA+G95kR6x24WiixwJL+txMNdno0Qu92fRqasv6jV22CUju/kUTRFEov5IrzGOj7gLKQ7d2yrCGZd/W9SnP9sgX1ltz78C2yiEXX7aI0n066OjJUxE7DFTJCUWNrknDcJuSjGFrWTzf8GNydrPmkVp6g5JA3fGgUTm76osischHr/0/+cwzQzEyQKyb5H/fxcAd/5yqtXhD/xibPDoVHs484PQAmgy8M3PMG8fNQ9XyrXNB/ZuxcCnt+rqPkeP0jqEsdxog2Q3U1lXfH/FU2eJr5tLHb1zNISV7vNX28VRzLoefyYFtHkp1F2yVYThmuSCPj1cqkfOpt02rYsIDIYqwryxxOvUpTAH0uNbdoIWSvXTzX2ZARUVVm0bboDgfe4RxVQofxKjk1mNPHhEZ9jYd6GX1G1SCYuSVdrRN4fLSOxlyP+vPkyzOJtQ7WmugBZFTmZ/iUN38ce4HbDIajVKtMvDqD35kkN/q4NZ3d+/YjmZA9YvJ03Hd0XNznImr8R4wqOt5oZsK2+XaMxHTzPfxV2MpLT9Xgb+CAHiGKvCaheKdRNWODhFQQXAw8l6t4z8dvYNkZPAZAD6ehFUtlvpTbHVVqtEdiTA== + connections.celeryResultBackend: AgBywQulzF0AZOPR8ypHDnsQIicOWUri9rV2sLwR8kiD+J98eT6CWvblzUv8x3/I4gJWwHbwjmACv5Ke+MD1GxqVsJYl2zc/A78SkVvNT6V+kaUFqxXMEQ3EJN7q+BHUPFphxQDS2Ur5+ssON1hth56L+HAxZLmt4XC9Fjz20cO7Dcx+vpgXG7KVtdRmLvchs0PCaMnMZDANg/rgGC9lMcgi3BROhobGapbp3+iLjiIDtNJ4SwwQpQaA5KWKXqC8Dmfvtm18lyNAK5oWSrMQI6+eWe+ML56C8bMlz3jtlZsFO6upe7eOueD1WoK1+YI+NEfvw3HDChgMaQ559x3y/pIG94F7QNtltZbfTfXptStQru+H2rxmCUBYb/BaHv3oqZsOgQe95LubQNfrpH9tIIygGZcQDZGjZsnfjmu1ahYzqiKb6UEoPxZJskIMy5BAakWQf0FiVJQa7stt7/k/NosBrUfJbyPJNWA6xVwilV7K4Auz4MuBsMk1fRofgpw3N85SeipVmU3673GIs+L1IFy8UEYAtYpv14aFOvqJrE4YBpkufr+K/IvVpYfvIBL2zAF3CKm9SEzYAQnADwb3UgOCIm8w233vogjHo5oqL8wacUeZgzrZ+T1FIR9e1tXrYxk2VLmyv5d0VOWYe0AleUk+O3rVdLpi5yUJQjvKnExVXzMMLsApTJ3dy5OHwou99Po1mlg2D6xh439hDUlAcUQz4NfGYvJtYSgAb5cjMs3bEMUcAuadGIGidlIy74HQArfXosundworwKC8 + connections.secretKey: AgBpwR5AZJUjGxJwi7rS6dLH7WJKYza4wKjPxLF+RVskwtwtkGtYSpbRZ+vXxE6pn47eJQC0OpJzreiNqYZtSR1CHv6HyHZsnqCSnLSzlUBCPp9H51nfVQ57V+S967/jEVJ3V7446gqQqdJb3IS4uwbb+G8CJsjsZiEcwx/z/OK5vu+k7TiG5jiyksxXhC7EFzYKfc/CD8Lsr6LBimUEa2i1W/PhOoDcqKa7qvDMIM/iAEilvtHXjA+EU8kxplDYy2an1cadockyyMSoHvDmSOg6BU62bK8Xqx9o0X6uaSrTufeueymtBYb/wVHB0bTxm1UXb8QdGYfDePemnP0oRNwvETrupuD0HRgEutetyxLYEEezC98ZpRM377kirX9Zqb0/fZ9YVwECBL7hznl/sp8w1hE2O76orf3iAGNMftrFtOjEyzro+41zd+bz+sy1ivGluIWwovQbgondk25AoYRC0LhGDl7kQDVX3ND/XeH2NYErAuCEyjQ1MGHLJxQGGDxoCPaDXtLMuHvXlg3H71jibzT7rV+YikAExjfUVim0kuDtKqdBwAhvRqX+Si/kCRMrIUhRowWSqx0g54U9mwC6wfbSHV90RnYtvBPbFc144WbgV7irc5bfnekidrCj8MiIPKegUByqlB26ziyexEmiRN74BH2yCJ/M2yf1IWSad0uqb5d/48BcgEP8E2BOgeeaCJ6WOMeR80qvas07hN5e + connections.sqlalchemyDatabaseUri: AgAFm5FacxXw3q9rxKT+9eTpY3FPf7NSp3wdPUUzkBpQPsEa0JvafDeIZ5/+MC9WaFBWuSt0awrIh/FyHlNW4/KRhTWzFL4h2MrDAfCEdCaOgB4wrgYJF7tGz3968eNhBn0ALX7MU6dgiGawPGvX91FgPo4dwz/5Ob5+f5MhA/paH8uBXR8W96cTTeJlcJaqLV/xMzGCInurUpOwyrLWu8zjOHNdn/11P3n5gKVlwbi6w57AKAYtqux869oh9al4kIbgIEbRYRI42Q2Xa3v+RtmFCX3CelCs6uoWtzNgt+wUbQbfi48MuHrakiJf49yrqFHdc2vfj03O8jlKLGSGcSsy5Epbb1VBuTh04jVXAO03xb6Top3gqZvxY8/gWOWPs0SejeilvubNIwj40bhzRxPj+r7TnE2dmS+KnTN1fYR1fk39C6SNjSKVncMie8PH/xfq8WOVZSGhzlIwYNMs7/WpXYLVs58Wz+pVVRcbYf/CQjRNKy4ikEf+eHwMLvmsvHnslxr9S9Bwt2An7mFkkO0VvGubCYfOK/W1SoN9NBhFmJO6Es3vfTKuS1gqgcJAzd1oz0+hz6Kno8XRpZUzdUa+P8LPo4Y+mhif+y9OH0sXFH5rYGWvLbUxEgFfdUMWQRKpGRqJiGNKFBLo0kpRt/DqG3v9wcWHbYLl+/cRLCsC46FUsPW5L73T4AEtV3TLh6Q5hZiHCWTEyxW4WyeFD6Bd7FLPNbIA8gMD0oCP3ztd+odbSDecURUzhQifICH/SCJl4VH8jvr40Rd+TjrqEj5t + template: + metadata: + creationTimestamp: null + name: airflow-credentials + namespace: stackable-airflow + type: Opaque diff --git a/stacks/argo-cd/secrets/sealed-secrets-key.yaml b/stacks/argo-cd/secrets/sealed-secrets-key.yaml new file mode 100644 index 00000000..60e7e522 --- /dev/null +++ b/stacks/argo-cd/secrets/sealed-secrets-key.yaml @@ -0,0 +1,90 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: sealed-secrets-key +stringData: + tls.crt: | + -----BEGIN CERTIFICATE----- + MIIFEzCCAvugAwIBAgIUTIeBhvXRk1w2QJRP2RpyQWJCB48wDQYJKoZIhvcNAQEL + BQAwGTEXMBUGA1UEAwwOc2VhbGVkLXNlY3JldHMwHhcNMjUwNDExMTk1NzUzWhcN + MjYwNDExMTk1NzUzWjAZMRcwFQYDVQQDDA5zZWFsZWQtc2VjcmV0czCCAiIwDQYJ + KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMobRqdxhAE8Nr45tCRRI6kz2WopwnKb + 8bWGM0LbM/p04xfcLLAVzK4nC5HHBmfPycz6XyGjv7ViUSaHVk1j3OLxFEX4sd+2 + JoTQRenRc/oUHdwaGskBr5frXFAO3Tiou+pJ6Tu8ewCeCvGUzB9HtiRq5pCGPu6M + wzXbmR6GKaCJTu80LZ8fwFdSWI0gDoqeWffCTfcTgJfTa+DgMfTM3zzUNwJVfLo3 + r596wGmlxKfMcUtzw2J5iLr0dXJuJnlmA0gU31kwVcf8Wo1DAdh8hhxmUAkmGss8 + AktmB8OvvNygVVzzwmX/L2MH1zPXzgM9sYenkJwLSZhMx/uyfgX5x54/QaC7lwfk + wPnp52pK0JA2VmfFBsvlnPsVOWgwWU0jUtMGBtKlu/OonELAGaffbkhjD3eDe0B3 + X0gwtju+T4WCzQmgTFyXFdp18/S2rz19TBrq2XponRRpcXBo4qe8P59Eq++NNjAg + rYymFcTfrDZqMIt3jBv3jSnLlAnwg/H1neRfgx6kxXqxApF+vMDD7VVDaLYnLbFV + lwdkWxPrHStk05eBsLu/CkGv2ykkUAa0qqg/Dm/bkOl5lZlauVFC9wuiLh2cHgZr + tBpGuYlMFMRvx7A0+IBUTjTQswBF1+mBStUyBThOw1aJYbE2FCWj+lGrMX8qr+ad + sKsS+5DjOwCVAgMBAAGjUzBRMB0GA1UdDgQWBBRFs1lkbmy+f7TN10DGuHLa75sj + BDAfBgNVHSMEGDAWgBRFs1lkbmy+f7TN10DGuHLa75sjBDAPBgNVHRMBAf8EBTAD + AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQA+6nknVdXMATXxbyk0E5fDlM/D2aceDw6D + 3kydc6wBT6k9SkhxFtrCI0IBO0f067ppFPj4ApJI0mrh3dsNiAzjqGetlGCqXjKq + pwdVxWYrmn/ELTKgvxToQG4J4PMUeo7tlhviU5HJo90DroDpoZHALubl+XsjzspA + MHH94CiF24z2nxoVolVa1qqq7WDlMWhZuit3WDo+jIgrpBgcPegNrZqrZqt/xlzM + Q91iOwwd3ykfo+xLdNuG1i8Qm1UFOEmXsustHBPDCtcI/ddLda4NbZtrNeZVmDbE + Px4Zzsjrbd6IKhVbdD5E4d9K/XMNsBIl4sidqdaUMhkNTYXkI/a5dTFVlFprLFnM + yB7A6OplQPp+LTITXW2IvD/eZetdl5073X0OQtuJrsm4mAJZ74sqXgcyVs7bGPIw + aXt1ttNH0qA5lvbp0cOIdXmpSWQfDRvlAExqX4p86549J3GMhIsVCMw5KsqduN5e + rSi0HCi24S8CeXiYV1phkSuxf0sROPuRb8SvY/6qcb73DMEMQx3zPWLV/+pG7DcG + uD327xvb3uJG0kFLi4MDnoCHLHYZeoPtwIEwG+1LjwHj+oKn12wlKJvYTxWALi4k + tKVW3QYL8beLaI3XfF+Vd3kCVpU6N9aRt3l+PpzkE1VCkayz67Sf5dJy88YIB7o4 + A08j/AH+GA== + -----END CERTIFICATE----- + tls.key: | + -----BEGIN PRIVATE KEY----- + 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 + w6IEdTFRspEvNwyrTH9geMzYmqbIsA== + -----END PRIVATE KEY----- diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 89befdf7..6fa318c9 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -1,7 +1,7 @@ --- stacks: argocd: - description: TODO + description: Deploying Stackable Demos with ArgoCD stackableRelease: dev # TODO: We actually want to deploy all operators via ArgoCD, but we currently *have to* install # operators with stackablectl. Therefore we install the internal operators via stackablectl. @@ -12,20 +12,32 @@ stacks: - secret labels: - argocd + - sealed secrets manifests: - helmChart: stacks/_templates/argo-cd.yaml + ################################ # projects + ################################ - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml - plainYaml: stacks/argo-cd/projects/airflow.yaml + ################################ # operators + ################################ # currently deployed via stackablectl since it complains if no operators are deployed... #- plainYaml: stacks/argo-cd/applicationsets/commons-operator.yaml #- plainYaml: stacks/argo-cd/applicationsets/listener-operator.yaml #- plainYaml: stacks/argo-cd/applicationsets/secret-operator.yaml - plainYaml: stacks/argo-cd/applicationsets/airflow-operator.yaml - plainYaml: stacks/argo-cd/applicationsets/spark-k8s-operator.yaml - # products + ################################ + # prerequisites + ################################ + - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml - plainYaml: stacks/argo-cd/applications/airflow-postgres.yaml + ################################ + # products + ################################ + # via argo - plainYaml: stacks/argo-cd/applications/airflow.yaml supportedNamespaces: - argo-cd @@ -47,12 +59,6 @@ stacks: description: Password of the ArgoCD admin user # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` default: $2y$10$HhJC3pGHTlk8RyBoS39N/.wC72mdWxV2X8QS1wROUwCFxl.2tGfky - - name: airflowAdminPassword - description: Password of the Airflow admin user - default: adminadmin - - name: airflowSecretKey - description: Airflow's secret key used to generate e.g. user session tokens - default: airflowSecretKey monitoring: description: Stack containing Prometheus and Grafana stackableRelease: dev From 15612f7eb363274e932fbf168bbc31bfb6faa92c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 22:59:22 +0200 Subject: [PATCH 005/101] fix sealed secret location --- stacks/argo-cd/applications/sealed-secrets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index 7faa76b4..27310ea5 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -15,7 +15,7 @@ spec: secretName: sealed-secrets-key - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release - targetRevision: HEAD + targetRevision: spike/argocd-demo path: stacks/argo-cd/secrets/ destination: server: https://kubernetes.default.svc From e81624d7042b0f1addbe19fe5281b39de37ec07c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 23:03:13 +0200 Subject: [PATCH 006/101] fix demo branches --- stacks/argo-cd/applications/sealed-secrets.yaml | 2 +- stacks/stacks-v2.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index 27310ea5..aef6042a 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -15,7 +15,7 @@ spec: secretName: sealed-secrets-key - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release - targetRevision: spike/argocd-demo + targetRevision: "{{ demoTargetRevision }}" path: stacks/argo-cd/secrets/ destination: server: https://kubernetes.default.svc diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 6fa318c9..47080633 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -51,7 +51,8 @@ stacks: default: 25.3.0 - name: demoTargetRevision description: The target revision, HEAD or e.g. release-25.3 - default: release-25.3 + #default: release-25.3 + default: spike/argocd-demo - name: stackableOperatorNamespace description: Stackable namespace for the operators default: stackable-operators From 822dee502614ec04d8e040665f5101da40fb7416 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 23:05:02 +0200 Subject: [PATCH 007/101] fixes --- stacks/argo-cd/applications/airflow.yaml | 2 +- stacks/argo-cd/applications/sealed-secrets.yaml | 3 +-- stacks/stacks-v2.yaml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/stacks/argo-cd/applications/airflow.yaml b/stacks/argo-cd/applications/airflow.yaml index 9db9f6a7..dcd20380 100644 --- a/stacks/argo-cd/applications/airflow.yaml +++ b/stacks/argo-cd/applications/airflow.yaml @@ -9,7 +9,7 @@ spec: server: https://kubernetes.default.svc source: repoURL: https://github.com/stackabletech/demos.git - targetRevision: "{{ demoTargetRevision }}" + targetRevision: "{{ demoReleaseVersion }}" path: stacks/argo-cd/manifests/airflow/ syncPolicy: syncOptions: diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index aef6042a..145df9de 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -14,8 +14,7 @@ spec: valuesObject: secretName: sealed-secrets-key - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release - targetRevision: "{{ demoTargetRevision }}" + targetRevision: "{{ demoReleaseVersion }}" path: stacks/argo-cd/secrets/ destination: server: https://kubernetes.default.svc diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 47080633..f8a7d0bc 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -49,7 +49,7 @@ stacks: - name: stackableReleaseVersion description: Stackable release to be installed via Argo default: 25.3.0 - - name: demoTargetRevision + - name: demoReleaseVersion description: The target revision, HEAD or e.g. release-25.3 #default: release-25.3 default: spike/argocd-demo From 4bf262686fed388a6aecfbed1d9336109b2e0bdb Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 23:17:37 +0200 Subject: [PATCH 008/101] add role and binding for airflow / spark --- .../airflow/airflow-spark-clusterrole.yaml | 36 +++++++++++++++++++ .../airflow-spark-clusterrolebinding.yaml | 13 +++++++ 2 files changed, 49 insertions(+) create mode 100644 stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml create mode 100644 stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml diff --git a/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml b/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml new file mode 100644 index 00000000..66abed2f --- /dev/null +++ b/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: airflow-spark-clusterrole +rules: + - apiGroups: + - spark.stackable.tech + resources: + - sparkapplications + verbs: + - create + - get + - list + - apiGroups: + - airflow.stackable.tech + resources: + - airflowdbs + verbs: + - create + - get + - list + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - get + - watch + - list + - apiGroups: + - "" + resources: + - persistentvolumeclaims + verbs: + - list diff --git a/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml b/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml new file mode 100644 index 00000000..1f9e1b5d --- /dev/null +++ b/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: airflow-spark-clusterrole-binding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: airflow-spark-clusterrole +subjects: + - apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:serviceaccounts From b1e33bc706814e876c3be6e305971ae57d11b580 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Fri, 11 Apr 2025 23:19:02 +0200 Subject: [PATCH 009/101] remove ns --- stacks/argo-cd/manifests/airflow/airflow.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml index 703f409c..a3399671 100644 --- a/stacks/argo-cd/manifests/airflow/airflow.yaml +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -4,7 +4,6 @@ apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster metadata: name: airflow - namespace: stackable-airflow spec: image: productVersion: 2.10.4 @@ -66,7 +65,6 @@ apiVersion: v1 kind: ConfigMap metadata: name: airflow-dags - namespace: stackable-airflow data: date_demo.py: | """Example DAG returning the current date""" From f8ab04351e989238abe1354955d8d1f5810ca2c5 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sat, 12 Apr 2025 01:19:00 +0200 Subject: [PATCH 010/101] test minio --- stacks/argo-cd/applications/minio.yaml | 44 +++++++++++++++++++ stacks/argo-cd/manifests/airflow/airflow.yaml | 14 +++--- stacks/argo-cd/projects/minio.yaml | 14 ++++++ stacks/stacks-v2.yaml | 4 +- 4 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 stacks/argo-cd/applications/minio.yaml create mode 100644 stacks/argo-cd/projects/minio.yaml diff --git a/stacks/argo-cd/applications/minio.yaml b/stacks/argo-cd/applications/minio.yaml new file mode 100644 index 00000000..76ec47d3 --- /dev/null +++ b/stacks/argo-cd/applications/minio.yaml @@ -0,0 +1,44 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: minio +spec: + project: minio + destination: + server: https://kubernetes.default.svc + namespace: minio + source: + repoURL: https://charts.min.io/ + targetRevision: 5.4.0 # RELEASE.2024-12-18T13-15-44Z + chart: minio + helm: + releaseName: minio + valuesObject: + additionalLabels: + stackable.tech/vendor: Stackable + podLabels: + stackable.tech/vendor: Stackable + rootUser: admin + rootPassword: adminadmin + mode: standalone + persistence: + size: 10Gi + buckets: + - name: demo + policy: public + resources: + requests: + cpu: 1 + memory: 2Gi + service: + type: NodePort + nodePort: null + consoleService: + type: NodePort + nodePort: null + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml index a3399671..ce4975ad 100644 --- a/stacks/argo-cd/manifests/airflow/airflow.yaml +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -37,14 +37,16 @@ spec: gracefulShutdownTimeout: 30s roleGroups: default: - envOverrides: + envOverrides: &envOverrides AIRFLOW__CORE__DAGS_FOLDER: "/dags" AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + AIRFLOW_CONN_MINIO_DEFAULT: "s3://admin:adminadmin@minio.minio.svc.cluster.local:9000?extra=%7B%22aws_access_key_id%22%3A%22admin%22%2C%22aws_secret_access_key%22%3A%22adminadmin%22%2C%22endpoint_url%22%3A%22https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000%22%7D" + AIRFLOW__LOGGING__REMOTE_LOGGING: "True" + AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ + AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio_default replicas: 1 kubernetesExecutors: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + envOverrides: *envOverrides schedulers: config: gracefulShutdownTimeout: 30s @@ -56,9 +58,7 @@ spec: limit: 1Gi roleGroups: default: - envOverrides: - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + envOverrides: *envOverrides replicas: 1 --- apiVersion: v1 diff --git a/stacks/argo-cd/projects/minio.yaml b/stacks/argo-cd/projects/minio.yaml new file mode 100644 index 00000000..aaa033ba --- /dev/null +++ b/stacks/argo-cd/projects/minio.yaml @@ -0,0 +1,14 @@ +apiVersion: argoproj.io/v1alpha1 +kind: AppProject +metadata: + name: minio +spec: + description: Project to manage Minio via Helm + sourceRepos: + - "*" + destinations: + - namespace: minio + server: https://kubernetes.default.svc + clusterResourceWhitelist: + - group: "*" + kind: "*" diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index f8a7d0bc..35e45149 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -13,6 +13,7 @@ stacks: labels: - argocd - sealed secrets + - airflow manifests: - helmChart: stacks/_templates/argo-cd.yaml ################################ @@ -20,6 +21,7 @@ stacks: ################################ - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml - plainYaml: stacks/argo-cd/projects/airflow.yaml + - plainYaml: stacks/argo-cd/projects/minio.yaml ################################ # operators ################################ @@ -34,10 +36,10 @@ stacks: ################################ - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml - plainYaml: stacks/argo-cd/applications/airflow-postgres.yaml + - plainYaml: stacks/argo-cd/applications/minio.yaml ################################ # products ################################ - # via argo - plainYaml: stacks/argo-cd/applications/airflow.yaml supportedNamespaces: - argo-cd From 3d8e66429512c9e4a87e195080cc13acd78ef427 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sat, 12 Apr 2025 01:22:46 +0200 Subject: [PATCH 011/101] fix sync policy --- stacks/argo-cd/applications/minio.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stacks/argo-cd/applications/minio.yaml b/stacks/argo-cd/applications/minio.yaml index 76ec47d3..d78139a0 100644 --- a/stacks/argo-cd/applications/minio.yaml +++ b/stacks/argo-cd/applications/minio.yaml @@ -36,9 +36,9 @@ spec: consoleService: type: NodePort nodePort: null - syncPolicy: - syncOptions: - - CreateNamespace=true - automated: - selfHeal: true - prune: true + syncPolicy: + syncOptions: + - CreateNamespace=true + automated: + selfHeal: true + prune: true From 150fd766a3437d1c135493296689e4f0d028afad Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sat, 12 Apr 2025 01:58:24 +0200 Subject: [PATCH 012/101] testing --- stacks/argo-cd/applications/minio.yaml | 31 +- stacks/argo-cd/manifests/airflow/airflow.yaml | 2 +- stacks/argo-cd/manifests/minio/minio.yaml | 712 ++++++++++++++++++ 3 files changed, 716 insertions(+), 29 deletions(-) create mode 100644 stacks/argo-cd/manifests/minio/minio.yaml diff --git a/stacks/argo-cd/applications/minio.yaml b/stacks/argo-cd/applications/minio.yaml index d78139a0..05d27e88 100644 --- a/stacks/argo-cd/applications/minio.yaml +++ b/stacks/argo-cd/applications/minio.yaml @@ -8,34 +8,9 @@ spec: server: https://kubernetes.default.svc namespace: minio source: - repoURL: https://charts.min.io/ - targetRevision: 5.4.0 # RELEASE.2024-12-18T13-15-44Z - chart: minio - helm: - releaseName: minio - valuesObject: - additionalLabels: - stackable.tech/vendor: Stackable - podLabels: - stackable.tech/vendor: Stackable - rootUser: admin - rootPassword: adminadmin - mode: standalone - persistence: - size: 10Gi - buckets: - - name: demo - policy: public - resources: - requests: - cpu: 1 - memory: 2Gi - service: - type: NodePort - nodePort: null - consoleService: - type: NodePort - nodePort: null + repoURL: https://github.com/stackabletech/demos.git + targetRevision: "{{ demoReleaseVersion }}" + path: stacks/argo-cd/manifests/minio/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml index ce4975ad..dc155030 100644 --- a/stacks/argo-cd/manifests/airflow/airflow.yaml +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -40,7 +40,7 @@ spec: envOverrides: &envOverrides AIRFLOW__CORE__DAGS_FOLDER: "/dags" AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" - AIRFLOW_CONN_MINIO_DEFAULT: "s3://admin:adminadmin@minio.minio.svc.cluster.local:9000?extra=%7B%22aws_access_key_id%22%3A%22admin%22%2C%22aws_secret_access_key%22%3A%22adminadmin%22%2C%22endpoint_url%22%3A%22https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000%22%7D" + AIRFLOW_CONN_MINIO_DEFAULT: "s3://admin:adminadmin@minio.minio.svc.cluster.local:9000?extra=%7B%22endpoint_url%22%3A%22https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000%22%7D" AIRFLOW__LOGGING__REMOTE_LOGGING: "True" AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio_default diff --git a/stacks/argo-cd/manifests/minio/minio.yaml b/stacks/argo-cd/manifests/minio/minio.yaml new file mode 100644 index 00000000..8681086f --- /dev/null +++ b/stacks/argo-cd/manifests/minio/minio.yaml @@ -0,0 +1,712 @@ +--- +# Source: minio/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: "minio-sa" +--- +# Source: minio/templates/secrets.yaml +apiVersion: v1 +kind: Secret +metadata: + name: minio + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm +type: Opaque +data: + rootUser: "YWRtaW4=" + rootPassword: "YWRtaW5hZG1pbg==" +--- +# Source: minio/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: minio + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm +data: + initialize: |- + #!/bin/sh + set -e # Have script exit in the event of a failed command. + MC_CONFIG_DIR="/etc/minio/mc/" + MC="/usr/bin/mc --insecure --config-dir ${MC_CONFIG_DIR}" + + # connectToMinio + # Use a check-sleep-check loop to wait for MinIO service to be available + connectToMinio() { + SCHEME=$1 + ATTEMPTS=0 + LIMIT=29 # Allow 30 attempts + set -e # fail if we can't read the keys. + ACCESS=$(cat /config/rootUser) + SECRET=$(cat /config/rootPassword) + set +e # The connections to minio are allowed to fail. + echo "Connecting to MinIO server: $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT" + MC_COMMAND="${MC} alias set myminio $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT $ACCESS $SECRET" + $MC_COMMAND + STATUS=$? + until [ $STATUS = 0 ]; do + ATTEMPTS=$(expr $ATTEMPTS + 1) + echo \"Failed attempts: $ATTEMPTS\" + if [ $ATTEMPTS -gt $LIMIT ]; then + exit 1 + fi + sleep 2 # 1 second intervals between attempts + $MC_COMMAND + STATUS=$? + done + set -e # reset `e` as active + return 0 + } + + # checkBucketExists ($bucket) + # Check if the bucket exists, by using the exit code of `mc ls` + checkBucketExists() { + BUCKET=$1 + CMD=$(${MC} stat myminio/$BUCKET >/dev/null 2>&1) + return $? + } + + # createBucket ($bucket, $policy, $purge) + # Ensure bucket exists, purging if asked to + createBucket() { + BUCKET=$1 + POLICY=$2 + PURGE=$3 + VERSIONING=$4 + OBJECTLOCKING=$5 + + # Purge the bucket, if set & exists + # Since PURGE is user input, check explicitly for `true` + if [ $PURGE = true ]; then + if checkBucketExists $BUCKET; then + echo "Purging bucket '$BUCKET'." + set +e # don't exit if this fails + ${MC} rm -r --force myminio/$BUCKET + set -e # reset `e` as active + else + echo "Bucket '$BUCKET' does not exist, skipping purge." + fi + fi + + # Create the bucket if it does not exist and set objectlocking if enabled (NOTE: versioning will be not changed if OBJECTLOCKING is set because it enables versioning to the Buckets created) + if ! checkBucketExists $BUCKET; then + if [ ! -z $OBJECTLOCKING ]; then + if [ $OBJECTLOCKING = true ]; then + echo "Creating bucket with OBJECTLOCKING '$BUCKET'" + ${MC} mb --with-lock myminio/$BUCKET + elif [ $OBJECTLOCKING = false ]; then + echo "Creating bucket '$BUCKET'" + ${MC} mb myminio/$BUCKET + fi + elif [ -z $OBJECTLOCKING ]; then + echo "Creating bucket '$BUCKET'" + ${MC} mb myminio/$BUCKET + else + echo "Bucket '$BUCKET' already exists." + fi + fi + + # set versioning for bucket if objectlocking is disabled or not set + if [ $OBJECTLOCKING = false ]; then + if [ ! -z $VERSIONING ]; then + if [ $VERSIONING = true ]; then + echo "Enabling versioning for '$BUCKET'" + ${MC} version enable myminio/$BUCKET + elif [ $VERSIONING = false ]; then + echo "Suspending versioning for '$BUCKET'" + ${MC} version suspend myminio/$BUCKET + fi + fi + else + echo "Bucket '$BUCKET' versioning unchanged." + fi + + # At this point, the bucket should exist, skip checking for existence + # Set policy on the bucket + echo "Setting policy of bucket '$BUCKET' to '$POLICY'." + ${MC} anonymous set $POLICY myminio/$BUCKET + } + + # Try connecting to MinIO instance + scheme=https + connectToMinio $scheme + + + + # Create the buckets + createBucket demo "public" false false false + + add-user: |- + #!/bin/sh + set -e ; # Have script exit in the event of a failed command. + MC_CONFIG_DIR="/etc/minio/mc/" + MC="/usr/bin/mc --insecure --config-dir ${MC_CONFIG_DIR}" + + # AccessKey and secretkey credentials file are added to prevent shell execution errors caused by special characters. + # Special characters for example : ',",<,>,{,} + MINIO_ACCESSKEY_SECRETKEY_TMP="/tmp/accessKey_and_secretKey_tmp" + + # connectToMinio + # Use a check-sleep-check loop to wait for MinIO service to be available + connectToMinio() { + SCHEME=$1 + ATTEMPTS=0 ; LIMIT=29 ; # Allow 30 attempts + set -e ; # fail if we can't read the keys. + ACCESS=$(cat /config/rootUser) ; SECRET=$(cat /config/rootPassword) ; + set +e ; # The connections to minio are allowed to fail. + echo "Connecting to MinIO server: $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT" ; + MC_COMMAND="${MC} alias set myminio $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT $ACCESS $SECRET" ; + $MC_COMMAND ; + STATUS=$? ; + until [ $STATUS = 0 ] + do + ATTEMPTS=`expr $ATTEMPTS + 1` ; + echo \"Failed attempts: $ATTEMPTS\" ; + if [ $ATTEMPTS -gt $LIMIT ]; then + exit 1 ; + fi ; + sleep 2 ; # 1 second intervals between attempts + $MC_COMMAND ; + STATUS=$? ; + done ; + set -e ; # reset `e` as active + return 0 + } + + # checkUserExists () + # Check if the user exists, by using the exit code of `mc admin user info` + checkUserExists() { + CMD=$(${MC} admin user info myminio $(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) > /dev/null 2>&1) + return $? + } + + # createUser ($policy) + createUser() { + POLICY=$1 + #check accessKey_and_secretKey_tmp file + if [[ ! -f $MINIO_ACCESSKEY_SECRETKEY_TMP ]];then + echo "credentials file does not exist" + return 1 + fi + if [[ $(cat $MINIO_ACCESSKEY_SECRETKEY_TMP|wc -l) -ne 2 ]];then + echo "credentials file is invalid" + rm -f $MINIO_ACCESSKEY_SECRETKEY_TMP + return 1 + fi + USER=$(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) + # Create the user if it does not exist + if ! checkUserExists ; then + echo "Creating user '$USER'" + cat $MINIO_ACCESSKEY_SECRETKEY_TMP | ${MC} admin user add myminio + else + echo "User '$USER' already exists." + fi + #clean up credentials files. + rm -f $MINIO_ACCESSKEY_SECRETKEY_TMP + + # set policy for user + if [ ! -z $POLICY -a $POLICY != " " ] ; then + echo "Adding policy '$POLICY' for '$USER'" + set +e ; # policy already attach errors out, allow it. + ${MC} admin policy attach myminio $POLICY --user=$USER + set -e + else + echo "User '$USER' has no policy attached." + fi + } + + # Try connecting to MinIO instance + scheme=https + connectToMinio $scheme + + + + # Create the users + echo console > $MINIO_ACCESSKEY_SECRETKEY_TMP + echo console123 >> $MINIO_ACCESSKEY_SECRETKEY_TMP + createUser consoleAdmin + + add-policy: |- + #!/bin/sh + set -e ; # Have script exit in the event of a failed command. + MC_CONFIG_DIR="/etc/minio/mc/" + MC="/usr/bin/mc --insecure --config-dir ${MC_CONFIG_DIR}" + + # connectToMinio + # Use a check-sleep-check loop to wait for MinIO service to be available + connectToMinio() { + SCHEME=$1 + ATTEMPTS=0 ; LIMIT=29 ; # Allow 30 attempts + set -e ; # fail if we can't read the keys. + ACCESS=$(cat /config/rootUser) ; SECRET=$(cat /config/rootPassword) ; + set +e ; # The connections to minio are allowed to fail. + echo "Connecting to MinIO server: $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT" ; + MC_COMMAND="${MC} alias set myminio $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT $ACCESS $SECRET" ; + $MC_COMMAND ; + STATUS=$? ; + until [ $STATUS = 0 ] + do + ATTEMPTS=`expr $ATTEMPTS + 1` ; + echo \"Failed attempts: $ATTEMPTS\" ; + if [ $ATTEMPTS -gt $LIMIT ]; then + exit 1 ; + fi ; + sleep 2 ; # 1 second intervals between attempts + $MC_COMMAND ; + STATUS=$? ; + done ; + set -e ; # reset `e` as active + return 0 + } + + # checkPolicyExists ($policy) + # Check if the policy exists, by using the exit code of `mc admin policy info` + checkPolicyExists() { + POLICY=$1 + CMD=$(${MC} admin policy info myminio $POLICY > /dev/null 2>&1) + return $? + } + + # createPolicy($name, $filename) + createPolicy () { + NAME=$1 + FILENAME=$2 + + # Create the name if it does not exist + echo "Checking policy: $NAME (in /config/$FILENAME.json)" + if ! checkPolicyExists $NAME ; then + echo "Creating policy '$NAME'" + else + echo "Policy '$NAME' already exists." + fi + ${MC} admin policy create myminio $NAME /config/$FILENAME.json + + } + + # Try connecting to MinIO instance + scheme=https + connectToMinio $scheme + + add-svcacct: |- + #!/bin/sh + set -e ; # Have script exit in the event of a failed command. + MC_CONFIG_DIR="/etc/minio/mc/" + MC="/usr/bin/mc --insecure --config-dir ${MC_CONFIG_DIR}" + + # AccessKey and secretkey credentials file are added to prevent shell execution errors caused by special characters. + # Special characters for example : ',",<,>,{,} + MINIO_ACCESSKEY_SECRETKEY_TMP="/tmp/accessKey_and_secretKey_svcacct_tmp" + + # connectToMinio + # Use a check-sleep-check loop to wait for MinIO service to be available + connectToMinio() { + SCHEME=$1 + ATTEMPTS=0 ; LIMIT=29 ; # Allow 30 attempts + set -e ; # fail if we can't read the keys. + ACCESS=$(cat /config/rootUser) ; SECRET=$(cat /config/rootPassword) ; + set +e ; # The connections to minio are allowed to fail. + echo "Connecting to MinIO server: $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT" ; + MC_COMMAND="${MC} alias set myminio $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT $ACCESS $SECRET" ; + $MC_COMMAND ; + STATUS=$? ; + until [ $STATUS = 0 ] + do + ATTEMPTS=`expr $ATTEMPTS + 1` ; + echo \"Failed attempts: $ATTEMPTS\" ; + if [ $ATTEMPTS -gt $LIMIT ]; then + exit 1 ; + fi ; + sleep 2 ; # 2 second intervals between attempts + $MC_COMMAND ; + STATUS=$? ; + done ; + set -e ; # reset `e` as active + return 0 + } + + # checkSvcacctExists () + # Check if the svcacct exists, by using the exit code of `mc admin user svcacct info` + checkSvcacctExists() { + CMD=$(${MC} admin user svcacct info myminio $(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) > /dev/null 2>&1) + return $? + } + + # createSvcacct ($user) + createSvcacct () { + USER=$1 + FILENAME=$2 + #check accessKey_and_secretKey_tmp file + if [[ ! -f $MINIO_ACCESSKEY_SECRETKEY_TMP ]];then + echo "credentials file does not exist" + return 1 + fi + if [[ $(cat $MINIO_ACCESSKEY_SECRETKEY_TMP|wc -l) -ne 2 ]];then + echo "credentials file is invalid" + rm -f $MINIO_ACCESSKEY_SECRETKEY_TMP + return 1 + fi + SVCACCT=$(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) + # Create the svcacct if it does not exist + if ! checkSvcacctExists ; then + echo "Creating svcacct '$SVCACCT'" + # Check if policy file is define + if [ -z $FILENAME ]; then + ${MC} admin user svcacct add --access-key $(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) --secret-key $(tail -n1 $MINIO_ACCESSKEY_SECRETKEY_TMP) myminio $USER + else + ${MC} admin user svcacct add --access-key $(head -1 $MINIO_ACCESSKEY_SECRETKEY_TMP) --secret-key $(tail -n1 $MINIO_ACCESSKEY_SECRETKEY_TMP) --policy /config/$FILENAME.json myminio $USER + fi + else + echo "Svcacct '$SVCACCT' already exists." + fi + #clean up credentials files. + rm -f $MINIO_ACCESSKEY_SECRETKEY_TMP + } + + # Try connecting to MinIO instance + scheme=https + connectToMinio $scheme + + custom-command: |- + #!/bin/sh + set -e ; # Have script exit in the event of a failed command. + MC_CONFIG_DIR="/etc/minio/mc/" + MC="/usr/bin/mc --insecure --config-dir ${MC_CONFIG_DIR}" + + # connectToMinio + # Use a check-sleep-check loop to wait for MinIO service to be available + connectToMinio() { + SCHEME=$1 + ATTEMPTS=0 ; LIMIT=29 ; # Allow 30 attempts + set -e ; # fail if we can't read the keys. + ACCESS=$(cat /config/rootUser) ; SECRET=$(cat /config/rootPassword) ; + set +e ; # The connections to minio are allowed to fail. + echo "Connecting to MinIO server: $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT" ; + MC_COMMAND="${MC} alias set myminio $SCHEME://$MINIO_ENDPOINT:$MINIO_PORT $ACCESS $SECRET" ; + $MC_COMMAND ; + STATUS=$? ; + until [ $STATUS = 0 ] + do + ATTEMPTS=`expr $ATTEMPTS + 1` ; + echo \"Failed attempts: $ATTEMPTS\" ; + if [ $ATTEMPTS -gt $LIMIT ]; then + exit 1 ; + fi ; + sleep 2 ; # 1 second intervals between attempts + $MC_COMMAND ; + STATUS=$? ; + done ; + set -e ; # reset `e` as active + return 0 + } + + # runCommand ($@) + # Run custom mc command + runCommand() { + ${MC} "$@" + return $? + } + + # Try connecting to MinIO instance + scheme=https + connectToMinio $scheme +--- +# Source: minio/templates/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: minio + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "10Gi" +--- +# Source: minio/templates/console-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: minio-console + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm +spec: + type: NodePort + externalTrafficPolicy: "Cluster" + ports: + - name: https + port: 9001 + protocol: TCP + targetPort: 9001 + selector: + app: minio + release: minio +--- +# Source: minio/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: minio + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm + monitoring: "true" +spec: + type: NodePort + externalTrafficPolicy: "Cluster" + ports: + - name: https + port: 9000 + protocol: TCP + targetPort: 9000 + selector: + app: minio + release: minio +--- +# Source: minio/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: minio + labels: + app: minio + chart: minio-5.4.0 + release: minio + heritage: Helm + stackable.tech/vendor: Stackable +spec: + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 100% + maxUnavailable: 0 + replicas: 1 + selector: + matchLabels: + app: minio + release: minio + template: + metadata: + name: minio + labels: + app: minio + release: minio + stackable.tech/vendor: Stackable + annotations: + checksum/secrets: fa63e34a92c817c84057e2d452fa683e66462a57b0529388fb96a57e05f38e57 + checksum/config: ebea49cc4c1bfbd1b156a58bf770a776ff87fe199f642d31c2816b5515112e72 + spec: + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + runAsGroup: 1000 + runAsUser: 1000 + + serviceAccountName: minio-sa + containers: + - name: minio + image: "quay.io/minio/minio:RELEASE.2024-12-18T13-15-44Z" + imagePullPolicy: IfNotPresent + command: + - "/bin/sh" + - "-ce" + - | + # minio requires the TLS key pair to be specially named + # mkdir -p /etc/minio/certs + cp -v /etc/minio/original_certs/tls.crt /etc/minio/certs/public.crt + cp -v /etc/minio/original_certs/tls.key /etc/minio/certs/private.key + + /usr/bin/docker-entrypoint.sh minio server /export -S /etc/minio/certs/ --address :9000 --console-address :9001 + volumeMounts: + - name: minio-user + mountPath: "/tmp/credentials" + readOnly: true + - name: export + mountPath: /export + - mountPath: /etc/minio/original_certs + name: tls + - mountPath: /etc/minio/certs + name: certs + ports: + - name: https + containerPort: 9000 + - name: https-console + containerPort: 9001 + env: + - name: MINIO_ROOT_USER + valueFrom: + secretKeyRef: + name: minio + key: rootUser + - name: MINIO_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: minio + key: rootPassword + - name: MINIO_PROMETHEUS_AUTH_TYPE + value: "public" + resources: + requests: + cpu: 1 + memory: 2Gi + securityContext: + readOnlyRootFilesystem: false + volumes: + - name: export + persistentVolumeClaim: + claimName: minio + - name: minio-user + secret: + secretName: minio + + - ephemeral: + volumeClaimTemplate: + metadata: + annotations: + secrets.stackable.tech/class: tls + secrets.stackable.tech/scope: service=minio + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1 + storageClassName: secrets.stackable.tech + name: tls + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: certs +--- +# Source: minio/templates/post-job.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: minio-post-job + labels: + app: minio-post-job + chart: minio-5.4.0 + release: minio + heritage: Helm + annotations: + "helm.sh/hook": post-install,post-upgrade + "helm.sh/hook-delete-policy": hook-succeeded,before-hook-creation +spec: + template: + metadata: + labels: + app: minio-job + release: minio + stackable.tech/vendor: Stackable + spec: + restartPolicy: OnFailure + volumes: + - name: etc-path + emptyDir: {} + - name: tmp + emptyDir: {} + - name: minio-configuration + projected: + sources: + - configMap: + name: minio + - secret: + name: minio + - ephemeral: + volumeClaimTemplate: + metadata: + annotations: + secrets.stackable.tech/class: tls + secrets.stackable.tech/scope: service=minio + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1 + storageClassName: secrets.stackable.tech + name: tls + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: certs + serviceAccountName: minio-sa + containers: + - name: minio-make-bucket + image: "quay.io/minio/mc:RELEASE.2024-11-21T17-21-54Z" + imagePullPolicy: IfNotPresent + command: + - "/bin/sh" + - "-ce" + - | + # Copy the CA cert from the "tls" SecretClass + # mkdir -p /etc/minio/mc/certs/CAs + cp -v /etc/minio/mc/original_certs/ca.crt /etc/minio/mc/certs/CAs/public.crt + + . /config/initialize + env: + - name: MINIO_ENDPOINT + value: minio + - name: MINIO_PORT + value: "9000" + volumeMounts: + - name: etc-path + mountPath: /etc/minio/mc + - name: tmp + mountPath: /tmp + - name: minio-configuration + mountPath: /config + - name: tls + mountPath: /etc/minio/mc/original_certs + - name: certs + mountPath: /etc/minio/mc/certs/CAs + resources: + requests: + memory: 128Mi + - name: minio-make-user + image: "quay.io/minio/mc:RELEASE.2024-11-21T17-21-54Z" + imagePullPolicy: IfNotPresent + command: + - "/bin/sh" + - "-ce" + - | + # Copy the CA cert from the "tls" SecretClass + # mkdir -p /etc/minio/mc/certs/CAs + cp -v /etc/minio/mc/original_certs/ca.crt /etc/minio/mc/certs/CAs/public.crt + + . /config/add-user + env: + - name: MINIO_ENDPOINT + value: minio + - name: MINIO_PORT + value: "9000" + volumeMounts: + - name: etc-path + mountPath: /etc/minio/mc + - name: tmp + mountPath: /tmp + - name: minio-configuration + mountPath: /config + - name: tls + mountPath: /etc/minio/mc/original_certs + - name: certs + mountPath: /etc/minio/mc/certs/CAs + resources: + requests: + memory: 128Mi From f05edcd8efb390fe90998312f06110dd3337d11c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sat, 12 Apr 2025 04:09:58 +0200 Subject: [PATCH 013/101] add airflow logs minio --- stacks/argo-cd/manifests/airflow/airflow.yaml | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml index dc155030..66f8088c 100644 --- a/stacks/argo-cd/manifests/airflow/airflow.yaml +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -16,6 +16,20 @@ spec: - name: airflow-dags configMap: name: airflow-dags + - name: minio-tls + ephemeral: + volumeClaimTemplate: + metadata: + annotations: + secrets.stackable.tech/class: tls + secrets.stackable.tech/scope: pod,node + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "1" + storageClassName: secrets.stackable.tech volumeMounts: - name: airflow-dags mountPath: /dags/date_demo.py @@ -26,6 +40,8 @@ spec: - name: airflow-dags mountPath: /dags/pyspark_pi.yaml subPath: pyspark_pi.yaml + - name: minio-tls + mountPath: /stackable/minio-tls webservers: config: resources: @@ -40,10 +56,11 @@ spec: envOverrides: &envOverrides AIRFLOW__CORE__DAGS_FOLDER: "/dags" AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" - AIRFLOW_CONN_MINIO_DEFAULT: "s3://admin:adminadmin@minio.minio.svc.cluster.local:9000?extra=%7B%22endpoint_url%22%3A%22https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000%22%7D" + AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" + AWS_CA_BUNDLE: "/stackable/minio-tls/ca.crt" AIRFLOW__LOGGING__REMOTE_LOGGING: "True" AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ - AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio_default + AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio replicas: 1 kubernetesExecutors: envOverrides: *envOverrides From 3cedcfaa5b4fbc2fafeaf5a0f9887ac2e0063687 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sat, 12 Apr 2025 04:15:04 +0200 Subject: [PATCH 014/101] fixes --- stacks/argo-cd/applications/airflow.yaml | 2 +- stacks/argo-cd/projects/minio.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stacks/argo-cd/applications/airflow.yaml b/stacks/argo-cd/applications/airflow.yaml index dcd20380..9d938bc9 100644 --- a/stacks/argo-cd/applications/airflow.yaml +++ b/stacks/argo-cd/applications/airflow.yaml @@ -5,8 +5,8 @@ metadata: spec: project: airflow destination: - namespace: stackable-airflow server: https://kubernetes.default.svc + namespace: stackable-airflow source: repoURL: https://github.com/stackabletech/demos.git targetRevision: "{{ demoReleaseVersion }}" diff --git a/stacks/argo-cd/projects/minio.yaml b/stacks/argo-cd/projects/minio.yaml index aaa033ba..ca58ee8a 100644 --- a/stacks/argo-cd/projects/minio.yaml +++ b/stacks/argo-cd/projects/minio.yaml @@ -3,7 +3,7 @@ kind: AppProject metadata: name: minio spec: - description: Project to manage Minio via Helm + description: Project to manage Minio sourceRepos: - "*" destinations: From 871d45912d3359dddb05740898431811cf739e57 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 09:48:17 +0200 Subject: [PATCH 015/101] extend cert expiry to 10 years --- stacks/argo-cd/manifests/airflow/airflow.yaml | 2 +- .../argo-cd/secrets/sealed-secrets-key.yaml | 159 +++++++++--------- 2 files changed, 82 insertions(+), 79 deletions(-) diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/stacks/argo-cd/manifests/airflow/airflow.yaml index 66f8088c..de8613d1 100644 --- a/stacks/argo-cd/manifests/airflow/airflow.yaml +++ b/stacks/argo-cd/manifests/airflow/airflow.yaml @@ -65,6 +65,7 @@ spec: kubernetesExecutors: envOverrides: *envOverrides schedulers: + envOverrides: *envOverrides config: gracefulShutdownTimeout: 30s resources: @@ -75,7 +76,6 @@ spec: limit: 1Gi roleGroups: default: - envOverrides: *envOverrides replicas: 1 --- apiVersion: v1 diff --git a/stacks/argo-cd/secrets/sealed-secrets-key.yaml b/stacks/argo-cd/secrets/sealed-secrets-key.yaml index 60e7e522..7196e082 100644 --- a/stacks/argo-cd/secrets/sealed-secrets-key.yaml +++ b/stacks/argo-cd/secrets/sealed-secrets-key.yaml @@ -4,87 +4,90 @@ kind: Secret metadata: name: sealed-secrets-key stringData: + # Generated on 2025/04/12 + # openssl req -x509 -nodes -newkey rsa:4096 -keyout tls.key -out tls.crt -subj "/CN=sealed-secrets" -days 3650 + # required for sealed secrets decryption tls.crt: | -----BEGIN CERTIFICATE----- - MIIFEzCCAvugAwIBAgIUTIeBhvXRk1w2QJRP2RpyQWJCB48wDQYJKoZIhvcNAQEL - BQAwGTEXMBUGA1UEAwwOc2VhbGVkLXNlY3JldHMwHhcNMjUwNDExMTk1NzUzWhcN - MjYwNDExMTk1NzUzWjAZMRcwFQYDVQQDDA5zZWFsZWQtc2VjcmV0czCCAiIwDQYJ - KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMobRqdxhAE8Nr45tCRRI6kz2WopwnKb - 8bWGM0LbM/p04xfcLLAVzK4nC5HHBmfPycz6XyGjv7ViUSaHVk1j3OLxFEX4sd+2 - JoTQRenRc/oUHdwaGskBr5frXFAO3Tiou+pJ6Tu8ewCeCvGUzB9HtiRq5pCGPu6M - wzXbmR6GKaCJTu80LZ8fwFdSWI0gDoqeWffCTfcTgJfTa+DgMfTM3zzUNwJVfLo3 - r596wGmlxKfMcUtzw2J5iLr0dXJuJnlmA0gU31kwVcf8Wo1DAdh8hhxmUAkmGss8 - AktmB8OvvNygVVzzwmX/L2MH1zPXzgM9sYenkJwLSZhMx/uyfgX5x54/QaC7lwfk - wPnp52pK0JA2VmfFBsvlnPsVOWgwWU0jUtMGBtKlu/OonELAGaffbkhjD3eDe0B3 - X0gwtju+T4WCzQmgTFyXFdp18/S2rz19TBrq2XponRRpcXBo4qe8P59Eq++NNjAg - rYymFcTfrDZqMIt3jBv3jSnLlAnwg/H1neRfgx6kxXqxApF+vMDD7VVDaLYnLbFV - lwdkWxPrHStk05eBsLu/CkGv2ykkUAa0qqg/Dm/bkOl5lZlauVFC9wuiLh2cHgZr - tBpGuYlMFMRvx7A0+IBUTjTQswBF1+mBStUyBThOw1aJYbE2FCWj+lGrMX8qr+ad - sKsS+5DjOwCVAgMBAAGjUzBRMB0GA1UdDgQWBBRFs1lkbmy+f7TN10DGuHLa75sj - BDAfBgNVHSMEGDAWgBRFs1lkbmy+f7TN10DGuHLa75sjBDAPBgNVHRMBAf8EBTAD - AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQA+6nknVdXMATXxbyk0E5fDlM/D2aceDw6D - 3kydc6wBT6k9SkhxFtrCI0IBO0f067ppFPj4ApJI0mrh3dsNiAzjqGetlGCqXjKq - pwdVxWYrmn/ELTKgvxToQG4J4PMUeo7tlhviU5HJo90DroDpoZHALubl+XsjzspA - MHH94CiF24z2nxoVolVa1qqq7WDlMWhZuit3WDo+jIgrpBgcPegNrZqrZqt/xlzM - Q91iOwwd3ykfo+xLdNuG1i8Qm1UFOEmXsustHBPDCtcI/ddLda4NbZtrNeZVmDbE - Px4Zzsjrbd6IKhVbdD5E4d9K/XMNsBIl4sidqdaUMhkNTYXkI/a5dTFVlFprLFnM - yB7A6OplQPp+LTITXW2IvD/eZetdl5073X0OQtuJrsm4mAJZ74sqXgcyVs7bGPIw - aXt1ttNH0qA5lvbp0cOIdXmpSWQfDRvlAExqX4p86549J3GMhIsVCMw5KsqduN5e - rSi0HCi24S8CeXiYV1phkSuxf0sROPuRb8SvY/6qcb73DMEMQx3zPWLV/+pG7DcG - uD327xvb3uJG0kFLi4MDnoCHLHYZeoPtwIEwG+1LjwHj+oKn12wlKJvYTxWALi4k - tKVW3QYL8beLaI3XfF+Vd3kCVpU6N9aRt3l+PpzkE1VCkayz67Sf5dJy88YIB7o4 - A08j/AH+GA== + MIIFEzCCAvugAwIBAgIUFWEYhsQ0cTg6XATOSu70TgA/BGQwDQYJKoZIhvcNAQEL + BQAwGTEXMBUGA1UEAwwOc2VhbGVkLXNlY3JldHMwHhcNMjUwNDEyMDIxODEyWhcN + MzUwNDEwMDIxODEyWjAZMRcwFQYDVQQDDA5zZWFsZWQtc2VjcmV0czCCAiIwDQYJ + KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMbJgXSu4ELhULYyraB4l/fnGHf8NXNM + z/PG452XrKBGdElOScxYhkentBtGUlfsYeoanOwZikKLr3ngoMzvYIuoLCqkQbA2 + u5jlP8VUtTsMc0amYPAJeEvW/KLbH/6/BFJC9Qrt/kglvVRyDWOb2VN1Dx8RbY0Q + uWqdF460OGacStyHnRgpp43a7vb4YRKxNkb7Na1s+KYUIa6hJPgIIfLGxksiQKAr + zuRKFATImFDVzXiXLHP8c7qcQa4+bg9C194CUoWt+hC2SbrGGFEJ9M6c4TzU7/5y + aE9f4TTZfadH77XpukraI26fDnLKuspK5r3VFmEWE7d8qft6J8i9Dwl9OI7DJfUx + /dHOFAb/6oiN8TmIRtR6fnreuBv5qWq3B8wnfxmVNf22C0rS8KQaj019IQdZk1Sm + hOXfTtoZ4vZk9pw+gFdkoNF1rMqzmQnoR+IcKmWRydLx0pftQ3IpGYBqncfNnaK0 + tCag+dZbmPVtL8M5ovWX1WUoAfKSczBaxMnYO3I57R5jEEOR4BfWIdPEVVMgni2u + tO560gYMHpQHGzkaH8Doa0ZyV64rctEQhCIU4bV6JzwvDnYE8O96ej3n75NIYwKF + NmSNslExd5DP2fLlIK9mnh5q8FwFqGjqefTVUJ+0pCCMRCvID8FjcqCPEF4Xvpf7 + 6LRNSF5gerelAgMBAAGjUzBRMB0GA1UdDgQWBBTuOIW0EZNXykIIvU0L8xhOfU5z + mzAfBgNVHSMEGDAWgBTuOIW0EZNXykIIvU0L8xhOfU5zmzAPBgNVHRMBAf8EBTAD + AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQBQlrQ0pfAjUSu44ZWwXpkSxNERwKI1eMUO + XroKPRSAmdB/tB7JgH3wdT/Yz7pdzvt0LKu1SlcIQXRJ5VsG9k7clhJXQ1Ogse7w + g7TvQWp49uw8OlVY/mJXlia7dgKiyREGSGjpSsUC+pHcFRmZ4N2los7agY62hZS0 + 68esldNIHLPR9PfM84jGfkk1CkFefayROL7kITVemBKHBPw5Jo8JSLnahSmfiJ1e + K7SY7u/j5PY3MobnjB0MtxaDovmJjjvZ9eQZsTSRnDsHOWZEcHZ1Eoga6NEjaGG2 + kYX8RFp8TM1xhq77/+uTWxhXyekrlxmhBY/ft/C34cm4jM0qw8db8fMXsYtPo/G1 + Cq3ry8+XpqM28TtqHy8hj9nK/WQNvJ9z892FVk7nbBcFzctomdXO9vh+p9C5PW6u + dkofuMW3EC0HuinXZoUiFMwVSGF6lm7lxgkNnn9JJa7v1OCJVqQxFGoJk2gDh+Ub + zHCuy/s4nu5MsBX3xJgp2h7/DPAr1DO04tmAUZ9OwpEyeYzWogM2cIm6yeMRNl5+ + xqhWZGh7/5s5iik1g0wB5o08IwKlTMI/b1cNbJBymgjwqGlJRRAKP2IwvFGae3sX + no3+9FB1FJjEX7sKIHFqN03w1GyrPW4qqc/9is6UaLmxTlu98QeMikel+Wjpd8bP + DAIkrU/MPw== -----END CERTIFICATE----- tls.key: | -----BEGIN PRIVATE KEY----- - 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 - w6IEdTFRspEvNwyrTH9geMzYmqbIsA== + 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 + hnSzVDPZAGg6LcqDPW9csv6W+BCo9w== -----END PRIVATE KEY----- From e486d9cd5ba8fda35a07f117712efe26028732e3 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 10:20:47 +0200 Subject: [PATCH 016/101] split stack & demo --- .../applications/airflow-postgres.yaml | 0 .../argo-cd/applications/airflow.yaml | 3 +- .../argo-cd/applications/minio.yaml | 3 +- .../airflow/airflow-credentials.yaml | 17 +++++++++++ .../airflow/airflow-spark-clusterrole.yaml | 0 .../airflow-spark-clusterrolebinding.yaml | 0 .../argo-cd/manifests/airflow/airflow.yaml | 0 .../airflow/sealed-airflow-credentials.yaml | 24 ++++++++++++++++ .../argo-cd/manifests/minio/minio.yaml | 0 .../argo-cd/projects/airflow.yaml | 0 {stacks => demos}/argo-cd/projects/minio.yaml | 0 demos/demos-v2.yaml | 28 +++++++++++++++++++ .../argo-cd/applications/sealed-secrets.yaml | 3 +- .../airflow/sealed-airflow-credentials.yaml | 24 ---------------- stacks/stacks-v2.yaml | 12 -------- 15 files changed, 75 insertions(+), 39 deletions(-) rename {stacks => demos}/argo-cd/applications/airflow-postgres.yaml (100%) rename {stacks => demos}/argo-cd/applications/airflow.yaml (84%) rename {stacks => demos}/argo-cd/applications/minio.yaml (84%) create mode 100644 demos/argo-cd/manifests/airflow/airflow-credentials.yaml rename {stacks => demos}/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml (100%) rename {stacks => demos}/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml (100%) rename {stacks => demos}/argo-cd/manifests/airflow/airflow.yaml (100%) create mode 100644 demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml rename {stacks => demos}/argo-cd/manifests/minio/minio.yaml (100%) rename {stacks => demos}/argo-cd/projects/airflow.yaml (100%) rename {stacks => demos}/argo-cd/projects/minio.yaml (100%) delete mode 100644 stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml diff --git a/stacks/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml similarity index 100% rename from stacks/argo-cd/applications/airflow-postgres.yaml rename to demos/argo-cd/applications/airflow-postgres.yaml diff --git a/stacks/argo-cd/applications/airflow.yaml b/demos/argo-cd/applications/airflow.yaml similarity index 84% rename from stacks/argo-cd/applications/airflow.yaml rename to demos/argo-cd/applications/airflow.yaml index 9d938bc9..9196c2cf 100644 --- a/stacks/argo-cd/applications/airflow.yaml +++ b/demos/argo-cd/applications/airflow.yaml @@ -9,7 +9,8 @@ spec: namespace: stackable-airflow source: repoURL: https://github.com/stackabletech/demos.git - targetRevision: "{{ demoReleaseVersion }}" + # TODO: adapt to release-25.3 + targetRevision: "spike/argocd-demo" path: stacks/argo-cd/manifests/airflow/ syncPolicy: syncOptions: diff --git a/stacks/argo-cd/applications/minio.yaml b/demos/argo-cd/applications/minio.yaml similarity index 84% rename from stacks/argo-cd/applications/minio.yaml rename to demos/argo-cd/applications/minio.yaml index 05d27e88..bfea03c9 100644 --- a/stacks/argo-cd/applications/minio.yaml +++ b/demos/argo-cd/applications/minio.yaml @@ -9,7 +9,8 @@ spec: namespace: minio source: repoURL: https://github.com/stackabletech/demos.git - targetRevision: "{{ demoReleaseVersion }}" + # TODO: adapt to release-25.3 + targetRevision: "spike/argocd-demo" path: stacks/argo-cd/manifests/minio/ syncPolicy: syncOptions: diff --git a/demos/argo-cd/manifests/airflow/airflow-credentials.yaml b/demos/argo-cd/manifests/airflow/airflow-credentials.yaml new file mode 100644 index 00000000..aed1fd28 --- /dev/null +++ b/demos/argo-cd/manifests/airflow/airflow-credentials.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: airflow-credentials + namespace: stackable-airflow +type: Opaque +stringData: + adminUser.username: admin + adminUser.firstname: Airflow + adminUser.lastname: Admin + adminUser.email: airflow@airflow.com + adminUser.password: adminadmin + connections.secretKey: airflowSecretKey + connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@postgresql-airflow/airflow + connections.celeryResultBackend: db+postgresql://airflow:airflow@postgresql-airflow/airflow + connections.celeryBrokerUrl: redis://:airflow@redis-airflow-master:6379/0 diff --git a/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml b/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml similarity index 100% rename from stacks/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml rename to demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml diff --git a/stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml b/demos/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml similarity index 100% rename from stacks/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml rename to demos/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml diff --git a/stacks/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml similarity index 100% rename from stacks/argo-cd/manifests/airflow/airflow.yaml rename to demos/argo-cd/manifests/airflow/airflow.yaml diff --git a/demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml b/demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml new file mode 100644 index 00000000..9f763340 --- /dev/null +++ b/demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml @@ -0,0 +1,24 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: airflow-credentials + namespace: stackable-airflow +spec: + encryptedData: + adminUser.email: AgBJq/dTwq0biM8b8bl2/daQSbWPRXSnOHOMnrJRjxM7A5KX68HI0Ifp4r47gSTZDQuKxNx5PaFuyU6W0tT9CvbFSPdhTXb6G5xLXITafrpd2he9LiTRzI0wzh/xa8sOChTNHK3rXBpU8n0Y7aYVDp7mibFk6CQKhMMq8s/OL5Scp2R4mbiajAtXMwQ2wt1fF3CAqR4QgxqGGr0cEugGf8zl/Z3GryUjJsqjNyhkjDxBN2E6oiP8Q1NCMV7AGGxdqHyi3PJH6hFddk07fTKu24oV1/IkdPZ7QgTXzhV2dk57KcSX8wB9gksWsCiFGlL4RnKwkmMbNzXq5m9zAk9YkN0QyMu0pRBI/NqhFTfhXIBcVsIbEa/37rGxV6oIaLqndneSG4fDTu0HP6ga98pM/nD2Nrzlj1gS+KwaBSGWq+CWs3HSah35treHxne3U2nuG98+nnIvUQUYI36b7MAP9xQ5Koykk4iU6LrVoxyck42k3VxeWNLc4W1axOBLGyjSxxUmZMWF4lmlz4Z045/SuBF8O4mmIHj/3cK5EEcAlme3lebNKht9/w3iaxDd+dG04CP8RMQGE7i3OdHpteilZMszXyjYz8m08u/wgiKG8aEkh8ad9fNeR4RnGP5CMpifrLZeCsismj4R9JN6B3lr3q2s1Ot/aedPsk4JMj0RgJAnLkSQHbYI3twJAOq4C/6HH+fSsripLIL4CjC39Hevp6Nku6ef + adminUser.firstname: AgC+TLraEdynGLvTTBkzXgBEvnK0c+97PsdcVTK3BIFD0L4APn3HM6V2WiUcyBH//YJqUiNvg5mnJZx3EA1EakPdzkXlitYNFy6XoMDTkrMZTgiD/VAiABBmPyVJesGz5xxlovqFGpbGWQbXjr+fGOINqSciQi1JMzN/jQ9EJQRnyxr7Xq3rmF4/NsWo8s+fEbQHx8SmNrS8mu9BFd+QSL5pTskZJkcaUuzduCXIheacJcRE+YwiufQVOFSo2AkgGcbwzLBRJuL6+u6MST3qr/xapsBuGSwHtEoVcI/NApTYsGZCeNN6H8e083BnRGCunfnw/R9/5Xg4uxdUEbGT16gP4H5/o8V22AmH2opSgPgxVSntAn6h5cxva2YUc5Bezn+pKFZmK0KCmC8tUSDusje3X0emMIs9+fC+ksj81UwSikC+hKbuZz+HuzS23UCy+w5R9X2SDGk802zxdLVhsXn/46dgaEqzOEa1pYJEyCRZUUv4KTdM0/XXfkid4r1uP0d6bZ7jlS9tSDQ/ajm5dAhl5W7nIYdRVAqM5KhvvY3mWpqIdscdr+bhpE46mJPstP6O4FM3/0OYPntmjxSVTFf0Uc8mHY4RRAM2sN/ViqcDGumn3Q8xlQtG4vMO2Tx+GAStzIu9AGsTFYcak3fI8kpZhs7mhYCXeigSusaIcsH5bfC7uekMrqhrKraY5hOU/xaxjydPIzN6 + adminUser.lastname: AgBzqzvmZLHUVDcG6f5cyBxUef4Ov0PNBGaqrYLKPMk4a681XpPlfJnNvMk87aV8Ts1xunoozWs4uM2Z6pQa6ZIYoR5oRkO4bLqK16frBaVypKVsKRPkol+bSyWPLGuI0izIKdAcHrtuaEffb6Sr98i6ColIqGLEYlzUalnPIuK/W7QqKXO91jHYnTv4m6LUMere1N/x1cmeZ3+W+BukWLkfiLko4wgCSauUCene9azY5ehtmlIAUo9xNC3oDA+rTGTI1SkG2Xe/ytI92sedCEMmVX7oU9PI0KGfckchc6azmOTsWN0hSnUdIHPPDn+9L0x77HwHeMfiVgO2Bai76lC5fO2b9Pw0OxID5EKY4jvIrtQ2uQANCtYupge6Z37njpzI070U/H65NDtCKAGmcuy4pFgdF60VrEPrfAN+uaVJXmJGu75QmaKqGWE0RAW9UcjiKD9YaQf7pN2tx6v2oga/OR/cDTR+LJYIcwAC2HI+v9t2cb3LqznnoixVwU83qOOqDelq/Pd1vV3Sf1R2Kj5E4UlYm/lEtSczKJyxX4Rim34kzMqZnmYP/56bs4NwXjJ8vmMHEeFkO5tL3NaVgeJ3yKvLG4yUtasXxlrSUgLdXXTu6wN7PuBUkzCN4maYHrDjJYApo1iIXhObtgRbDatosCUCJOSvE0BEEf9CKP++SkUdipWVk84QK3ryNYQOZ12Lc4rnkw== + adminUser.password: AgAXw2meNuLCnWIDeBdrUI1osShroov1kjvRJ5+mLtGHD9cOTfQlAJpGXN+QwVWXz/hsRl0zhMxI1EomJhXOOyNI67ptlaMnSV/Wtt5X92ISmHReR/1R2cXv0e/NQLbD4M3AmCpvSz0agYMBxtIFh6mVeMah2RRjVD74Xc3P3SrHjnY7CiLYe58JWVkxGAp6WO2JTpopUJI1Iagr9MHfkGzPp3ygFVxwiMjPIVCM+IeAbtHLNi2w6slrcKa3IJduLSaGOQEr/p8YcPm2Qx2TGHOpiM6Lw9api8JtN28mS5hArc7qj5kkwkfEiHW2exYMXVSdWy7glgEGFuTr7MRi0LpLqS72DT55E9uxAObnlWuiKVmk6UfExX2mMfze+Iz4sKXrqOFoLAIXx8+yjO3t5oDvJf9pxLNihl4rYyLg9v8+UkkGJLQZPOqjQoeuH9ighDkHdfkiUDdprnG9iZAQBFzKN7On+tMA09McwHkC6jV+RIv47zty1CMoEPQ2wEM+zDHU6DG2HvtHQYov1pCpXzyvMz48hcKiAwIjZQM1RZBL0tN5qd8Tp38MqtAvVt7PvllwAN2LKt9HdV5j82kyWseE6MPYkB1l8Q6ctUn5YY0kw+tWwgtmYbeRY9+kSIUphxntX+unzhCKCAY1oBOc/cdim3YQInGGe6lx3JGUQvz5LpP6+aVBPyy8HOPnUSyxdu2ZaBkG5SKhKvfH + adminUser.username: AgCVVTX2c+4moS0v6mXuNQ5v6EtxZ43hN0QYg8wgYG+GPR3qZ2Ep+FkUJq86q9dFcuX6EXXtS2h8BJr2sUrRW6QySFnhtmg7A1d4anslN3yAjLipwrreNT9cn1t4PsdIhU0q5Z2uPmMsnLF28D73AxWA59iiveIId2KSuB2lsaC8S8CeW3Df48LW3cnukHtOvc+j84YQgFdagujBtwAMCiym2pdBJG5GojTHQ/5P3AnV+iM5wzXaYIeF5UZ0wLs5WU3CqHLxsY3q7NrLKGzS0xTqqdc6H++tJQFZY5G3q4NcCx+jq9oRErE0ARz3ok2pOHPArUEbyas9+iibA9HJcCmrKguQ8QBvaIQh9L0YtHCtwvaMbR12ZmMfRtMW6pZnM/d2K648JFekuezGTOVEjLk+ZvVm45L4USZpB0MD5LXEy3m8cDdkn2wqTWvblfjgfi7opoLgpwLyf/BZuunrFWT08x9K1WmNQ7OkM4WxscLRyccFOtZQfoUtT8hW+K5/mxLjOQDpryWPCUeBDAMnBvbGG/0AABp7a+vWG9KVus2ZyfUHVFIHgJBsHXXDtONIkmRvTal5bjlRsVk4Y0O3DoJa+UjXYoIBSm1JwdUJMOnL1MoS7Ijk+iXKPMc/3fcbrnfqYxw3ymr485bL8fKh2n99MsCdR1yX/mTxw3f6bRZdN5O7IUTkkKVxx1b08FD1svSwNKHBZQ== + connections.celeryBrokerUrl: AgAD1Iu/Oggx5NbNY29aJweDDVHlnL2KnsSJwBufPSxsaQouGdIIMIsWr/y2z+qCtd+TBG7f/ZK6vvTlT8kGeq9PGguGTOs+jQObFsqOWoWMn+zbZl+H3SsXHE9ohlrq36n6b68vRrpR/zIvI/QcFg7FC8qhH7GhxzYoUfXbIVEg9ZUyg8W9GgznIM8pJD7v1blz16fXerC3D3wcY449wvQuygZucGyGNfCK9+y75/HQldYVg5lG0Gb914uT5hQ4lATlH7xnHQcxwXhT+30qphNcIJSNZW2D6S0kovtoZ8xk6P/xoO5uZNzNyFnRxIu/AhVi3T2L/dzlO9ztbxwjCu19xxDo16/vhXQ5awGcyJjHqZc8Pu4v5e7sJTElguAHooQraL/dcx9fJvVOxk+3GUMwixfzSR3R/BD2Na4l9mT3fwiW53UTYIcDm/jRwZ8EPZz6GtWVPtwoOkpe6y/OLoRtGNlJEW2fR2d4VwsrqnPV57716FuI5ETwvCSJcqaoMk1kPZBzWGjgf02owizSD7gKONBLX8G34981JsTu/vloPD9uPYQoQ9oFlKVtdmYKhL6u08ekiwLoojp51T/JB5I0RYLKSu4nR8O8SK49RH2CF/4viBs5cCezP8Cfq4qxSBHsd12PXHocUWK3v5e7xgQXi4wJzoLifNcS2FXwV+97DvHaYCM9KUogdL3K/MnPSfb6SGI5WHJkExK5Hr2WqKG+3zFIr+TfIf8V5QcrXaFEz6m0iK49x5hIvjgmnQ== + connections.celeryResultBackend: AgAEg3o3zzMI1fqVt119TiNZ2U9Uvg5ua1gSW1klHtI8P49n/ZTmYftFJcPkJfw8mjawxuSzwTvPWNirkcTyF0jpauyn2W3L7q2SwuMMmS96z4R0FBwa4a1AjP7Rovq9r4lPjtjn45IPX5VPDG2gBiscVhBFLzozFucgXVk6bLo3bu8/lXuf+5PXaTH7TtRfYuTipiY4jbvlCx5jR3omzgnLThOWaoplnfIQPQbhnLF4t9ydipLxV+Dr2ccGnT+yehHxbmROK5kRD8DgPe0oe1+qFS5zIRyG6KZBgI3+ru3wAkbREeuE/Bq9nDWmRS5JVDlOKaFqFtYU2h12LB/f+MKPhwPdvzCiWLmT+XU8WW25pjUXHDakXRm4RJI2J+24cTjue2jv9GbNF4+n+ywunUpNqEagJ3q0VFZ8o5evZWjw55qMnsE6eMpSoPygssD1sfQ5jf4W00onxjSEijR7STqi/6zBEZzKzPSij3fH5HeWmsd9MwnQ+1/J8VIighxKm2RSRn6ClRsXggMvzCCf/wg5zwYClMWage65fytKYH12lR4Dl2fNHFYexTIWvrL/36xuuKhP/Glpz6dJHKm5bHOjeNo+RMtKLTWvr3NVqMQMzK9yl0JdPJKByoqLy+xR5pKy9TacihXJXZhpEPd2IDK2/zxCI+71OIN0iNqL1KnfI5VMtFJu/jEmkgzD+Hqg4UlI3a2frgxtv5chMvIusHIxf/2fv3OoWVhfIjObD9nlnbwFQHhAfnMemeMhaxlnxQ34aI4gFZJ1m3hg + connections.secretKey: AgB9N48o16//pMoE7YPHGHQUDd6n5gQGJcsDK2kmsxM1fj4POpG8eRwxXpRlNwBcH8VhgJAWJKLWUrIy5cQ4DM77gDGcG1YOpHIXDMDzTtocLmLJmpxoFGrswv0lEB0dCZwSpOph3btBzCDuKNA/nzHD/iwoVkZiDao/CyC+wjRrudamIfC0aJJsnSo1NAzcmsP1IEaURF0LoWdAPXWCqzEHbJ6FjCdQe/5F2md30PHGt1p0x3/ro4i4gv54ZePWBAStZml/a5i219UBvGROJgBCAJYEb0wlQ5Aut+7PVzjgUfLgWpvGEl1XBXGjuR5NUOiEwcYok+QsonQcUGaNScMzzqrfWRIagAlcGnSzs4TsLUgA2opBlKClVdEqnyS1QEH062ZTrxoFJ0mGg6T1oh6rElGfzmOTMhU95nRIF3wtYh4Si20IDAbWkIJgk1j5+Vvg31KHOTQXR6WdXc1CqYuo3LVzjP4JeIvrsdyqIJC4dg2WAKDTrQ3qixDv9Yq+bT9jMHrdQPQBz1clb8g6OEqtuDeobkTJFU/vdlZRSz86/mtsujpBNHr2SPa5IwIr2ALBx61NXfalc+gp2lUDTQSZPRf/oHIyD/SbARFDCNGmf0rPO1yQ2dg85+kLLSE2+K6uPYPwqippSIyiazIzCi5FLa6B6IEqAxjdrPyBdrMu3Qgkzdhp23UaL7yRnXJkHnPtb+URhrbnqPVIDiNeF0Nt + connections.sqlalchemyDatabaseUri: AgBGW3Nva7kn/GxNKinig8hj/b0KSa6nESiU2zKPwW6ZDhwTA3Kf3jcJCfKE2ISSLY3L7qNeihVnYP3f6S00y+b7oixLxvYxUxCGaVvNON/xtK+dFYoYQfh3hXevLWYuf7Bg5et6Rr2hoDJbkq6Nix2uIEMDiRjWyll3ma3ajlVSxbt4xdboXb/OqRzlCLS433nAruu2woSvw2d4ypoDHYd0uGw/W4ushxOEIDVC61kJU3T9K7UqzUK4bTMljiYxrwMAb3cZ0dnPw2FU/fpT9SDomCWtjnktMkfbzgVWgD/oIh+2IZH0p3Y9GoIDJUhHlBFudDu/t+tQ91F2Xpy3gqmWFSHkfnCex699hx4dBqAeSlf2Frwfz0ZR0CM4aSIKlPH1eyumz8VA5z8AmK8fDcWCvwYeRdS67qPcu0SDKodAlhA0XR3CSj+357TmId8KHS+DZCisrxAuMJGMt6FbCbTRxY6lM4yJHrkP+L9Hv3474deDApZix4h64pqiH5P1hYIsiDM02EkdI5JwrRuZewcfVMDzGhve/u9nSa5dMADrDdjKZAys8hCUgi//ynfJzpOKi/WbfvNeGcYbQdvDX9dyXTbvsSYQ/+jq8DnU69RwQWF3lYIwZAWeoGAThX4jvSppuDY+FtS/1TsrymLQSpPH4lXjgSw7yomRvNx2x2n4Pa3mPpgQ2SR4qKQX4lLeE2t+R39xKQreA4FO3XItLFnZ8ddLj1mcmatGhSMmD6AWI2hmxxxJJ3Of4AnBDrCoV68fYdPk/HeY3C8JfHQnSKcG + template: + metadata: + creationTimestamp: null + name: airflow-credentials + namespace: stackable-airflow + type: Opaque diff --git a/stacks/argo-cd/manifests/minio/minio.yaml b/demos/argo-cd/manifests/minio/minio.yaml similarity index 100% rename from stacks/argo-cd/manifests/minio/minio.yaml rename to demos/argo-cd/manifests/minio/minio.yaml diff --git a/stacks/argo-cd/projects/airflow.yaml b/demos/argo-cd/projects/airflow.yaml similarity index 100% rename from stacks/argo-cd/projects/airflow.yaml rename to demos/argo-cd/projects/airflow.yaml diff --git a/stacks/argo-cd/projects/minio.yaml b/demos/argo-cd/projects/minio.yaml similarity index 100% rename from stacks/argo-cd/projects/minio.yaml rename to demos/argo-cd/projects/minio.yaml diff --git a/demos/demos-v2.yaml b/demos/demos-v2.yaml index bc4d2591..00fc8d22 100644 --- a/demos/demos-v2.yaml +++ b/demos/demos-v2.yaml @@ -1,5 +1,33 @@ --- demos: + argocd: + description: Deploy Stackable operators and Airflow via ArgoCD and activate a simple Airflow DAG. + stackableStack: argocd + labels: + - argocd + - airflow + - job-scheduling + manifests: + ################################ + # projects + ################################ + - plainYaml: demos/argo-cd/projects/airflow.yaml + - plainYaml: demos/argo-cd/projects/minio.yaml + ################################ + # prerequisites + ################################ + - plainYaml: demos/argo-cd/applications/airflow-postgres.yaml + - plainYaml: demos/argo-cd/applications/minio.yaml + ################################ + # products + ################################ + - plainYaml: demos/argo-cd/applications/airflow.yaml + supportedNamespaces: + - argo-cd + resourceRequests: + cpu: 2401m + memory: 9010Mi + pvc: 24Gi airflow-scheduled-job: description: Activate a simple Airflow DAG to run continuously at a set interval stackableStack: airflow diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index 145df9de..73fd722c 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -14,7 +14,8 @@ spec: valuesObject: secretName: sealed-secrets-key - repoURL: https://github.com/stackabletech/demos.git - targetRevision: "{{ demoReleaseVersion }}" + # TODO: adapt to release-25.3 + targetRevision: "spike/argocd-demo" path: stacks/argo-cd/secrets/ destination: server: https://kubernetes.default.svc diff --git a/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml b/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml deleted file mode 100644 index bc631bc7..00000000 --- a/stacks/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml +++ /dev/null @@ -1,24 +0,0 @@ ---- -apiVersion: bitnami.com/v1alpha1 -kind: SealedSecret -metadata: - creationTimestamp: null - name: airflow-credentials - namespace: stackable-airflow -spec: - encryptedData: - adminUser.email: AgCmhs/OLHZ0j4CnTdZvfj76m+y7e62IuAeJ/LksxaTOWbHlvTJ0p8dBsp+WX3RfiuRK8M7kJDundrSKYzbkw8MISjoHF4/v4pSu6qWLBBuDPaMGh3i1bpAJ9gKUti4SGLhp7dr/Lx1oFWnY5T69WMARQqTbhHnpH70LPkFWKRvlIkCN26PbuYsE7stKXaVweEP204sfUChK5qzafE4Lcm5l+1yGFfILBBKAbBGxLX2I3O4n4LuP/iv0Ne14wGnxss80Qapt+ue8Ce16EZiJPtY+ZCXa05fYgtitVr393pYZks/fO9as76ABjWFc2lnE5GaGV58gK9V/5VRd1TBfkK3Y8UZPxqHNULlkwVh4Vy2EHHBMzhtec0m6w72aWuWFecyUNkrwIuivZ8e9tiH6aulpYqgLshnbDZCQi8yQVDNx/xLv4GH0/VvDUEIB7O13CHRL4M+OH+GYgLpJYqhTTkJNvXdrmjyK6kWeiErw8yG77akVplDGSG6LschN0DGhJVoZLLwbjvvM9em6tHu3gRSXAYhfG80bB9PMwmU9Lei+cdq6Fp7RceqxR3F6lnigP2e5gCaEpc6YYzBKEnzgcdlR1iA57D+5lBK9SwvWkppH5/dbPRkzt5+kqWaExRq8VmEnwooiBJ/4Jx4i4FKWFnx3cnDF5OYXovIKPyYPZW1HVvifrjHHZAOe1jORxYpMOwPYOLraDIO83comkVEBzCVUOh8v - adminUser.firstname: AgB3NcEnKhwMsyFPOfSTfxKFkhIg1TyeixtdqW8RSq5I6zrMX9we431QLuOSfxQlaizsm3o670wjO+4yDNpOGB4/vXaSSpA+835tiMDymJ/URR7vb1vvLV/xx6azdn5JmmHWd+yEja47TxQ1ip5KDai1Oxc0BKbgzu2Ogalq1U/56riSKSe8MvRjJ9KY8IwBpoY1rKAjTFJWavUVVt5Ms0fdSB7sL69NoKVzUQEpucTemy6k8RQFabK+KwirQ2KSDcQ5J+df/ODx1/HZKG8j81Wla7dBJ0nwIeie0StAZdZ+j9QlsWQF4zCRaEPxn9p1vken7Na/EqQdYwIV62o3mo66p06t+ObdjxKRHEO5BiY2lYqY3XcgaETBpaDfl2PiMbneLngGpBfOQSKnVZC60svqB/BpvBlMCiwcr+0ZJczFM1f+ptmJGHLJirf1kTYKvm6ezstGussB848Ca/ayhzzt9cestW9UFS/SlAo7d+N+YUKv3O+8QPIb5AdN2nPN9kcQxdh2T+ogtg3yIKsb6makP8LC6Z0Hl8C1DuzSh3Inj5VxcmkRuB9LRYymfNu+6GjkVlAWk58FUdQM5+5syMDgiHdVIMmnoTjRNm3mCm3l6g6rG33ggaAI4X1ypyjnmMlxbpRJi/+KgsQNNByYYQG1Foo3MZ7JFQojABBFMVSCPumMyjR7i8kvYCTr7acrHS3ZSjvR+Msz - adminUser.lastname: AgCYaEJ973OSMSL0vBrQcHbFtmqQls6Ids1xcPVz3/uVpxZw89Phn67Xx6dPSNHqZIYHWbZ/gV24xOJd0XbtlFINUknGgjwqjwGJHm4Q+0F1nmCVmhrRqB+Jc8I7qqb5BT6XpsgQOa0vazDc+NVKlgm2DmbIKz8VvHrhUNRb1rd33RYd3lm0Kj8lSl4QZm8tIX+BZi3J9gSLDIMzGQftg5BxS8Wt8cbYsMW8lFeZ6Dg7Fmx9r0GCeAa7kZWy8UME0saeKj13tg/oYj79MNFCu/Q510Q+YbLcQAJ22ifPgIaPdN4YK03DYL9qiIeo4im8rlgfKqHaNkfNzmXXh758T4s74Nau9KLdG+qE2+j175B9nrYjBYlT2EDoJIF6m1iiOCAc93tk4FIc3fw5RNLkOsAYdEWoECWLOdDloQsDHa+DGwHnF6d9ZpzlATnKLMOJ6F3+RAW10NzD38bWMlUUJoGZTuhVOz9tQCyFs2/SqMC8/LauMrHx2TFbKEq2kpc4MRTYwUQe9L+zQFI2Oc5HXGulXDdteShL6ayT8sXGRIsNI0lCpNhHsUauGJ7sSkW4bklGMEPzRh48+Lua2/QQKOcLWxgPx53b492/7SvWExx7rs+POSZouLdwUlngXC2D1H5yvmnPXEnnTLVGwBNDRBa+BBefocVOmq6yZGX5trkhudTr/Nu/rZQkDGUtSfiMDzd6Uo73LQ== - adminUser.password: AgA7BxW4/FggUvHMVvnYxdP6Pmju3uSskl29Lc1ywr6AbtCSqiysp29Ravyr0muT+PlEb5zmUYrct+HaffstMOudDCYw5wSm50hhelRPFgqppJgoUvXwfeUMkx73rrkddfN2RnCepUZxmkJ8PcXA38+KPwTZM4zZmOHeq7lgKDlsjgin/O0MrAeochZGJ1JmsJ0B3QUxFit4aURq4Pko67ytrWMJBO2KQRLHUm7Swf3umqjCBWuqfqhbRtKrWEOhoAEHDzKOq4fUCaV5rf2uxpvNCC0KJY6zmhPcPgZAO+Wuc+W9iNmM4ROoTFCvDS/stXcneDR7oRObgtXN5gn/0xno3xhdypg0lqfm2bEoEiokwu2GVwrzPr5iNI2HlUVhXeo9bNwjJ1alWjt0faUvwtZRSbKI1AihBF0gelbXhKT9Iyya336TTuz0riW3sFeDixHDTRoVC3ZaHzvCTXLTLtw3xgmhxM1mCebU+pxS8DV4AAIy9MfkK4ZHkjpcCdVbV5D4Mt2A9Ltm1O7qHlKsdWF0+vMmllLn7dZzAmtAiCiI9srOUh0xj+bIOqqN2Ky8a2K73JPh3kXxO5njW9N0/lFFQ4D98VpgI/DDqoZwX97yzLcthLb54xr6OUtduvX6rDakgrRZT4OCSvlGUIWzvtTcoDwuBubSuOnLh6AFNd7xz/Ik+eepInSOCMpd3HIdp5KBB3TPm9eLFcLW - adminUser.username: AgAQWpaTaFTvYsZx0p9Am3iTwoUEZ/pWiETvhVSF0NANgKe17V5b1lQj+DamMVlFUGfGgV8Qcxdyw4Lc71yzGgwEB0fQERoy54Z2lwVpYLJm2qLcXuolkzFSyZEMBBulddkTGhF/zhDZWfpOnayhfAbQyyp/T3KUuZira220DN9HiXDb5BiId1+Gzu6xTW6WD5/c+7yFiD6SWFReGpIuqHofh4y02p8A5RED2jtcr/p7ltCZ/tqjIpnZcTP5K7wauEjDiJmDbLTcdAmzdSEOI4Q952+oK3xjPAIrhhivC3DAtQ0lgV2ye9859tx+CDEEkLkjewascVNwmX1yeYPxnh8ayJfabkEpNM8KOfmrDE/AZB82FeKChmvAcpQAu3fUuxBMyUit6RkNW73fvDf8hIyOmNSZdr0f21FPhJWFYnsF4Qfm3zOo/fXuG1LJz2WB2Qy7RuTmRGW1AE4VQOvzvVDCEOq5BsVfPdlGrSfo5oeI6ctCqTL4S+2CXS3VRUkIX61QdN54CU7ZeT4cAzZGpkUP6elfsrLv0KnQc4KvvzfBNu71j3xgjjYN41aGDNi8dqWaCVebYbuQtDqbcxLxUQNX+VqBdCflMcnCOC4kAEI+B2n/rUrGLWjKUIMhZvZIKJQd437j1fvJo2AHO8TbqtORspg3/H8OuwZpwcDsWl1dVQ1B0EczZweo3I5NkytTVxNEEXjsQA== - connections.celeryBrokerUrl: AgBEl833Xp1UogzJpkpJ1zhjlw6KKAqcfWzSqQ8LIPQ96GaIUfo6G8wx7jozw7yEF0vnAuTTdzdEZ7x8/PVwWQyqNJKiS9o6mIEdkhv9mQ+EG/wzpB8dnbQR4Xl758f+dPRqbIA0RYetmcD9NsiF08obXIIzZA+G95kR6x24WiixwJL+txMNdno0Qu92fRqasv6jV22CUju/kUTRFEov5IrzGOj7gLKQ7d2yrCGZd/W9SnP9sgX1ltz78C2yiEXX7aI0n066OjJUxE7DFTJCUWNrknDcJuSjGFrWTzf8GNydrPmkVp6g5JA3fGgUTm76osischHr/0/+cwzQzEyQKyb5H/fxcAd/5yqtXhD/xibPDoVHs484PQAmgy8M3PMG8fNQ9XyrXNB/ZuxcCnt+rqPkeP0jqEsdxog2Q3U1lXfH/FU2eJr5tLHb1zNISV7vNX28VRzLoefyYFtHkp1F2yVYThmuSCPj1cqkfOpt02rYsIDIYqwryxxOvUpTAH0uNbdoIWSvXTzX2ZARUVVm0bboDgfe4RxVQofxKjk1mNPHhEZ9jYd6GX1G1SCYuSVdrRN4fLSOxlyP+vPkyzOJtQ7WmugBZFTmZ/iUN38ce4HbDIajVKtMvDqD35kkN/q4NZ3d+/YjmZA9YvJ03Hd0XNznImr8R4wqOt5oZsK2+XaMxHTzPfxV2MpLT9Xgb+CAHiGKvCaheKdRNWODhFQQXAw8l6t4z8dvYNkZPAZAD6ehFUtlvpTbHVVqtEdiTA== - connections.celeryResultBackend: AgBywQulzF0AZOPR8ypHDnsQIicOWUri9rV2sLwR8kiD+J98eT6CWvblzUv8x3/I4gJWwHbwjmACv5Ke+MD1GxqVsJYl2zc/A78SkVvNT6V+kaUFqxXMEQ3EJN7q+BHUPFphxQDS2Ur5+ssON1hth56L+HAxZLmt4XC9Fjz20cO7Dcx+vpgXG7KVtdRmLvchs0PCaMnMZDANg/rgGC9lMcgi3BROhobGapbp3+iLjiIDtNJ4SwwQpQaA5KWKXqC8Dmfvtm18lyNAK5oWSrMQI6+eWe+ML56C8bMlz3jtlZsFO6upe7eOueD1WoK1+YI+NEfvw3HDChgMaQ559x3y/pIG94F7QNtltZbfTfXptStQru+H2rxmCUBYb/BaHv3oqZsOgQe95LubQNfrpH9tIIygGZcQDZGjZsnfjmu1ahYzqiKb6UEoPxZJskIMy5BAakWQf0FiVJQa7stt7/k/NosBrUfJbyPJNWA6xVwilV7K4Auz4MuBsMk1fRofgpw3N85SeipVmU3673GIs+L1IFy8UEYAtYpv14aFOvqJrE4YBpkufr+K/IvVpYfvIBL2zAF3CKm9SEzYAQnADwb3UgOCIm8w233vogjHo5oqL8wacUeZgzrZ+T1FIR9e1tXrYxk2VLmyv5d0VOWYe0AleUk+O3rVdLpi5yUJQjvKnExVXzMMLsApTJ3dy5OHwou99Po1mlg2D6xh439hDUlAcUQz4NfGYvJtYSgAb5cjMs3bEMUcAuadGIGidlIy74HQArfXosundworwKC8 - connections.secretKey: AgBpwR5AZJUjGxJwi7rS6dLH7WJKYza4wKjPxLF+RVskwtwtkGtYSpbRZ+vXxE6pn47eJQC0OpJzreiNqYZtSR1CHv6HyHZsnqCSnLSzlUBCPp9H51nfVQ57V+S967/jEVJ3V7446gqQqdJb3IS4uwbb+G8CJsjsZiEcwx/z/OK5vu+k7TiG5jiyksxXhC7EFzYKfc/CD8Lsr6LBimUEa2i1W/PhOoDcqKa7qvDMIM/iAEilvtHXjA+EU8kxplDYy2an1cadockyyMSoHvDmSOg6BU62bK8Xqx9o0X6uaSrTufeueymtBYb/wVHB0bTxm1UXb8QdGYfDePemnP0oRNwvETrupuD0HRgEutetyxLYEEezC98ZpRM377kirX9Zqb0/fZ9YVwECBL7hznl/sp8w1hE2O76orf3iAGNMftrFtOjEyzro+41zd+bz+sy1ivGluIWwovQbgondk25AoYRC0LhGDl7kQDVX3ND/XeH2NYErAuCEyjQ1MGHLJxQGGDxoCPaDXtLMuHvXlg3H71jibzT7rV+YikAExjfUVim0kuDtKqdBwAhvRqX+Si/kCRMrIUhRowWSqx0g54U9mwC6wfbSHV90RnYtvBPbFc144WbgV7irc5bfnekidrCj8MiIPKegUByqlB26ziyexEmiRN74BH2yCJ/M2yf1IWSad0uqb5d/48BcgEP8E2BOgeeaCJ6WOMeR80qvas07hN5e - connections.sqlalchemyDatabaseUri: AgAFm5FacxXw3q9rxKT+9eTpY3FPf7NSp3wdPUUzkBpQPsEa0JvafDeIZ5/+MC9WaFBWuSt0awrIh/FyHlNW4/KRhTWzFL4h2MrDAfCEdCaOgB4wrgYJF7tGz3968eNhBn0ALX7MU6dgiGawPGvX91FgPo4dwz/5Ob5+f5MhA/paH8uBXR8W96cTTeJlcJaqLV/xMzGCInurUpOwyrLWu8zjOHNdn/11P3n5gKVlwbi6w57AKAYtqux869oh9al4kIbgIEbRYRI42Q2Xa3v+RtmFCX3CelCs6uoWtzNgt+wUbQbfi48MuHrakiJf49yrqFHdc2vfj03O8jlKLGSGcSsy5Epbb1VBuTh04jVXAO03xb6Top3gqZvxY8/gWOWPs0SejeilvubNIwj40bhzRxPj+r7TnE2dmS+KnTN1fYR1fk39C6SNjSKVncMie8PH/xfq8WOVZSGhzlIwYNMs7/WpXYLVs58Wz+pVVRcbYf/CQjRNKy4ikEf+eHwMLvmsvHnslxr9S9Bwt2An7mFkkO0VvGubCYfOK/W1SoN9NBhFmJO6Es3vfTKuS1gqgcJAzd1oz0+hz6Kno8XRpZUzdUa+P8LPo4Y+mhif+y9OH0sXFH5rYGWvLbUxEgFfdUMWQRKpGRqJiGNKFBLo0kpRt/DqG3v9wcWHbYLl+/cRLCsC46FUsPW5L73T4AEtV3TLh6Q5hZiHCWTEyxW4WyeFD6Bd7FLPNbIA8gMD0oCP3ztd+odbSDecURUzhQifICH/SCJl4VH8jvr40Rd+TjrqEj5t - template: - metadata: - creationTimestamp: null - name: airflow-credentials - namespace: stackable-airflow - type: Opaque diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 35e45149..ec207d46 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -20,8 +20,6 @@ stacks: # projects ################################ - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml - - plainYaml: stacks/argo-cd/projects/airflow.yaml - - plainYaml: stacks/argo-cd/projects/minio.yaml ################################ # operators ################################ @@ -35,12 +33,6 @@ stacks: # prerequisites ################################ - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml - - plainYaml: stacks/argo-cd/applications/airflow-postgres.yaml - - plainYaml: stacks/argo-cd/applications/minio.yaml - ################################ - # products - ################################ - - plainYaml: stacks/argo-cd/applications/airflow.yaml supportedNamespaces: - argo-cd resourceRequests: @@ -51,10 +43,6 @@ stacks: - name: stackableReleaseVersion description: Stackable release to be installed via Argo default: 25.3.0 - - name: demoReleaseVersion - description: The target revision, HEAD or e.g. release-25.3 - #default: release-25.3 - default: spike/argocd-demo - name: stackableOperatorNamespace description: Stackable namespace for the operators default: stackable-operators From 46f48b44b0e714503529f52940d603b1c9f3f432 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 10:31:52 +0200 Subject: [PATCH 017/101] install all operators --- .../applicationsets/commons-operator.yaml | 42 ------------------- .../applicationsets/listener-operator.yaml | 42 ------------------- .../applicationsets/secret-operator.yaml | 42 ------------------- .../applicationsets/spark-k8s-operator.yaml | 42 ------------------- ...operator.yaml => stackable-operators.yaml} | 36 ++++++++++++---- stacks/stacks-v2.yaml | 10 +---- 6 files changed, 28 insertions(+), 186 deletions(-) delete mode 100644 stacks/argo-cd/applicationsets/commons-operator.yaml delete mode 100644 stacks/argo-cd/applicationsets/listener-operator.yaml delete mode 100644 stacks/argo-cd/applicationsets/secret-operator.yaml delete mode 100644 stacks/argo-cd/applicationsets/spark-k8s-operator.yaml rename stacks/argo-cd/applicationsets/{airflow-operator.yaml => stackable-operators.yaml} (54%) diff --git a/stacks/argo-cd/applicationsets/commons-operator.yaml b/stacks/argo-cd/applicationsets/commons-operator.yaml deleted file mode 100644 index 19a2bbc6..00000000 --- a/stacks/argo-cd/applicationsets/commons-operator.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: commons-operator -spec: - # this interferes with stackablectl's templating and - # cannot really be used here properly but must be provided. - generators: - - list: - elements: - - cluster: development - template: - metadata: - name: commons-operator - spec: - project: stackable-operators - ignoreDifferences: - # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 - - group: "apiextensions.k8s.io" - kind: "CustomResourceDefinition" - jqPathExpressions: - - .spec.names.categories | select(. == []) - - .spec.names.shortNames | select(. == []) - - .spec.versions[].additionalPrinterColumns | select(. == []) - source: - repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableReleaseVersion }}" - chart: commons-operator - helm: - releaseName: commons-operator - destination: - server: https://kubernetes.default.svc - namespace: "{{ stackableOperatorNamespace }}" - syncPolicy: - syncOptions: - - CreateNamespace=true - - ServerSideApply=true - - RespectIgnoreDifferences=true - automated: - selfHeal: true - prune: true diff --git a/stacks/argo-cd/applicationsets/listener-operator.yaml b/stacks/argo-cd/applicationsets/listener-operator.yaml deleted file mode 100644 index 9053f49e..00000000 --- a/stacks/argo-cd/applicationsets/listener-operator.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: listener-operator -spec: - # this interferes with stackablectl's templating and - # cannot really be used here properly but must be provided. - generators: - - list: - elements: - - cluster: development - template: - metadata: - name: listener-operator - spec: - project: stackable-operators - ignoreDifferences: - # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 - - group: "apiextensions.k8s.io" - kind: "CustomResourceDefinition" - jqPathExpressions: - - .spec.names.categories | select(. == []) - - .spec.names.shortNames | select(. == []) - - .spec.versions[].additionalPrinterColumns | select(. == []) - source: - repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableReleaseVersion }}" - chart: listener-operator - helm: - releaseName: listener-operator - destination: - server: https://kubernetes.default.svc - namespace: "{{ stackableOperatorNamespace }}" - syncPolicy: - syncOptions: - - CreateNamespace=true - - ServerSideApply=true - - RespectIgnoreDifferences=true - automated: - selfHeal: true - prune: true diff --git a/stacks/argo-cd/applicationsets/secret-operator.yaml b/stacks/argo-cd/applicationsets/secret-operator.yaml deleted file mode 100644 index 7312c0bd..00000000 --- a/stacks/argo-cd/applicationsets/secret-operator.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: secret-operator -spec: - # this interferes with stackablectl's templating and - # cannot really be used here properly but must be provided. - generators: - - list: - elements: - - cluster: development - template: - metadata: - name: secret-operator - spec: - project: stackable-operators - ignoreDifferences: - # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 - - group: "apiextensions.k8s.io" - kind: "CustomResourceDefinition" - jqPathExpressions: - - .spec.names.categories | select(. == []) - - .spec.names.shortNames | select(. == []) - - .spec.versions[].additionalPrinterColumns | select(. == []) - source: - repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableReleaseVersion }}" - chart: secret-operator - helm: - releaseName: secret-operator - destination: - server: https://kubernetes.default.svc - namespace: "{{ stackableOperatorNamespace }}" - syncPolicy: - syncOptions: - - CreateNamespace=true - - ServerSideApply=true - - RespectIgnoreDifferences=true - automated: - selfHeal: true - prune: true diff --git a/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml b/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml deleted file mode 100644 index b5686b60..00000000 --- a/stacks/argo-cd/applicationsets/spark-k8s-operator.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: argoproj.io/v1alpha1 -kind: ApplicationSet -metadata: - name: spark-k8s-operator -spec: - # this interferes with stackablectl's templating and - # cannot really be used here properly but must be provided. - generators: - - list: - elements: - - cluster: development - template: - metadata: - name: spark-k8s-operator - spec: - project: stackable-operators - ignoreDifferences: - # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 - - group: "apiextensions.k8s.io" - kind: "CustomResourceDefinition" - jqPathExpressions: - - .spec.names.categories | select(. == []) - - .spec.names.shortNames | select(. == []) - - .spec.versions[].additionalPrinterColumns | select(. == []) - source: - repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableReleaseVersion }}" - chart: spark-k8s-operator - helm: - releaseName: spark-k8s-operator - destination: - server: https://kubernetes.default.svc - namespace: "{{ stackableOperatorNamespace }}" - syncPolicy: - syncOptions: - - CreateNamespace=true - - ServerSideApply=true - - RespectIgnoreDifferences=true - automated: - selfHeal: true - prune: true diff --git a/stacks/argo-cd/applicationsets/airflow-operator.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml similarity index 54% rename from stacks/argo-cd/applicationsets/airflow-operator.yaml rename to stacks/argo-cd/applicationsets/stackable-operators.yaml index 109ecc94..46a08902 100644 --- a/stacks/argo-cd/applicationsets/airflow-operator.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -2,17 +2,31 @@ apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: - name: airflow-operator + name: stackable-operators spec: - # this interferes with stackablectl's templating and - # cannot really be used here properly but must be provided. generators: - list: elements: - - cluster: development + # Left out as currently installed via stackablectl + # operator: commons + # operator: listener + # operator: secret + - operator: airflow + - operator: druid + - operator: hbase + - operator: hdfs + - operator: hive + - operator: kafka + - operator: nifi + - operator: opa + - operator: spark-k8s + - operator: superset + - operator: trino template: metadata: - name: airflow-operator + # {% raw %} + name: "{{ operator }}-operator" + # {% endraw %} spec: project: stackable-operators ignoreDifferences: @@ -25,13 +39,17 @@ spec: - .spec.versions[].additionalPrinterColumns | select(. == []) source: repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "{{ stackableReleaseVersion }}" - chart: airflow-operator + targetRevision: "25.3.0" + # {% raw %} + chart: "{{ operator }}-operator" + # {% endraw %} helm: - releaseName: airflow-operator + # {% raw %} + releaseName: "{{ operator }}-operator" + # {% endraw %} destination: server: https://kubernetes.default.svc - namespace: "{{ stackableOperatorNamespace }}" + namespace: stackable-operators syncPolicy: syncOptions: - CreateNamespace=true diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index ec207d46..6355b5bd 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -23,12 +23,7 @@ stacks: ################################ # operators ################################ - # currently deployed via stackablectl since it complains if no operators are deployed... - #- plainYaml: stacks/argo-cd/applicationsets/commons-operator.yaml - #- plainYaml: stacks/argo-cd/applicationsets/listener-operator.yaml - #- plainYaml: stacks/argo-cd/applicationsets/secret-operator.yaml - - plainYaml: stacks/argo-cd/applicationsets/airflow-operator.yaml - - plainYaml: stacks/argo-cd/applicationsets/spark-k8s-operator.yaml + - plainYaml: stacks/argo-cd/applicationsets/stackable-operators.yaml ################################ # prerequisites ################################ @@ -43,9 +38,6 @@ stacks: - name: stackableReleaseVersion description: Stackable release to be installed via Argo default: 25.3.0 - - name: stackableOperatorNamespace - description: Stackable namespace for the operators - default: stackable-operators - name: argocdAdminPassword description: Password of the ArgoCD admin user # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` From 5dca1f82cef9749447491d54b05b01422d4c16dc Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 10:34:36 +0200 Subject: [PATCH 018/101] fixes --- demos/argo-cd/applications/airflow.yaml | 2 +- demos/argo-cd/applications/minio.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/applications/airflow.yaml b/demos/argo-cd/applications/airflow.yaml index 9196c2cf..edf5ac43 100644 --- a/demos/argo-cd/applications/airflow.yaml +++ b/demos/argo-cd/applications/airflow.yaml @@ -11,7 +11,7 @@ spec: repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" - path: stacks/argo-cd/manifests/airflow/ + path: demos/argo-cd/manifests/airflow/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/applications/minio.yaml b/demos/argo-cd/applications/minio.yaml index bfea03c9..d3eaf0a5 100644 --- a/demos/argo-cd/applications/minio.yaml +++ b/demos/argo-cd/applications/minio.yaml @@ -11,7 +11,7 @@ spec: repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" - path: stacks/argo-cd/manifests/minio/ + path: demos/argo-cd/manifests/minio/ syncPolicy: syncOptions: - CreateNamespace=true From 95f9e5a6b2679cf245d34828907baf0369d3dbaa Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:41:28 +0200 Subject: [PATCH 019/101] use sealed secrets for minio / postgres --- .../applications/airflow-postgres.yaml | 35 ++++++++++--------- .../sealed-airflow-postgres-credentials.yaml | 17 +++++++++ .../airflow/airflow-credentials.yaml | 17 --------- demos/argo-cd/manifests/minio/minio.yaml | 15 -------- .../minio/sealed-minio-credentials.yaml | 17 +++++++++ 5 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml delete mode 100644 demos/argo-cd/manifests/airflow/airflow-credentials.yaml create mode 100644 demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index d59f9961..2d06423f 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -7,22 +7,25 @@ spec: destination: server: https://kubernetes.default.svc namespace: stackable-airflow - source: - repoURL: "registry-1.docker.io/bitnamicharts" - path: postgresql - # helm inspect chart oci://registry-1.docker.io/bitnamicharts/postgresql - targetRevision: 16.6.3 # 17.4.0 - chart: postgresql - helm: - # TODO this breaks naming as long as we use the airflow stack yaml which needs this svc name - releaseName: postgresql-airflow - valuesObject: - commonLabels: - stackable.tech/vendor: Stackable - auth: - username: airflow - password: airflow - database: airflow + sources: + - repoURL: "registry-1.docker.io/bitnamicharts" + path: postgresql + # helm inspect chart oci://registry-1.docker.io/bitnamicharts/postgresql + targetRevision: 16.6.3 # 17.4.0 + chart: postgresql + helm: + # TODO this breaks naming as long as we use the airflow stack yaml which needs this svc name + releaseName: postgresql-airflow + valuesObject: + commonLabels: + stackable.tech/vendor: Stackable + auth: + database: airflow + existingSecret: postgres-credentials + - repoURL: https://github.com/stackabletech/demos.git + # TODO: adapt to release-25.3 + targetRevision: "spike/argocd-demo" + path: demo/argo-cd/manifests/airflow-postgres syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml new file mode 100644 index 00000000..3af276ae --- /dev/null +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: postgresql-credentials + namespace: stackable-airflow +spec: + encryptedData: + password: AgAFfYyDQzfNHmkIuwkQjm8Z25AdLgelTPx43vKNggCrfHBjcBoA/5FKzwrfQxQldVFmuQtn7PpVagu6aZZfl+JBmzLwjYFA6kQPKYtLoskYvZpocfCAsWQJIp5yusI1780lT7b4JTz7LDkzVdy5aK2wm6/Nz5y5NzpEZNxThdc8tnzz0VtZHCpMdgi9q3CmhEPeWn0pOroocbCTkBg9pMiOOTH4YuCv1ca0/xtSSbFbFvN0luXhLIBBPWx7GVlJZGggVtiHNvvvCYVAGXogSXKWTAJv9HQvsV9ruHIa94UeWXnAXV9fhqq1nD700Nhmy0uDjBjntvvNTsKqhhVwOBKuvDYkmPXzSA98A+okty3+3Mv9D/fbAic20636tpzfEIAVGvnMkAhVhY4jth7QpTi4MMk18IiVOm58kSJz/oXDEpRB3CN6a7aB0HHf1xTqxKuqQ2FuZku+kriMAdgrBxCFGJPAcfi9PoqPjRWAawKrW3B9T8TJVYxnXmDvGUIaEMli9++J4laTI2ClER3udi+ZmcVZ3YZYrTdr7dhh7vyMJVLYIde9vh01FGBQZ0EOCPDp3ch0TtLKAAnH5jI0CYPvOgyLo+vUJufDIrIgRY7jwTZD9wmulQaFxH2V8CumCH5LHqOVLbY49oQZtAVrqIWUVyEejKgPkHGJiPQ63jHmz976RTdddAoi0BZ9LrLY/bqY67tctJtm + postgres-password: AgB7V06AGcL09k9vpmHOT417G5QY/sCmyN7OONfzEup898UpjD58SailnyZRSGwkhxo5Mhz9PlVP7AaFnMf+ZY/kVxEgjZ0kjBROB32e7zKwsITnp6ix7WJ85TYItde7P8YgyphmP4xxGx1crkFNjNDwJP0HtmIt9j0RN6EX+jDUupP9l6fH0LHFnJVE9NU6o2xvJa9gQs+iJ9peLzL8Nc4uXJiXrrdXl5ptrYti5w/cJpkKzlVoWpAeph390eog5QPU0dardhc/9WnmVfomjkJE4axwZl/yHbmcQTR0FgxXh24ICHRFBjPv9PdFhs7LsXqffkkt7RILEflUBBrSU2lCusn2Jscg6F4DBDR/6aa4eDu1tsk0UL2PVQzErErDt16qKPLaAygdevSsRCjXEcYlMnj+eFFAHiplEVMNc32yc70L13wf1rnndFAfXLNI2v1Aq6OoLnZ2HHFtpNxW8FKE+5vOyxykuUtU/E/alR5o3OrgZBgvmYQQLUap+NMAXjbbk/ZnVIAhPANOIs7rM2b5RLJmrEmIZkOZDPYt8/aRZezPdVb2THo2H3N1daOI6liA3WjdzFPNsawFRkDh2cBfQ308GzM49PhlGV5DDu99qDXWhy1a6nMdexZRiyv1cZ+GoBT0AKollpx6xh5XqF19d4BIpRFZlxHQ5b5heIQDNE639g3QsSTFqW9nS0NBVQLlajOJFwQ3 + template: + metadata: + creationTimestamp: null + name: postgresql-credentials + namespace: stackable-airflow + type: Opaque diff --git a/demos/argo-cd/manifests/airflow/airflow-credentials.yaml b/demos/argo-cd/manifests/airflow/airflow-credentials.yaml deleted file mode 100644 index aed1fd28..00000000 --- a/demos/argo-cd/manifests/airflow/airflow-credentials.yaml +++ /dev/null @@ -1,17 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: airflow-credentials - namespace: stackable-airflow -type: Opaque -stringData: - adminUser.username: admin - adminUser.firstname: Airflow - adminUser.lastname: Admin - adminUser.email: airflow@airflow.com - adminUser.password: adminadmin - connections.secretKey: airflowSecretKey - connections.sqlalchemyDatabaseUri: postgresql+psycopg2://airflow:airflow@postgresql-airflow/airflow - connections.celeryResultBackend: db+postgresql://airflow:airflow@postgresql-airflow/airflow - connections.celeryBrokerUrl: redis://:airflow@redis-airflow-master:6379/0 diff --git a/demos/argo-cd/manifests/minio/minio.yaml b/demos/argo-cd/manifests/minio/minio.yaml index 8681086f..687e37a7 100644 --- a/demos/argo-cd/manifests/minio/minio.yaml +++ b/demos/argo-cd/manifests/minio/minio.yaml @@ -5,21 +5,6 @@ kind: ServiceAccount metadata: name: "minio-sa" --- -# Source: minio/templates/secrets.yaml -apiVersion: v1 -kind: Secret -metadata: - name: minio - labels: - app: minio - chart: minio-5.4.0 - release: minio - heritage: Helm -type: Opaque -data: - rootUser: "YWRtaW4=" - rootPassword: "YWRtaW5hZG1pbg==" ---- # Source: minio/templates/configmap.yaml apiVersion: v1 kind: ConfigMap diff --git a/demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml b/demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml new file mode 100644 index 00000000..5a030480 --- /dev/null +++ b/demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: minio + namespace: minio +spec: + encryptedData: + rootPassword: AgBSBE4tAAJHV28O13Z+lg4CAzk/snvC+2WAM/ErBUeg4JiQZBIT+9o0MAIwM/IPcT7TpjrIpjx9UUiM5o8b/xjBIkxYBkpr8dNPE57IX+yVyWSxe5CPmBqazxEHU6cdlVT+s2NrydxyEsreSd6gs3+sHRd88AHQUhf3QJiD+hV2UE33jRe/so1if3OG9om5mNa/8EOqXeBnNBTCynaMDDuGyUcCUyzh5MEdaLG1YUu9flYCqlXNEsIkDR+1vgmbX1gcYdGcAIF7C71g8KMnGSt5dtAzxyuDhtDTCaq4+z3FbwEoJ4JQpmiDZzqtR5FDVUD8yS9b01Weg2cSlIEeNq83qN40wn8PkDQ6GEkl8Dou6yBpVklgnNJ+zgr+CxmFjrE6tGJnKQK1eOZmVCW43QFOOBvhyqXE0gpIlTO6rTzwfawHyWT1Wl83qCCcslb+/YylQx4tl/7fdFda5aNRN+1KQrfhkO9kc1zqeaJgO2nI31OpZOxu2U86WF9cQ/acFtOcF4/DDfYOu2dvvzyfzazfj6NIP0P2DjIpqIt7lTZ5t0SYgWB+cf5afsR8Y2TrO4K5B4Ys1Q9RTojqTuL/lyjuhNxYm2b/sIaQbBoJthntNrwaQO/KJ2nWngeRA+lFZTgbWigR6eQaLZXMIA+GioKKLiQxDiLeIvqfVMO6fwQWpeqznBruuQjVcB1aH18wLejD89ze9ztBI9JB + rootUser: AgAydeD6HzjMO94+dVqBLipjRRMLqHBDnAgqvDc+GUwT7dUuenMl2Qjx6D4G9Lk6HIuoqGpW1ZNVs65w+IEIETUGBR23I+E4drp2DFkGamXng+flkCJIvvvnmVoHYSDvO1mGEaqiF109vPOqj8vHtNHDjM89DdVWvdMkLQzM/XWK8pjIY/9g+K+a2te9yM3MzzlQBh7DPw5WdL5Nn97Ip5dUMA9D6fSLNidSqz24TLBbS9cLvRHERy9BLow7MqxyK0017iNH8TnpIzWphE+6iH9qPXGLNVlmeq8Ex4L74x3BIyas+yC2ErXPlvBNb/PG+L/788d4ZHW8JRNnQRhI2u8tvrf/Gg55/9a6hu2DQ+oqgT5jSJTPUE0meHIwAIVtLfxHozHYPD0IIdsgZgj89yfzaM3uIv02TnqAaDU113DVq5r7yZhh/THz9euw82/lPJYpuYwuSOuarddz18mOYWgQrhfBgOINxOr/OsFBl2HAfxnJyE2J4N50o4g9P5idr8+Px8P2bIKmrIbYI/YWVkHuGrslyXJFvdQvo3VJVXp7qGVJLOu3BTujxHc13CfMMDQGWXP3LvUFtDYH2fn1LHl0TlSlzyNzFdRir/b75tNKWRRuyOQ4qUJGSES1sDCmK7C8BA7d4oD0Sn0HZt7n4xp+3+b/8Rmicm/w8Uh1syTaxgW/2KQA9iXmHT8Un6gET71NF9E8mg== + template: + metadata: + creationTimestamp: null + name: minio + namespace: minio + type: Opaque From 74b893c63ac457ed8486b640daaf013107ebb7e4 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:44:27 +0200 Subject: [PATCH 020/101] add zookeeper --- stacks/argo-cd/applicationsets/stackable-operators.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml index 46a08902..4ef1670a 100644 --- a/stacks/argo-cd/applicationsets/stackable-operators.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -22,6 +22,7 @@ spec: - operator: spark-k8s - operator: superset - operator: trino + - operator: zookeeper template: metadata: # {% raw %} From 57f70cc0a631a0f2e3580abf6b3280fbdca73998 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:45:52 +0200 Subject: [PATCH 021/101] fix path --- demos/argo-cd/applications/airflow-postgres.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index 2d06423f..3c6c3cec 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -25,7 +25,7 @@ spec: - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" - path: demo/argo-cd/manifests/airflow-postgres + path: demos/argo-cd/manifests/airflow-postgres syncPolicy: syncOptions: - CreateNamespace=true From cbdb400ed57925c68d0a39f2241c109db2325a91 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:46:08 +0200 Subject: [PATCH 022/101] fix path 2 --- demos/argo-cd/applications/airflow-postgres.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index 3c6c3cec..a7c06b18 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -25,7 +25,7 @@ spec: - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" - path: demos/argo-cd/manifests/airflow-postgres + path: demos/argo-cd/manifests/airflow-postgres/ syncPolicy: syncOptions: - CreateNamespace=true From 0b436835690d3e02a50978043598dcb6d9923ae6 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:51:14 +0200 Subject: [PATCH 023/101] fix secret name --- demos/argo-cd/applications/airflow-postgres.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index a7c06b18..faf49c9e 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -21,7 +21,7 @@ spec: stackable.tech/vendor: Stackable auth: database: airflow - existingSecret: postgres-credentials + existingSecret: postgresql-credentials - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" From 3fa06919cc001b8a092ab4843314797cd85bf389 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 13:59:10 +0200 Subject: [PATCH 024/101] fix credentials --- .../airflow-postgres/sealed-airflow-postgres-credentials.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml index 3af276ae..a0d76fe7 100644 --- a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -7,8 +7,8 @@ metadata: namespace: stackable-airflow spec: encryptedData: - password: AgAFfYyDQzfNHmkIuwkQjm8Z25AdLgelTPx43vKNggCrfHBjcBoA/5FKzwrfQxQldVFmuQtn7PpVagu6aZZfl+JBmzLwjYFA6kQPKYtLoskYvZpocfCAsWQJIp5yusI1780lT7b4JTz7LDkzVdy5aK2wm6/Nz5y5NzpEZNxThdc8tnzz0VtZHCpMdgi9q3CmhEPeWn0pOroocbCTkBg9pMiOOTH4YuCv1ca0/xtSSbFbFvN0luXhLIBBPWx7GVlJZGggVtiHNvvvCYVAGXogSXKWTAJv9HQvsV9ruHIa94UeWXnAXV9fhqq1nD700Nhmy0uDjBjntvvNTsKqhhVwOBKuvDYkmPXzSA98A+okty3+3Mv9D/fbAic20636tpzfEIAVGvnMkAhVhY4jth7QpTi4MMk18IiVOm58kSJz/oXDEpRB3CN6a7aB0HHf1xTqxKuqQ2FuZku+kriMAdgrBxCFGJPAcfi9PoqPjRWAawKrW3B9T8TJVYxnXmDvGUIaEMli9++J4laTI2ClER3udi+ZmcVZ3YZYrTdr7dhh7vyMJVLYIde9vh01FGBQZ0EOCPDp3ch0TtLKAAnH5jI0CYPvOgyLo+vUJufDIrIgRY7jwTZD9wmulQaFxH2V8CumCH5LHqOVLbY49oQZtAVrqIWUVyEejKgPkHGJiPQ63jHmz976RTdddAoi0BZ9LrLY/bqY67tctJtm - postgres-password: AgB7V06AGcL09k9vpmHOT417G5QY/sCmyN7OONfzEup898UpjD58SailnyZRSGwkhxo5Mhz9PlVP7AaFnMf+ZY/kVxEgjZ0kjBROB32e7zKwsITnp6ix7WJ85TYItde7P8YgyphmP4xxGx1crkFNjNDwJP0HtmIt9j0RN6EX+jDUupP9l6fH0LHFnJVE9NU6o2xvJa9gQs+iJ9peLzL8Nc4uXJiXrrdXl5ptrYti5w/cJpkKzlVoWpAeph390eog5QPU0dardhc/9WnmVfomjkJE4axwZl/yHbmcQTR0FgxXh24ICHRFBjPv9PdFhs7LsXqffkkt7RILEflUBBrSU2lCusn2Jscg6F4DBDR/6aa4eDu1tsk0UL2PVQzErErDt16qKPLaAygdevSsRCjXEcYlMnj+eFFAHiplEVMNc32yc70L13wf1rnndFAfXLNI2v1Aq6OoLnZ2HHFtpNxW8FKE+5vOyxykuUtU/E/alR5o3OrgZBgvmYQQLUap+NMAXjbbk/ZnVIAhPANOIs7rM2b5RLJmrEmIZkOZDPYt8/aRZezPdVb2THo2H3N1daOI6liA3WjdzFPNsawFRkDh2cBfQ308GzM49PhlGV5DDu99qDXWhy1a6nMdexZRiyv1cZ+GoBT0AKollpx6xh5XqF19d4BIpRFZlxHQ5b5heIQDNE639g3QsSTFqW9nS0NBVQLlajOJFwQ3 + password: AgCt9AmvCSFrTO8mzuI2j3hmK8ue/f1Jqa/hXrIrH1Gjk5cMlELzHslhh/WVwNU5N37PhmAZLrepAoPXSis/pGt4BvwRav/+qTVW3Y7gYYtEKT5XAFBoqWmOy8xd+fwIXurzTLdDom09xaywm5uWnYjt8qk45HIpcP/eNXT1+QwSnmRx4OlHrEG6yUv/qKHFfVhngZuOnC51iH6Cpa3kna+8UYr1DZW2kyoLB+334fadOH6r0VW4Kl8FcZb15Re+fGjO5+/aQ3oBQiX+l/5GDB46C19buwvk8Ak4dTCSNXiQAHBUGXHAYR8L6iYRh1rwSr0f5LVZS5RRgco20nGMJWwTd2/hUr1prI/GOSH9kjDqQRJabxbeQKjIkYv9muEEH5qUGEN1j9m8rBUi/z9NQSx9apjB0YWX9nqXi6C1RmQ/GMYyEbWGgSXx+76UKOjmdAOnWPrriaQSR7YR8QjD5qBWYFzSbp/81O4Ua6BoFIQyfot7Owl4Z4B8Ce7T9kqFW5DBUf6uidP4hWdHvxmbxhhzwAqeotHEDCDJDINJ6zOg82ZSOaJHO6GRhTAMeERiv8WEVmUG4wgr6CaxXipShVjAdbHfnXPQoXYAhAAySQ9BgxvluAJxoY6cLQLAv34N23LND+bPdulY+ylLIdkR+eSp2uA7nPGTf5gofL1pQx4w3+ncGF6kc7lFRdLLM4kgRvUx8WYeDzqt + postgres-password: AgAFZH+PLIC4MCIE8dp+U/Y+DAu9B7Te2aZZjr7Tu1j7FjZSBXDSfu1XBC4d9a/Brwhlolw/HhBsKie6gQXWOxhIzI4wH9FN+mnkWwfnh9xXD2TU4XIRivARKZ10dpxsyRFTZzbKJNxDjnaTZxJMYQRQ24kX9WUHQYNjDIh8r2SVEjIeE5NMP7nPPJJVkqYqIeu5LyhDtyX80rsHQNI65d2Uot/9RIG7BEi4EF2MDHiEK0/O65pP+nH2VOJqxiHjp1P+GppE5MotFmLVOsL2q+z2nBSlNHT9ocBE17ozUPmWaIdvjmPQ5WkQxSHkqea/pD53geCB+Tr5jTOrP5KgulCFJOKIJ/77Ey9zEMlOl3cmqoD5k90S+AVJ+1WLVtdpHmkSJkdiwSAClxzH3LVgOcAxK5BzhCU3Z2AblzYmA4UiIxEHSdmdJleG2mBKyU1w5fjV77S6rn+vzjqzPsTF9l/siuvAxQn4wxHYGzerVe+N8FdPhTclTzmJ0usbbZZhfhvjLl85EW2LCAHpWDYx4D9ZU6RayhfxLqlTbFHj2stW8LCHogRkpktWT/Z9DoEy+9KQkdNxwV3PSR0wsV9A9ntGDBmdJafD3s0aDPsLbIxaONAOeAWxOpNY7POwBnH+uWLIrT1T3RNNrFaS8mjUU/1pMgZYBaMd9xMWLJ0q5JObNG3Oy6AWJ9gYupvZiv/nLprMgXwHyBFaILvSXLz9YldH template: metadata: creationTimestamp: null From d2b82f78722a95ed89be07ecc295845e116c84d7 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 14:08:25 +0200 Subject: [PATCH 025/101] attempt to fix secret --- .../airflow-postgres/sealed-airflow-postgres-credentials.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml index a0d76fe7..ef5896d3 100644 --- a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -7,8 +7,8 @@ metadata: namespace: stackable-airflow spec: encryptedData: - password: AgCt9AmvCSFrTO8mzuI2j3hmK8ue/f1Jqa/hXrIrH1Gjk5cMlELzHslhh/WVwNU5N37PhmAZLrepAoPXSis/pGt4BvwRav/+qTVW3Y7gYYtEKT5XAFBoqWmOy8xd+fwIXurzTLdDom09xaywm5uWnYjt8qk45HIpcP/eNXT1+QwSnmRx4OlHrEG6yUv/qKHFfVhngZuOnC51iH6Cpa3kna+8UYr1DZW2kyoLB+334fadOH6r0VW4Kl8FcZb15Re+fGjO5+/aQ3oBQiX+l/5GDB46C19buwvk8Ak4dTCSNXiQAHBUGXHAYR8L6iYRh1rwSr0f5LVZS5RRgco20nGMJWwTd2/hUr1prI/GOSH9kjDqQRJabxbeQKjIkYv9muEEH5qUGEN1j9m8rBUi/z9NQSx9apjB0YWX9nqXi6C1RmQ/GMYyEbWGgSXx+76UKOjmdAOnWPrriaQSR7YR8QjD5qBWYFzSbp/81O4Ua6BoFIQyfot7Owl4Z4B8Ce7T9kqFW5DBUf6uidP4hWdHvxmbxhhzwAqeotHEDCDJDINJ6zOg82ZSOaJHO6GRhTAMeERiv8WEVmUG4wgr6CaxXipShVjAdbHfnXPQoXYAhAAySQ9BgxvluAJxoY6cLQLAv34N23LND+bPdulY+ylLIdkR+eSp2uA7nPGTf5gofL1pQx4w3+ncGF6kc7lFRdLLM4kgRvUx8WYeDzqt - postgres-password: AgAFZH+PLIC4MCIE8dp+U/Y+DAu9B7Te2aZZjr7Tu1j7FjZSBXDSfu1XBC4d9a/Brwhlolw/HhBsKie6gQXWOxhIzI4wH9FN+mnkWwfnh9xXD2TU4XIRivARKZ10dpxsyRFTZzbKJNxDjnaTZxJMYQRQ24kX9WUHQYNjDIh8r2SVEjIeE5NMP7nPPJJVkqYqIeu5LyhDtyX80rsHQNI65d2Uot/9RIG7BEi4EF2MDHiEK0/O65pP+nH2VOJqxiHjp1P+GppE5MotFmLVOsL2q+z2nBSlNHT9ocBE17ozUPmWaIdvjmPQ5WkQxSHkqea/pD53geCB+Tr5jTOrP5KgulCFJOKIJ/77Ey9zEMlOl3cmqoD5k90S+AVJ+1WLVtdpHmkSJkdiwSAClxzH3LVgOcAxK5BzhCU3Z2AblzYmA4UiIxEHSdmdJleG2mBKyU1w5fjV77S6rn+vzjqzPsTF9l/siuvAxQn4wxHYGzerVe+N8FdPhTclTzmJ0usbbZZhfhvjLl85EW2LCAHpWDYx4D9ZU6RayhfxLqlTbFHj2stW8LCHogRkpktWT/Z9DoEy+9KQkdNxwV3PSR0wsV9A9ntGDBmdJafD3s0aDPsLbIxaONAOeAWxOpNY7POwBnH+uWLIrT1T3RNNrFaS8mjUU/1pMgZYBaMd9xMWLJ0q5JObNG3Oy6AWJ9gYupvZiv/nLprMgXwHyBFaILvSXLz9YldH + password: AgAwuhroRPQeCx9j4lS/+pdIfnKzb9OiOutLfN80HnRK8+4nAACpwv+pXUyMDpp4IgY913//lvGHL9EYEUxN8V2LCI6ev+cd2MnbCL1zNE0RzFkeVEQgNlej+o+I/iS2KIHw8Z9q9vKmsfRFY1eOI+j86v5SA6sGSNFn4oRaYPapCZimqmi1BY9gV46mJC91hEJTu2HRZzr19JaZPb/CFudL6lX8oM5MmgKBJdlHCxX+G95h2zd2RiMpUhUpOSwESQ4cZFnRtTvTQiQaUBo72893ZGJGXP9AH+pqIp9p+UhAn56HV2StDaiC9weIz6RcfXCj/jFJiBWLzixqXGyQUhBepviE2DTY8Kguv/7c+bJ58Lp4qRMxVJrk/HxCJ+yiqDOfr+G6oxdhAJmQpqOp6u95ZOqPjvU0X9Pg3vwdw2KTdmxD6RVrsl3ZVv84Gey2HCkSe02JSO/9/JFJjA3fBnlzMyp+Bli/4/2ZjkDL0cxDdI7AOIPyEKitp1gJqJDGz7frKffKsWdHkrsRxPQhfk40BwbBG8z/V/gX6IEi9yhWTD1oP+r6tRA9ZxeJP4CNp6DC+9de/ACLt2UjxfKUP3No4fr+1ZuRWzwJa4ExTR3vWIVPLru8WAi4xoJvQclf6GIuwR3qmqj3oBDJJp1v2VAQgDc7U2oD3QdayfxPCuqJHt4uV2gsUFcfVVvePvoIvz4aTwRDtD79 + postgres-password: AgCo/nYBzH2rLBsSZjYX47OI/NCblDtXSvHvhH2IA8FKoZCcxh+ZV0Mg3YaZpaeSsT59FnwnbApFfVrCxXEFdubpWNvwWt+wE0UFZazUdst4x+OdUQlG2b4V6hs9pbt94h7G+OXDsgMblAACitqRaJufOaemgBh6ZU8bhU2flgMn02hFWaooilhQKoKWybDRNEr5oMzVRaxAAVoWhGzjoCRX0J73ZwCHUKvTZ/CH6vgoiKq4q2HpMEzxbZFTfOAsbWgEGxmk7230WQTIBn9ynERPAEgo5jRyug1cVtH3+t7dgH+HthkgI+m5tfgc7bEbBPtbaW53O2M31FZGMVTwlUl5AyqHZyUWU8DT2PlrUx/vQYFip8BtpBdIaKKWLQBv97YKaGSGLy1YoWuaTXAJaQhbcfeAa32+929P0DYD/8aVV/7HfbyIyrS4ZzJr5z4xa9942fxSnxwAHfNDGxrgSig1M6q2vNFpXppC/HP2TN9OGTh34HlsE4k5a4a66Ue94kA+zZtis2t1kWmrI3MrJ4p6wo6LOYqOVrb5g6D9HVwG+0nyPoWUtnDK6g/X07zQNAo8i6O36WspS05UGpAWX6idgVkPTBMq3TePKJweRhLFHUnwLyeylqQDJP0shhGrItvbfFDtmLBaxnEdAWoG3BU1qfw2gWMXR+zQqMvhXF5P8roZPL/FsYHgqH/WUTWiwW2YNBDFG8EPSOby8qo= template: metadata: creationTimestamp: null From a7a95fcbef28f9f59536dd0f96253baf3c9cdf47 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 14:30:11 +0200 Subject: [PATCH 026/101] seal minio connection --- .../applications/airflow-postgres.yaml | 12 ++++---- .../sealed-airflow-postgres-credentials.yaml | 4 +-- demos/argo-cd/manifests/airflow/airflow.yaml | 29 ++++++++++++++----- .../sealed-airflow-minio-connection.yaml | 16 ++++++++++ 4 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index faf49c9e..8a550d1d 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -20,12 +20,14 @@ spec: commonLabels: stackable.tech/vendor: Stackable auth: + username: airflow + password: airflow database: airflow - existingSecret: postgresql-credentials - - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release-25.3 - targetRevision: "spike/argocd-demo" - path: demos/argo-cd/manifests/airflow-postgres/ + # existingSecret: postgresql-credentials + # - repoURL: https://github.com/stackabletech/demos.git + # # TODO: adapt to release-25.3 + # targetRevision: "spike/argocd-demo" + # path: demos/argo-cd/manifests/airflow-postgres/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml index ef5896d3..9a4bbca6 100644 --- a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -7,8 +7,8 @@ metadata: namespace: stackable-airflow spec: encryptedData: - password: AgAwuhroRPQeCx9j4lS/+pdIfnKzb9OiOutLfN80HnRK8+4nAACpwv+pXUyMDpp4IgY913//lvGHL9EYEUxN8V2LCI6ev+cd2MnbCL1zNE0RzFkeVEQgNlej+o+I/iS2KIHw8Z9q9vKmsfRFY1eOI+j86v5SA6sGSNFn4oRaYPapCZimqmi1BY9gV46mJC91hEJTu2HRZzr19JaZPb/CFudL6lX8oM5MmgKBJdlHCxX+G95h2zd2RiMpUhUpOSwESQ4cZFnRtTvTQiQaUBo72893ZGJGXP9AH+pqIp9p+UhAn56HV2StDaiC9weIz6RcfXCj/jFJiBWLzixqXGyQUhBepviE2DTY8Kguv/7c+bJ58Lp4qRMxVJrk/HxCJ+yiqDOfr+G6oxdhAJmQpqOp6u95ZOqPjvU0X9Pg3vwdw2KTdmxD6RVrsl3ZVv84Gey2HCkSe02JSO/9/JFJjA3fBnlzMyp+Bli/4/2ZjkDL0cxDdI7AOIPyEKitp1gJqJDGz7frKffKsWdHkrsRxPQhfk40BwbBG8z/V/gX6IEi9yhWTD1oP+r6tRA9ZxeJP4CNp6DC+9de/ACLt2UjxfKUP3No4fr+1ZuRWzwJa4ExTR3vWIVPLru8WAi4xoJvQclf6GIuwR3qmqj3oBDJJp1v2VAQgDc7U2oD3QdayfxPCuqJHt4uV2gsUFcfVVvePvoIvz4aTwRDtD79 - postgres-password: AgCo/nYBzH2rLBsSZjYX47OI/NCblDtXSvHvhH2IA8FKoZCcxh+ZV0Mg3YaZpaeSsT59FnwnbApFfVrCxXEFdubpWNvwWt+wE0UFZazUdst4x+OdUQlG2b4V6hs9pbt94h7G+OXDsgMblAACitqRaJufOaemgBh6ZU8bhU2flgMn02hFWaooilhQKoKWybDRNEr5oMzVRaxAAVoWhGzjoCRX0J73ZwCHUKvTZ/CH6vgoiKq4q2HpMEzxbZFTfOAsbWgEGxmk7230WQTIBn9ynERPAEgo5jRyug1cVtH3+t7dgH+HthkgI+m5tfgc7bEbBPtbaW53O2M31FZGMVTwlUl5AyqHZyUWU8DT2PlrUx/vQYFip8BtpBdIaKKWLQBv97YKaGSGLy1YoWuaTXAJaQhbcfeAa32+929P0DYD/8aVV/7HfbyIyrS4ZzJr5z4xa9942fxSnxwAHfNDGxrgSig1M6q2vNFpXppC/HP2TN9OGTh34HlsE4k5a4a66Ue94kA+zZtis2t1kWmrI3MrJ4p6wo6LOYqOVrb5g6D9HVwG+0nyPoWUtnDK6g/X07zQNAo8i6O36WspS05UGpAWX6idgVkPTBMq3TePKJweRhLFHUnwLyeylqQDJP0shhGrItvbfFDtmLBaxnEdAWoG3BU1qfw2gWMXR+zQqMvhXF5P8roZPL/FsYHgqH/WUTWiwW2YNBDFG8EPSOby8qo= + password: AgAiudvaW+Vk7SUbXFSNuHOqfLeZzfNTg2mVDv7+YaZicFhO8JjspjjGEzBsxZqiXEVAkx4Ui2IvLe+SeTAM3NNE62VpG6JTipzF1QEC8seh6CpvlitkCWcmu4izhUY/30qQVRmcuWDbiGOJMCQfd9fQNr9BGPNf4v0Bm4/JRBQlAzZHjNuZvlrQXDXh8VJpaNix4+h7AWKbhADUwex37Qm3reumYGyB2s9WDQ1wzpZxo4N6lxn4CMOmEBt6ROZF/ZJlhYH5FOfB5531Mv2ohs1F6aR1ms+KnJUJOw27LVH9rOqbLv22LN63KfgHHTlh7xY4Tg4sMDa2rbJE68BtYtdvFD4cTp6Q3G/6sWlfEbW4OTDghrW++Ah/y1Oyaz/2Fl6Gwg6iP8naKqqX6dznuuDeRFgZEgQGgaJYjbe/ql+9HdIjlbk07Oe04XK6y5COzncN+RP9QbgsvSjXhohjmOsPLAZdSgwZRh7wcwdxSxmvP6oZCm9bxBMmWQm3TNFp3j3X556sAN81zhjbG4uMqlzcFyfFUxzDstiDlUGISMgGCrzGZaRL2esJpZA4SH5awISsr+su8uzMV66byvj53CuTzFqFM/rdh4H/ZQPasdsXHjBJRF9f2Mbve4KI8A8Sf0ci1HTVRWkS3rtQfqNbtd+wLWU30A2NHbYLEuHtN3K3R6FV54LA4872JyMlNJkkbT9Etpa3eNZO + postgres-password: AgCWp/TsvOCQIpg29hQosIGxR2T1bCWP4fT7NfBz5k1jmsI7i3VQNDE7/mO4mfEZV+EJLuHGfeSggAq1wxbJclMm2CzgarEstOtrduG/M1Ak4o3JJCmHcMLbJMghVSMoBIOPoYfSLB6UQUyr8FsvutIpXRcet41pFN6G4n/YZ1xDBnfiE6d8EDnJeEvFB5zTkQ9cwsDMUf2PKEZMH4SY+pumDjqPZXEi4uW+6JqL79u4KlcUqSDmB3gQ3PSlovMm9ls3zDokbH1TchR+4ycG+qen8NpD5zplcjF5RsM3mx++5KjPykcO0bzxJbygUylU52oMPv6Yo129k4KI1JNeDSqug3ZxgmgQlEs5V5aAlZYrObd1PRJZaZO+9vlDeoFrc++4Zysu0ydCWApjZqOZdXPZgIe8yNXT41b2XcEZvUgZT7rrr6n6KrTD31X2z4GHWw+sdYfIDDGVyn9YHfUjKOhds18MDi4iKLPRhWrRq+w7Rhyrxve4MnZlWoNQ8/YwN2Qkhb8EWMFEb/+EcpElUTwC8yVSd9V0dDkwlEnENb079i404qzKs7R3hP67fxr6s8A2F6Hfdty8XV8HRbMV/b7fzMriO8R3KRwJZUR93EesqkfQQrTgppwSu4+llMCTeO4GQf2Y+wRBnXE5j2YZmwgL/+vkpiXeLn2Kfc+vFsUJS7ANthf7RRRwchmlJhPAWOhv9XFbA9DwYrYXUSU= template: metadata: creationTimestamp: null diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index de8613d1..8aee92a5 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -43,6 +43,25 @@ spec: - name: minio-tls mountPath: /stackable/minio-tls webservers: + envOverrides: &envOverrides + AIRFLOW__CORE__DAGS_FOLDER: "/dags" + AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" + # Via sealed secrets, just kept for reference here + #AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" + AWS_CA_BUNDLE: "/stackable/minio-tls/ca.crt" + AIRFLOW__LOGGING__REMOTE_LOGGING: "True" + AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ + AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio + podOverrides: &podOverrides + spec: + container: + - name: airflow + env: + - name: AIRFLOW_CONN_MINIO + valueFrom: + secretKeyRef: + name: airflow-minio-connection + key: airflow-minio-connection config: resources: cpu: @@ -53,19 +72,13 @@ spec: gracefulShutdownTimeout: 30s roleGroups: default: - envOverrides: &envOverrides - AIRFLOW__CORE__DAGS_FOLDER: "/dags" - AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" - AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" - AWS_CA_BUNDLE: "/stackable/minio-tls/ca.crt" - AIRFLOW__LOGGING__REMOTE_LOGGING: "True" - AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ - AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio replicas: 1 kubernetesExecutors: envOverrides: *envOverrides + podOverrides: *podOverrides schedulers: envOverrides: *envOverrides + podOverrides: *podOverrides config: gracefulShutdownTimeout: 30s resources: diff --git a/demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml b/demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml new file mode 100644 index 00000000..8e9f4f8d --- /dev/null +++ b/demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: airflow-minio-connection + namespace: stackable-airflow +spec: + encryptedData: + airflow-minio-connection: AgAHQL1NIeZiWH1opQYqHINixw0muWaNsYKMhtgJqqdVMLeKIU/sckZ7Z6aokaEYXGVQRe+Tp+D9AaYaF5CdKeMQKQ3MmhxXYZh0EuAcNRyvz4u4K696KEIa4XpaT5k6oRbIwRUGCc4hiRVApmMOgGYl4iEwVQ/1Twd5ffEAohMsySgZQBn17zB+hKC3u2AcIrZ1btHvBrVhC4pil/kyytBwjTkMq1iAkF8lwt7gatLukD9ldLaVdYTe21R+nP/UT7DwHRnBlI1dzkfrMdplFud2XIEmSrFF7ihzc5r+Lsm2vsnjaV5OgzDjIPI3RRA7g8/06Lebpru/E9h6HB5RIu59ga72g02QIHh5HffGUCnbEsLTDDbBcuAQB2jSodotfsofVKOhZChOIJDchvohhrQ86wqlkQyjfNMq2Gh46Nc7ZjomlpL/p0afmak34GFoPYMCD7IJ2DafEsmKA8dYfjTI1kVzLhYuoeDB3f82tu8xL9cXCEUsw7Y7EosZjeITeLcV1oMm+jeHzNHGaLmCI9k1sY5bL6xjbG59sOvuEgI302tS9ua592u9uqOOKKjE4eZM7CAmEjgMmDPbeteXGnZcOqfj8FWmlp0f4gm9s+68KH5PDtkKdtBckNjDeLj3QhMC2gstXnPJR3Hnm/bFQ4i/6XpnkuOFCvQT/Baar5scw4vhJ0tN8TGeMd651YXU7N2MEB+2WtiO0StbzhcWIoiGmvN+SRLawPZ87Sqlt26/bs5+jnuEv4Fy1oXhxbZwuf/YsZjEaKFI+HbFVvwM0K2d00/z9DYAB44oY2PmrZwsk0KqP2hkuumq + template: + metadata: + creationTimestamp: null + name: airflow-minio-connection + namespace: stackable-airflow + type: Opaque From 450775e81ec06e3430defdbc8466d1a3230cab69 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 14:35:26 +0200 Subject: [PATCH 027/101] fix secret --- demos/argo-cd/applications/airflow-postgres.yaml | 12 +++++------- .../sealed-airflow-postgres-credentials.yaml | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index 8a550d1d..faf49c9e 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -20,14 +20,12 @@ spec: commonLabels: stackable.tech/vendor: Stackable auth: - username: airflow - password: airflow database: airflow - # existingSecret: postgresql-credentials - # - repoURL: https://github.com/stackabletech/demos.git - # # TODO: adapt to release-25.3 - # targetRevision: "spike/argocd-demo" - # path: demos/argo-cd/manifests/airflow-postgres/ + existingSecret: postgresql-credentials + - repoURL: https://github.com/stackabletech/demos.git + # TODO: adapt to release-25.3 + targetRevision: "spike/argocd-demo" + path: demos/argo-cd/manifests/airflow-postgres/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml index 9a4bbca6..bd47fe64 100644 --- a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -7,8 +7,8 @@ metadata: namespace: stackable-airflow spec: encryptedData: - password: AgAiudvaW+Vk7SUbXFSNuHOqfLeZzfNTg2mVDv7+YaZicFhO8JjspjjGEzBsxZqiXEVAkx4Ui2IvLe+SeTAM3NNE62VpG6JTipzF1QEC8seh6CpvlitkCWcmu4izhUY/30qQVRmcuWDbiGOJMCQfd9fQNr9BGPNf4v0Bm4/JRBQlAzZHjNuZvlrQXDXh8VJpaNix4+h7AWKbhADUwex37Qm3reumYGyB2s9WDQ1wzpZxo4N6lxn4CMOmEBt6ROZF/ZJlhYH5FOfB5531Mv2ohs1F6aR1ms+KnJUJOw27LVH9rOqbLv22LN63KfgHHTlh7xY4Tg4sMDa2rbJE68BtYtdvFD4cTp6Q3G/6sWlfEbW4OTDghrW++Ah/y1Oyaz/2Fl6Gwg6iP8naKqqX6dznuuDeRFgZEgQGgaJYjbe/ql+9HdIjlbk07Oe04XK6y5COzncN+RP9QbgsvSjXhohjmOsPLAZdSgwZRh7wcwdxSxmvP6oZCm9bxBMmWQm3TNFp3j3X556sAN81zhjbG4uMqlzcFyfFUxzDstiDlUGISMgGCrzGZaRL2esJpZA4SH5awISsr+su8uzMV66byvj53CuTzFqFM/rdh4H/ZQPasdsXHjBJRF9f2Mbve4KI8A8Sf0ci1HTVRWkS3rtQfqNbtd+wLWU30A2NHbYLEuHtN3K3R6FV54LA4872JyMlNJkkbT9Etpa3eNZO - postgres-password: AgCWp/TsvOCQIpg29hQosIGxR2T1bCWP4fT7NfBz5k1jmsI7i3VQNDE7/mO4mfEZV+EJLuHGfeSggAq1wxbJclMm2CzgarEstOtrduG/M1Ak4o3JJCmHcMLbJMghVSMoBIOPoYfSLB6UQUyr8FsvutIpXRcet41pFN6G4n/YZ1xDBnfiE6d8EDnJeEvFB5zTkQ9cwsDMUf2PKEZMH4SY+pumDjqPZXEi4uW+6JqL79u4KlcUqSDmB3gQ3PSlovMm9ls3zDokbH1TchR+4ycG+qen8NpD5zplcjF5RsM3mx++5KjPykcO0bzxJbygUylU52oMPv6Yo129k4KI1JNeDSqug3ZxgmgQlEs5V5aAlZYrObd1PRJZaZO+9vlDeoFrc++4Zysu0ydCWApjZqOZdXPZgIe8yNXT41b2XcEZvUgZT7rrr6n6KrTD31X2z4GHWw+sdYfIDDGVyn9YHfUjKOhds18MDi4iKLPRhWrRq+w7Rhyrxve4MnZlWoNQ8/YwN2Qkhb8EWMFEb/+EcpElUTwC8yVSd9V0dDkwlEnENb079i404qzKs7R3hP67fxr6s8A2F6Hfdty8XV8HRbMV/b7fzMriO8R3KRwJZUR93EesqkfQQrTgppwSu4+llMCTeO4GQf2Y+wRBnXE5j2YZmwgL/+vkpiXeLn2Kfc+vFsUJS7ANthf7RRRwchmlJhPAWOhv9XFbA9DwYrYXUSU= + password: AgAW0KA8iN9DeYjbGhYkM9xP4NwWK78YhZR43WI20igr7ZZucfHhANCWdCcNZFaakS73B/XK4wgN/gg9N+XJQY8MsDsfYrvVNVmrEBP1Hs7ryMbbDEGWuc8WTB7oq57O7HEtbI/anitpKLQHvciTpfz7m2gxpxd/DmZdMgKVER2CHqIH6r1pkREQWDKx2rBhPForFd8nXs5J5ALgD32XMCUE7P/nqgk0yr5b3OxFUflweAFMaQcTRpwu3AEeoQSOFquPXDaqNclww8FOPrE2EeitPq0YV1O5smFHlazYMqr8wk+WQuRK48Hn3/8SVHZEmKjH6it85//+VVaVhNmuUQlaxSBTZqY4aXI47Vfn92i3ICmUp7pGcD2AfNJ2+Xp2krXUQW+LVyVHI/0JpJsiGAz9I/CHr5Gs23R6GmLedzZJR3SVIvEWkxd2Y6iXow5Yvz2v5UgRXugn5ai2gPBqwrGUf5msuCV83f8LgcAVgZbpL2izfyuXLVvrE1Snv1/IJbPpPxTI9gb5xOS7KHQbveiq+QL5rRcVemLKUkzKn9dXLynCxyUo/QYRDdl83kaOacwFZN38yke01wGe0aJ9G9935DCheDKijEXCTbjzbjr5LuQYMxEBNmNiAz1Iq64E3W0O9PG0Nyhqd445gA/XWqk6r9ExCDhQ+TyGp2ZNMgNtlDuzc2eb/bqw3LTyvDqiWINwCcwJKeRA + postgres-password: AgAL+Go2p0sE5fkrFiInfUqQ2XTvaAT9B/exQI+LXI1ESzfANIx6nBC3GZv7ywIzBojScr3n32QFnyjZXsP2nG03+XQVdHXrVFWaSYwvyBlFmv5Zgsc26OK3jsptO0OsSxVN6PW4Y+oeTJVjLSjzCnFpQRSaN1G6IXUuEC8PMgRSPkX417xkX76xBIsK5UhGpiE5URo/0su8tacR+ncSP+jKSXO8TokyBuDHyrAlbEROdZLqtJZJsS5RWuvr66Du6qW8d6MR4ox/+mx585/lMgsQq/jHjSTlxJYQJUAW18wvDzKc6o7vW3O5jTN6Q30va/0KEN+1e6pMOqLXKdvfmdR70UxuBTR2NfeBCXCl6mr/oWEKUn4smRsmSWWC6DpvGMaIslmH3IK0SyNFSn81xpnKR9O81cvLIaN65MAfr+oUqNCUPSkroHWyFEDjiMJmOLx8pqaH+QHP0ibB27CI97xDaYJbXK+eHnjfBa4f7ierYX6HBbgfuqL0E34VyArFbPOmDjsVBsMcKzpC3NPAAcy6WxVqiBHhHdTRnN5U3p883TFGxsK2xH/Bkls2sgXVNUWKt4bWiP8jpnYhuekVrljIBOTaDB2ikemguXrPgxwc/QVDcuoOCDB7d1/jRRUCsVPzmL524ik1M5hw1qShyIMdEy6ZCwTwTUsaGwfwWyyGkIDqC236osYbCyemRf/W1F72fX3yRpHGdRgU template: metadata: creationTimestamp: null From 9319fcf18f7cab1ed8cbe5ea865b7363e4e24a83 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 14:46:14 +0200 Subject: [PATCH 028/101] try fix postgres secret --- demos/argo-cd/applications/airflow-postgres.yaml | 1 + .../sealed-airflow-postgres-credentials.yaml | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index faf49c9e..df12dbc8 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -21,6 +21,7 @@ spec: stackable.tech/vendor: Stackable auth: database: airflow + username: airflow existingSecret: postgresql-credentials - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml index bd47fe64..51bd342f 100644 --- a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml +++ b/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml @@ -7,8 +7,10 @@ metadata: namespace: stackable-airflow spec: encryptedData: - password: AgAW0KA8iN9DeYjbGhYkM9xP4NwWK78YhZR43WI20igr7ZZucfHhANCWdCcNZFaakS73B/XK4wgN/gg9N+XJQY8MsDsfYrvVNVmrEBP1Hs7ryMbbDEGWuc8WTB7oq57O7HEtbI/anitpKLQHvciTpfz7m2gxpxd/DmZdMgKVER2CHqIH6r1pkREQWDKx2rBhPForFd8nXs5J5ALgD32XMCUE7P/nqgk0yr5b3OxFUflweAFMaQcTRpwu3AEeoQSOFquPXDaqNclww8FOPrE2EeitPq0YV1O5smFHlazYMqr8wk+WQuRK48Hn3/8SVHZEmKjH6it85//+VVaVhNmuUQlaxSBTZqY4aXI47Vfn92i3ICmUp7pGcD2AfNJ2+Xp2krXUQW+LVyVHI/0JpJsiGAz9I/CHr5Gs23R6GmLedzZJR3SVIvEWkxd2Y6iXow5Yvz2v5UgRXugn5ai2gPBqwrGUf5msuCV83f8LgcAVgZbpL2izfyuXLVvrE1Snv1/IJbPpPxTI9gb5xOS7KHQbveiq+QL5rRcVemLKUkzKn9dXLynCxyUo/QYRDdl83kaOacwFZN38yke01wGe0aJ9G9935DCheDKijEXCTbjzbjr5LuQYMxEBNmNiAz1Iq64E3W0O9PG0Nyhqd445gA/XWqk6r9ExCDhQ+TyGp2ZNMgNtlDuzc2eb/bqw3LTyvDqiWINwCcwJKeRA - postgres-password: AgAL+Go2p0sE5fkrFiInfUqQ2XTvaAT9B/exQI+LXI1ESzfANIx6nBC3GZv7ywIzBojScr3n32QFnyjZXsP2nG03+XQVdHXrVFWaSYwvyBlFmv5Zgsc26OK3jsptO0OsSxVN6PW4Y+oeTJVjLSjzCnFpQRSaN1G6IXUuEC8PMgRSPkX417xkX76xBIsK5UhGpiE5URo/0su8tacR+ncSP+jKSXO8TokyBuDHyrAlbEROdZLqtJZJsS5RWuvr66Du6qW8d6MR4ox/+mx585/lMgsQq/jHjSTlxJYQJUAW18wvDzKc6o7vW3O5jTN6Q30va/0KEN+1e6pMOqLXKdvfmdR70UxuBTR2NfeBCXCl6mr/oWEKUn4smRsmSWWC6DpvGMaIslmH3IK0SyNFSn81xpnKR9O81cvLIaN65MAfr+oUqNCUPSkroHWyFEDjiMJmOLx8pqaH+QHP0ibB27CI97xDaYJbXK+eHnjfBa4f7ierYX6HBbgfuqL0E34VyArFbPOmDjsVBsMcKzpC3NPAAcy6WxVqiBHhHdTRnN5U3p883TFGxsK2xH/Bkls2sgXVNUWKt4bWiP8jpnYhuekVrljIBOTaDB2ikemguXrPgxwc/QVDcuoOCDB7d1/jRRUCsVPzmL524ik1M5hw1qShyIMdEy6ZCwTwTUsaGwfwWyyGkIDqC236osYbCyemRf/W1F72fX3yRpHGdRgU + database: AgAlOcdpjYAaeiHbIwmGM3lb7okU4DROr+4bs7oQBPBY924XdamqlSw4Y7V8svvHRqD5Hz8SRx0SY2dkLaBQZBaXKV8qaMaVdqX0zK8zvoIbw/bQFXMTFpPq/kUD/kBdTwGJdAd/VpdY1m4Dcn247AhsQuNbqcZ8xibH2IW1e41f1/5nidHY+0a0O2qrSjAU8RxBAuBlLS6ZZiT2vmgahe6CUarJ3Dzr8InZRmtgwT7F8Zzli6cqgOPDsUg768KwDOIxpO+tnOT9b57SAbLUn5SOedFbAodWgQAg913URTiPOCrt5Loyp9B4tQXv1s74WFmgPlEkQmavkIyQg3R2Yki0QhkFysOFtp41ilRFTvgauxV3irryTv/frgA+XJDwfYexG2whgWH/VbT/HHIMoHBuRD864lpWZ/qDdLhFx7A5Eflli+YO+xuOQP4eFEsWeVYtcBNEi8Epy86LBiDCttCYWJ96XEmriqTpBebjxpaihxfCnPEbq5bkLv9RhO9vgzgYPgceLvPJ9GSpSJFv2s+ohvvJYyeAiuNLRkPR++tHFaofCVnuIfbeFgS1WVi/F4TrNsq2JlNfUnrzGTkc1CIkx/u02cE7K+Smfi/Dz30iDE7A+TLxDz7pguozMHX0eQCYDJ4ehehkArfH/XXe/ZH7Hb5MV6nMV32ZxkNi4x5iMdIsuLUdXJHWqSi0Ue9cZFBsP2rqmr5S + password: AgB/x1/DNC9uYWCTH1xu17qSr9GrnTcQ4LD5BCTu/5wUd/TK2rWM8zHce0mF97e6km+FyT+G96utiRThutNkAOpzT7xrZwkp45F0HqF0aD+NOYMzMn4duVLaK7JXLm6u7187Ci6kFMkmZ+Npb94wX+iUa+kgTQTkMP1HsdgQj4c8gj1ldpnoUDQt8/wsTF/gEukXD14E0BbEMkRTPh8PzkiirlLVWCff3YauQVRKXL2yWa79Fo47zkZ/WMJXyB8PVBQot2OIDL1ygddTBklBoP6ts2MOo3G7blmQWu5cgS/+IAw837pEWpDg5+UnUkM1+OQ+52PWLRXPbiSMFFlcbZIHwuASx7lRRm482q+kfJBb4oALd7EPHmjcBg1lV1iR74NetJ2wkMMcqnvkITxw8U8To1ZKseBpNH7mBWB9u2lvpjT5EWMOveVLCq6NwU2IcdgHhUaMByrxq5I3u1k1Y1hZvM0txQp8Mr/Zas/EEJ/w3sN+i9O/JWIonRx84Y9OJxIQEXManz7LzzzIxXikCvenm/8oQMfPHa7w5Scdb6sEQKsFXZ+aMQMcUTp7xuZbYzuX/7CmVdPHlFOhAXGAbRE2J739uWmyMVQkJ9cHSKzbCJdXDD3+oJB42Xz37tJg08xvMGBTPJjJoKnXfHIPS2yQISg1VgfyWNg/T2LZLuqt5htpUbQsWsL6K9/z7qtsama5pUiVTsmu + postgres-password: AgBpGdazaNMQ2j2jI1sK5D1PCFvhXn/kH7Xhj2P2GgHesCxml2WN8B99dtk2O81BDt7IYNqadhwdXe+pmvJU48qkbfcmgE+Kbjbbdo8bv9GxMQcYPPH0ahqIfFAxNgMBHnbQ0Zxy+a3vzNiXLeD4FAwU0Pxa7kSwED0/EiyfmZcvph2J5JTi4FwhU2ITycMwsjQnt7KVw1SGWMZkro6HoJ9wGSj7GRSeHX7HEMBCehf8TOMEo1Emy6IqYHAywdcNgfBEoLvgUUFElBxYLshCP2NTTCU2o374Xw2fiErjiR7Q075Mshpxl4bqGf2HgGT44Lsn5KDupPNnV7FPx0xTk3OmmE5Ja5gUAeLYU3bF8B7DSm61ltQnkL+FQ5sy3tjCTsH3wyYbg4zVoQlJuyRXJdG48Y0aHkQHwMpZlZEkB8IWGZZ9Kd9UKTTFnS3odca8OhdWYQ28ARz4Mj0Jio0dEO/63EyCJZiL4/Ck4rj8I49Wz832GjHVkMNFqthK6jN+HmlGcKXRKRMFLyIrvH7mUv1EuOsvh2+qtrsGGWSYwfETmb1J/iUp7X2+KhPnn6GP/poXLKeeDtiRfRSXTP70vRDllOMgSRTorRxS44FD/ac3KVA4RlpA+Ho+XU4QhYnNx8Q6haTQINY8Yypw/JRAPO4l379EFZtFdCSrKZ9XmRPsSZkZPZZJSVUe2ByGs/SScOR1xf1pwdPjWoOd + username: AgC716fxKUrMXCsRsWeiSTliHKP8NrwBr0TD7/w2F1HO93pqjSVU5/6hKOiFdNllbyPRudSHAeYWqJhQxxl5tS9kSaEp29zkxAUnmNwfLL3MKdCohxz2LZzC7saaOdjDkX2x8jcy68STPupsdg5bX40D4tO/s8qXnWWZJrW0ht/J+orgjbnfHk51JBMRBh6WD43yKLOBTHGO5U/TqRKg20kn+jDm2hcdec8axcjn2E57B3wrL8tvUcVRElO0XOcLHHBrav/BumRkwS4bMGqa+Vcarrr8U9MuQXVUzbCuwt326q/Kg862ozYY9uWAVtUy+Yfb4SAcEUC9Y+Ioo776H3YIr6q8P6RI+lFNmz4Q8AFDN9D5IRNjQ/D73llHw944dYRJl8CVjoJJYvRXv8z+4GzL7O+eF+smx4EhcY3sFxjkNCv+s+EDbUXvQR0ULqTEc5WZlBqp9TQEvzBwN3CVYO0k76FQYdjoU6xb/32gALe6zMxOLTliR9axqDvCL3OCj97/HJy8RLL2sYH82NZ1sGHqfTkTKYGk24Zfzd+a+p0PDbU14ZBuXKWBDkzNaVdpLvWhtdBczarfVp4Z2b6IutbT2C43fcmi7WYJOtV5em1sGhKOtbEy+wC+r5GKr6qRV58jm88cwtqZgm6IirDt/bzJDqhPndBzW5iQZzkko/1Tr4y/6oaTleTcmkDlSg2Cn8q/R7MNYUjT template: metadata: creationTimestamp: null From 84ee9a555b86b2f409285550a2d6550e4cc63fec Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 14:57:29 +0200 Subject: [PATCH 029/101] fix env override --- demos/argo-cd/manifests/airflow/airflow.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 8aee92a5..b4ce9dd0 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -56,12 +56,12 @@ spec: spec: container: - name: airflow - env: - - name: AIRFLOW_CONN_MINIO - valueFrom: - secretKeyRef: - name: airflow-minio-connection - key: airflow-minio-connection + env: + - name: AIRFLOW_CONN_MINIO + valueFrom: + secretKeyRef: + name: airflow-minio-connection + key: airflow-minio-connection config: resources: cpu: From 4846f005b4f60569f0bb940f3e589d4930716bed Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:03:36 +0200 Subject: [PATCH 030/101] fix overrides --- demos/argo-cd/manifests/airflow/airflow.yaml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index b4ce9dd0..29e6a071 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -54,7 +54,7 @@ spec: AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio podOverrides: &podOverrides spec: - container: + containers: - name: airflow env: - name: AIRFLOW_CONN_MINIO @@ -62,14 +62,6 @@ spec: secretKeyRef: name: airflow-minio-connection key: airflow-minio-connection - config: - resources: - cpu: - min: 400m - max: "1" - memory: - limit: 2Gi - gracefulShutdownTimeout: 30s roleGroups: default: replicas: 1 @@ -79,14 +71,6 @@ spec: schedulers: envOverrides: *envOverrides podOverrides: *podOverrides - config: - gracefulShutdownTimeout: 30s - resources: - cpu: - min: 400m - max: "1" - memory: - limit: 1Gi roleGroups: default: replicas: 1 From 8f7d766f3fa31f7edb133c4815ac95f6c904b021 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:16:51 +0200 Subject: [PATCH 031/101] fix container name --- demos/argo-cd/manifests/airflow/airflow.yaml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 29e6a071..3eca242e 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -67,7 +67,16 @@ spec: replicas: 1 kubernetesExecutors: envOverrides: *envOverrides - podOverrides: *podOverrides + podOverrides: &podOverrides + spec: + containers: + - name: base + env: + - name: AIRFLOW_CONN_MINIO + valueFrom: + secretKeyRef: + name: airflow-minio-connection + key: airflow-minio-connection schedulers: envOverrides: *envOverrides podOverrides: *podOverrides From 1c8b5a5ca36537ed52b8d110ddf2c0fdbc3de49b Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:24:28 +0200 Subject: [PATCH 032/101] fix overrides --- demos/argo-cd/manifests/airflow/airflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 3eca242e..75ace4c6 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -67,7 +67,7 @@ spec: replicas: 1 kubernetesExecutors: envOverrides: *envOverrides - podOverrides: &podOverrides + podOverrides: spec: containers: - name: base From 4fcc2a1468b0b9cd3aa0ba9ef18596793bcc2063 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:36:14 +0200 Subject: [PATCH 033/101] enable gitsync --- demos/argo-cd/dags/date_demo.py | 20 ++ demos/argo-cd/dags/pyspark_pi.py | 177 +++++++++++++ demos/argo-cd/dags/pyspark_pi.yaml | 36 +++ demos/argo-cd/manifests/airflow/airflow.yaml | 263 +------------------ 4 files changed, 238 insertions(+), 258 deletions(-) create mode 100644 demos/argo-cd/dags/date_demo.py create mode 100644 demos/argo-cd/dags/pyspark_pi.py create mode 100644 demos/argo-cd/dags/pyspark_pi.yaml diff --git a/demos/argo-cd/dags/date_demo.py b/demos/argo-cd/dags/date_demo.py new file mode 100644 index 00000000..704aac51 --- /dev/null +++ b/demos/argo-cd/dags/date_demo.py @@ -0,0 +1,20 @@ +"""Example DAG returning the current date""" +from datetime import datetime, timedelta + +from airflow import DAG +from airflow.operators.bash import BashOperator + +with DAG( + dag_id='date_demo', + schedule_interval='0-59 * * * *', + start_date=datetime(2021, 1, 1), + catchup=False, + dagrun_timeout=timedelta(minutes=5), + tags=['example'], + params={}, +) as dag: + + run_this = BashOperator( + task_id='run_every_minute', + bash_command='date', + ) diff --git a/demos/argo-cd/dags/pyspark_pi.py b/demos/argo-cd/dags/pyspark_pi.py new file mode 100644 index 00000000..16c81442 --- /dev/null +++ b/demos/argo-cd/dags/pyspark_pi.py @@ -0,0 +1,177 @@ +"""Example DAG demonstrating how to apply a Kubernetes Resource from Airflow running in-cluster""" +from datetime import datetime, timedelta +from airflow import DAG +from typing import TYPE_CHECKING, Optional, Sequence, Dict +from kubernetes import client +from airflow.exceptions import AirflowException +from airflow.sensors.base import BaseSensorOperator +from airflow.models import BaseOperator +from airflow.providers.cncf.kubernetes.hooks.kubernetes import KubernetesHook +import yaml +from airflow.utils import yaml +import os + +if TYPE_CHECKING: + from airflow.utils.context import Context + +class SparkKubernetesOperator(BaseOperator): + template_fields: Sequence[str] = ('application_file', 'namespace') + template_ext: Sequence[str] = ('.yaml', '.yml', '.json') + ui_color = '#f4a460' + + def __init__( + self, + *, + application_file: str, + namespace: Optional[str] = None, + kubernetes_conn_id: str = 'kubernetes_in_cluster', + api_group: str = 'spark.stackable.tech', + api_version: str = 'v1alpha1', + **kwargs, + ) -> None: + super().__init__(**kwargs) + self.application_file = application_file + self.namespace = namespace + self.kubernetes_conn_id = kubernetes_conn_id + self.api_group = api_group + self.api_version = api_version + self.plural = "sparkapplications" + + def execute(self, context: 'Context'): + hook = KubernetesHook(conn_id=self.kubernetes_conn_id) + self.log.info("Creating SparkApplication...") + response = hook.create_custom_object( + group=self.api_group, + version=self.api_version, + plural=self.plural, + body=self.application_file, + namespace=self.namespace, + ) + return response + + +class SparkKubernetesSensor(BaseSensorOperator): + template_fields = ("application_name", "namespace") + # See https://github.com/stackabletech/spark-k8s-operator/pull/460/files#diff-d737837121132af6b60f50279a78464b05dcfd06c05d1d090f4198a5e962b5f6R371 + # Unknown is set immediately so it must be excluded from the failed states. + FAILURE_STATES = ("Failed") + SUCCESS_STATES = ("Succeeded") + + def __init__( + self, + *, + application_name: str, + attach_log: bool = False, + namespace: Optional[str] = None, + kubernetes_conn_id: str = 'kubernetes_in_cluster', + api_group: str = 'spark.stackable.tech', + api_version: str = 'v1alpha1', + poke_interval: float = 60, + **kwargs, + ) -> None: + super().__init__(**kwargs) + self.application_name = application_name + self.attach_log = attach_log + self.namespace = namespace + self.kubernetes_conn_id = kubernetes_conn_id + self.hook = KubernetesHook(conn_id=self.kubernetes_conn_id) + self.api_group = api_group + self.api_version = api_version + self.poke_interval = poke_interval + + def _log_driver(self, application_state: str, response: dict) -> None: + if not self.attach_log: + return + status_info = response["status"] + if "driverInfo" not in status_info: + return + driver_info = status_info["driverInfo"] + if "podName" not in driver_info: + return + driver_pod_name = driver_info["podName"] + namespace = response["metadata"]["namespace"] + log_method = self.log.error if application_state in self.FAILURE_STATES else self.log.info + try: + log = "" + for line in self.hook.get_pod_logs(driver_pod_name, namespace=namespace): + log += line.decode() + log_method(log) + except client.rest.ApiException as e: + self.log.warning( + "Could not read logs for pod %s. It may have been disposed.\n" + "Make sure timeToLiveSeconds is set on your SparkApplication spec.\n" + "underlying exception: %s", + driver_pod_name, + e, + ) + + def poke(self, context: Dict) -> bool: + self.log.info("Poking: %s", self.application_name) + response = self.hook.get_custom_object( + group=self.api_group, + version=self.api_version, + plural="sparkapplications", + name=self.application_name, + namespace=self.namespace, + ) + try: + application_state = response["status"]["phase"] + except KeyError: + self.log.debug(f"SparkApplication status could not be established: {response}") + return False + if self.attach_log and application_state in self.FAILURE_STATES + self.SUCCESS_STATES: + self._log_driver(application_state, response) + if application_state in self.FAILURE_STATES: + raise AirflowException(f"SparkApplication failed with state: {application_state}") + elif application_state in self.SUCCESS_STATES: + self.log.info("SparkApplication ended successfully") + return True + else: + self.log.info("SparkApplication is still in state: %s", application_state) + return False + +with DAG( + dag_id='sparkapp_dag', + schedule_interval=None, + start_date=datetime(2022, 1, 1), + catchup=False, + dagrun_timeout=timedelta(minutes=60), + tags=['example'], + params={"example_key": "example_value"}, +) as dag: + + def load_body_to_dict(body): + try: + body_dict = yaml.safe_load(body) + except yaml.YAMLError as e: + raise AirflowException(f"Exception when loading resource definition: {e}\n") + return body_dict + + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') + + with open(yaml_path, 'r') as file: + crd = file.read() + with open('/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as file: + ns = file.read() + + document=load_body_to_dict(crd) + application_name='pyspark-pi-'+datetime.utcnow().strftime('%Y%m%d%H%M%S') + document.update({'metadata': {'name': application_name, 'namespace': ns}}) + + t1 = SparkKubernetesOperator( + task_id='spark_pi_submit', + namespace=ns, + application_file=document, + do_xcom_push=True, + dag=dag, + ) + + t2 = SparkKubernetesSensor( + task_id='spark_pi_monitor', + namespace=ns, + application_name="{{ task_instance.xcom_pull(task_ids='spark_pi_submit')['metadata']['name'] }}", + poke_interval=5, + dag=dag, + ) + + t1 >> t2 diff --git a/demos/argo-cd/dags/pyspark_pi.yaml b/demos/argo-cd/dags/pyspark_pi.yaml new file mode 100644 index 00000000..559f4822 --- /dev/null +++ b/demos/argo-cd/dags/pyspark_pi.yaml @@ -0,0 +1,36 @@ +--- +apiVersion: spark.stackable.tech/v1alpha1 +kind: SparkApplication +metadata: + name: pyspark-pi +spec: + version: "1.0" + sparkImage: + productVersion: 3.5.2 + mode: cluster + mainApplicationFile: local:///stackable/spark/examples/src/main/python/pi.py + job: + config: + resources: + cpu: + min: 500m + max: 500m + memory: + limit: 512Mi + driver: + config: + resources: + cpu: + min: 1000m + max: 1200m + memory: + limit: 1024Mi + executor: + config: + resources: + cpu: + min: 500m + max: 1000m + memory: + limit: 1024Mi + replicas: 3 diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 75ace4c6..206555ae 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -1,5 +1,4 @@ --- -# {% raw %} apiVersion: airflow.stackable.tech/v1alpha1 kind: AirflowCluster metadata: @@ -12,10 +11,12 @@ spec: loadExamples: false exposeConfig: false credentialsSecret: airflow-credentials + dagsGitSync: + - repo: https://github.com/stackabletech/demos/ + branch: spike/argocd-demo + gitFolder: "demos/argo-cd/dags" + depth: 2 volumes: - - name: airflow-dags - configMap: - name: airflow-dags - name: minio-tls ephemeral: volumeClaimTemplate: @@ -30,16 +31,6 @@ spec: requests: storage: "1" storageClassName: secrets.stackable.tech - volumeMounts: - - name: airflow-dags - mountPath: /dags/date_demo.py - subPath: date_demo.py - - name: airflow-dags - mountPath: /dags/pyspark_pi.py - subPath: pyspark_pi.py - - name: airflow-dags - mountPath: /dags/pyspark_pi.yaml - subPath: pyspark_pi.yaml - name: minio-tls mountPath: /stackable/minio-tls webservers: @@ -83,247 +74,3 @@ spec: roleGroups: default: replicas: 1 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: airflow-dags -data: - date_demo.py: | - """Example DAG returning the current date""" - from datetime import datetime, timedelta - - from airflow import DAG - from airflow.operators.bash import BashOperator - - with DAG( - dag_id='date_demo', - schedule_interval='0-59 * * * *', - start_date=datetime(2021, 1, 1), - catchup=False, - dagrun_timeout=timedelta(minutes=5), - tags=['example'], - params={}, - ) as dag: - - run_this = BashOperator( - task_id='run_every_minute', - bash_command='date', - ) - pyspark_pi.py: | - """Example DAG demonstrating how to apply a Kubernetes Resource from Airflow running in-cluster""" - from datetime import datetime, timedelta - from airflow import DAG - from typing import TYPE_CHECKING, Optional, Sequence, Dict - from kubernetes import client - from airflow.exceptions import AirflowException - from airflow.sensors.base import BaseSensorOperator - from airflow.models import BaseOperator - from airflow.providers.cncf.kubernetes.hooks.kubernetes import KubernetesHook - import yaml - from airflow.utils import yaml - import os - - if TYPE_CHECKING: - from airflow.utils.context import Context - - class SparkKubernetesOperator(BaseOperator): - template_fields: Sequence[str] = ('application_file', 'namespace') - template_ext: Sequence[str] = ('.yaml', '.yml', '.json') - ui_color = '#f4a460' - - def __init__( - self, - *, - application_file: str, - namespace: Optional[str] = None, - kubernetes_conn_id: str = 'kubernetes_in_cluster', - api_group: str = 'spark.stackable.tech', - api_version: str = 'v1alpha1', - **kwargs, - ) -> None: - super().__init__(**kwargs) - self.application_file = application_file - self.namespace = namespace - self.kubernetes_conn_id = kubernetes_conn_id - self.api_group = api_group - self.api_version = api_version - self.plural = "sparkapplications" - - def execute(self, context: 'Context'): - hook = KubernetesHook(conn_id=self.kubernetes_conn_id) - self.log.info("Creating SparkApplication...") - response = hook.create_custom_object( - group=self.api_group, - version=self.api_version, - plural=self.plural, - body=self.application_file, - namespace=self.namespace, - ) - return response - - - class SparkKubernetesSensor(BaseSensorOperator): - template_fields = ("application_name", "namespace") - # See https://github.com/stackabletech/spark-k8s-operator/pull/460/files#diff-d737837121132af6b60f50279a78464b05dcfd06c05d1d090f4198a5e962b5f6R371 - # Unknown is set immediately so it must be excluded from the failed states. - FAILURE_STATES = ("Failed") - SUCCESS_STATES = ("Succeeded") - - def __init__( - self, - *, - application_name: str, - attach_log: bool = False, - namespace: Optional[str] = None, - kubernetes_conn_id: str = 'kubernetes_in_cluster', - api_group: str = 'spark.stackable.tech', - api_version: str = 'v1alpha1', - poke_interval: float = 60, - **kwargs, - ) -> None: - super().__init__(**kwargs) - self.application_name = application_name - self.attach_log = attach_log - self.namespace = namespace - self.kubernetes_conn_id = kubernetes_conn_id - self.hook = KubernetesHook(conn_id=self.kubernetes_conn_id) - self.api_group = api_group - self.api_version = api_version - self.poke_interval = poke_interval - - def _log_driver(self, application_state: str, response: dict) -> None: - if not self.attach_log: - return - status_info = response["status"] - if "driverInfo" not in status_info: - return - driver_info = status_info["driverInfo"] - if "podName" not in driver_info: - return - driver_pod_name = driver_info["podName"] - namespace = response["metadata"]["namespace"] - log_method = self.log.error if application_state in self.FAILURE_STATES else self.log.info - try: - log = "" - for line in self.hook.get_pod_logs(driver_pod_name, namespace=namespace): - log += line.decode() - log_method(log) - except client.rest.ApiException as e: - self.log.warning( - "Could not read logs for pod %s. It may have been disposed.\n" - "Make sure timeToLiveSeconds is set on your SparkApplication spec.\n" - "underlying exception: %s", - driver_pod_name, - e, - ) - - def poke(self, context: Dict) -> bool: - self.log.info("Poking: %s", self.application_name) - response = self.hook.get_custom_object( - group=self.api_group, - version=self.api_version, - plural="sparkapplications", - name=self.application_name, - namespace=self.namespace, - ) - try: - application_state = response["status"]["phase"] - except KeyError: - self.log.debug(f"SparkApplication status could not be established: {response}") - return False - if self.attach_log and application_state in self.FAILURE_STATES + self.SUCCESS_STATES: - self._log_driver(application_state, response) - if application_state in self.FAILURE_STATES: - raise AirflowException(f"SparkApplication failed with state: {application_state}") - elif application_state in self.SUCCESS_STATES: - self.log.info("SparkApplication ended successfully") - return True - else: - self.log.info("SparkApplication is still in state: %s", application_state) - return False - - with DAG( - dag_id='sparkapp_dag', - schedule_interval=None, - start_date=datetime(2022, 1, 1), - catchup=False, - dagrun_timeout=timedelta(minutes=60), - tags=['example'], - params={"example_key": "example_value"}, - ) as dag: - - def load_body_to_dict(body): - try: - body_dict = yaml.safe_load(body) - except yaml.YAMLError as e: - raise AirflowException(f"Exception when loading resource definition: {e}\n") - return body_dict - - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') - - with open(yaml_path, 'r') as file: - crd = file.read() - with open('/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as file: - ns = file.read() - - document=load_body_to_dict(crd) - application_name='pyspark-pi-'+datetime.utcnow().strftime('%Y%m%d%H%M%S') - document.update({'metadata': {'name': application_name, 'namespace': ns}}) - - t1 = SparkKubernetesOperator( - task_id='spark_pi_submit', - namespace=ns, - application_file=document, - do_xcom_push=True, - dag=dag, - ) - - t2 = SparkKubernetesSensor( - task_id='spark_pi_monitor', - namespace=ns, - application_name="{{ task_instance.xcom_pull(task_ids='spark_pi_submit')['metadata']['name'] }}", - poke_interval=5, - dag=dag, - ) - - t1 >> t2 - pyspark_pi.yaml: | - --- - apiVersion: spark.stackable.tech/v1alpha1 - kind: SparkApplication - metadata: - name: pyspark-pi - spec: - version: "1.0" - sparkImage: - productVersion: 3.5.2 - mode: cluster - mainApplicationFile: local:///stackable/spark/examples/src/main/python/pi.py - job: - config: - resources: - cpu: - min: 500m - max: 500m - memory: - limit: 512Mi - driver: - config: - resources: - cpu: - min: 1000m - max: 1200m - memory: - limit: 1024Mi - executor: - config: - resources: - cpu: - min: 500m - max: 1000m - memory: - limit: 1024Mi - replicas: 3 - -# {% endraw %} From f52cb08de68f3cc86632c386a711729ba3a12603 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:39:43 +0200 Subject: [PATCH 034/101] fix git sync --- demos/argo-cd/manifests/airflow/airflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 206555ae..114021a4 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -31,11 +31,11 @@ spec: requests: storage: "1" storageClassName: secrets.stackable.tech + volumeMounts: - name: minio-tls mountPath: /stackable/minio-tls webservers: envOverrides: &envOverrides - AIRFLOW__CORE__DAGS_FOLDER: "/dags" AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" # Via sealed secrets, just kept for reference here #AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" From 32011e805da338703f65b0492618010d7b0f3ab6 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:50:51 +0200 Subject: [PATCH 035/101] move yaml out of dags git sync --- demos/argo-cd/dags/pyspark_pi.py | 2 +- demos/argo-cd/{dags => manifests/spark-k8s}/pyspark_pi.yaml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename demos/argo-cd/{dags => manifests/spark-k8s}/pyspark_pi.yaml (100%) diff --git a/demos/argo-cd/dags/pyspark_pi.py b/demos/argo-cd/dags/pyspark_pi.py index 16c81442..35bd4c38 100644 --- a/demos/argo-cd/dags/pyspark_pi.py +++ b/demos/argo-cd/dags/pyspark_pi.py @@ -147,7 +147,7 @@ def load_body_to_dict(body): raise AirflowException(f"Exception when loading resource definition: {e}\n") return body_dict - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') with open(yaml_path, 'r') as file: crd = file.read() diff --git a/demos/argo-cd/dags/pyspark_pi.yaml b/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml similarity index 100% rename from demos/argo-cd/dags/pyspark_pi.yaml rename to demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml From 2efbab2b580bd777a1b885c2d165c0ce1bb6cd2e Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 15:55:35 +0200 Subject: [PATCH 036/101] set resources --- demos/argo-cd/manifests/airflow/airflow.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 114021a4..58e45727 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -53,6 +53,14 @@ spec: secretKeyRef: name: airflow-minio-connection key: airflow-minio-connection + config: + gracefulShutdownTimeout: 30s + resources: + cpu: + min: 400m + max: "1" + memory: + limit: 1Gi roleGroups: default: replicas: 1 @@ -71,6 +79,14 @@ spec: schedulers: envOverrides: *envOverrides podOverrides: *podOverrides + config: + gracefulShutdownTimeout: 30s + resources: + cpu: + min: 400m + max: "1" + memory: + limit: 1Gi roleGroups: default: replicas: 1 From 945cbf28218fedb7e8f63b8ccf22a7702b7266d6 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Sun, 13 Apr 2025 16:28:41 +0200 Subject: [PATCH 037/101] linter --- demos/argo-cd/applications/airflow-postgres.yaml | 1 + demos/argo-cd/applications/airflow.yaml | 1 + demos/argo-cd/applications/minio.yaml | 1 + demos/argo-cd/manifests/airflow/airflow.yaml | 2 +- demos/argo-cd/projects/airflow.yaml | 1 + demos/argo-cd/projects/minio.yaml | 1 + stacks/argo-cd/applications/sealed-secrets.yaml | 1 + stacks/argo-cd/projects/stackable-operators.yaml | 1 + 8 files changed, 8 insertions(+), 1 deletion(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index df12dbc8..7052b64e 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: Application metadata: diff --git a/demos/argo-cd/applications/airflow.yaml b/demos/argo-cd/applications/airflow.yaml index edf5ac43..82c1b71c 100644 --- a/demos/argo-cd/applications/airflow.yaml +++ b/demos/argo-cd/applications/airflow.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: Application metadata: diff --git a/demos/argo-cd/applications/minio.yaml b/demos/argo-cd/applications/minio.yaml index d3eaf0a5..42ca5407 100644 --- a/demos/argo-cd/applications/minio.yaml +++ b/demos/argo-cd/applications/minio.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: Application metadata: diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 58e45727..8ebbb9bf 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -38,7 +38,7 @@ spec: envOverrides: &envOverrides AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" # Via sealed secrets, just kept for reference here - #AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" + # AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" AWS_CA_BUNDLE: "/stackable/minio-tls/ca.crt" AIRFLOW__LOGGING__REMOTE_LOGGING: "True" AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: s3://demo/airflow-task-logs/ diff --git a/demos/argo-cd/projects/airflow.yaml b/demos/argo-cd/projects/airflow.yaml index 3661434f..f518fd55 100644 --- a/demos/argo-cd/projects/airflow.yaml +++ b/demos/argo-cd/projects/airflow.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: diff --git a/demos/argo-cd/projects/minio.yaml b/demos/argo-cd/projects/minio.yaml index ca58ee8a..38fee1df 100644 --- a/demos/argo-cd/projects/minio.yaml +++ b/demos/argo-cd/projects/minio.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index 73fd722c..450e7225 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: Application metadata: diff --git a/stacks/argo-cd/projects/stackable-operators.yaml b/stacks/argo-cd/projects/stackable-operators.yaml index 3ee37fc2..4acfc6cd 100644 --- a/stacks/argo-cd/projects/stackable-operators.yaml +++ b/stacks/argo-cd/projects/stackable-operators.yaml @@ -1,3 +1,4 @@ +--- apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: From 5e3498b7fe44fba88e49ead92ee65b2b51f6bcd6 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 14 Apr 2025 12:04:27 +0200 Subject: [PATCH 038/101] install all operators via argo --- demos/demos-v2.yaml | 1 + .../argo-cd/applicationsets/stackable-operators.yaml | 7 +++---- stacks/stacks-v2.yaml | 10 ++-------- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/demos/demos-v2.yaml b/demos/demos-v2.yaml index 00fc8d22..82c4e96b 100644 --- a/demos/demos-v2.yaml +++ b/demos/demos-v2.yaml @@ -5,6 +5,7 @@ demos: stackableStack: argocd labels: - argocd + - git ops - airflow - job-scheduling manifests: diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml index 4ef1670a..b6138cae 100644 --- a/stacks/argo-cd/applicationsets/stackable-operators.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -7,10 +7,9 @@ spec: generators: - list: elements: - # Left out as currently installed via stackablectl - # operator: commons - # operator: listener - # operator: secret + - operator: commons + - operator: listener + - operator: secret - operator: airflow - operator: druid - operator: hbase diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 6355b5bd..67d44096 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -3,17 +3,11 @@ stacks: argocd: description: Deploying Stackable Demos with ArgoCD stackableRelease: dev - # TODO: We actually want to deploy all operators via ArgoCD, but we currently *have to* install - # operators with stackablectl. Therefore we install the internal operators via stackablectl. - # stackableOperators: [] - stackableOperators: - - listener - - commons - - secret + stackableOperators: ["argo-deploys-operators"] labels: - argocd - sealed secrets - - airflow + - git ops manifests: - helmChart: stacks/_templates/argo-cd.yaml ################################ From 0c30a99bc83626754762e3f49613bb0f886075ae Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 14 Apr 2025 12:06:29 +0200 Subject: [PATCH 039/101] improve comments and labels --- demos/demos-v2.yaml | 3 +++ stacks/stacks-v2.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demos/demos-v2.yaml b/demos/demos-v2.yaml index 82c4e96b..327f944d 100644 --- a/demos/demos-v2.yaml +++ b/demos/demos-v2.yaml @@ -8,6 +8,9 @@ demos: - git ops - airflow - job-scheduling + - git sync + - kubernetes executor + - sealed secrets manifests: ################################ # projects diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 67d44096..e387f2d8 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -1,7 +1,7 @@ --- stacks: argocd: - description: Deploying Stackable Demos with ArgoCD + description: Deploying Stackable Operators with ArgoCD stackableRelease: dev stackableOperators: ["argo-deploys-operators"] labels: From 33a375e81b37f3ce8ea9304f6bd0f8f8d6eaa3be Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 24 Apr 2025 10:46:40 +0200 Subject: [PATCH 040/101] remove airflowdb from clusterrole --- .../manifests/airflow/airflow-spark-clusterrole.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml b/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml index 66abed2f..d13657fa 100644 --- a/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml +++ b/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml @@ -12,14 +12,6 @@ rules: - create - get - list - - apiGroups: - - airflow.stackable.tech - resources: - - airflowdbs - verbs: - - create - - get - - list - apiGroups: - apps resources: From a6596b3dcfa877e55069cb65f163e2cc3a170e4d Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 19 May 2025 11:38:50 +0200 Subject: [PATCH 041/101] use 25.3 release --- .../applicationsets/stackable-operators.yaml | 69 ++++++++++++------- stacks/stacks-v2.yaml | 7 +- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml index b6138cae..23a7fcf3 100644 --- a/stacks/argo-cd/applicationsets/stackable-operators.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -5,28 +5,47 @@ metadata: name: stackable-operators spec: generators: - - list: - elements: - - operator: commons - - operator: listener - - operator: secret - - operator: airflow - - operator: druid - - operator: hbase - - operator: hdfs - - operator: hive - - operator: kafka - - operator: nifi - - operator: opa - - operator: spark-k8s - - operator: superset - - operator: trino - - operator: zookeeper + - matrix: + generators: + - list: + elements: + - operator: commons + - operator: listener + - operator: secret + - operator: airflow + - operator: druid + - operator: hbase + - operator: hdfs + - operator: hive + - operator: kafka + - operator: nifi + - operator: opa + - operator: spark-k8s + - operator: superset + - operator: trino + - operator: zookeeper + - list: + elements: + - cluster: demo + server: https://kubernetes.default.svc + targetRevision: "25.3.0" + repoUrl: https://repo.stackable.tech/repository/helm-stable/ + # - cluster: development + # server: https://kubernetes-development.default.svc + # targetRevision: "0.0.0-dev" + # repoUrl: https://repo.stackable.tech/repository/helm-dev/ + # - cluster: staging + # server: https://kubernetes-staging.default.svc + # targetRevision: "25.3.0" + # repoUrl: https://repo.stackable.tech/repository/helm-stable/ + # - cluster: production + # server: https://kubernetes-production.default.svc + # targetRevision: "24.11.1" + # repoUrl: https://repo.stackable.tech/repository/helm-stable/ + # {% raw %} template: metadata: - # {% raw %} name: "{{ operator }}-operator" - # {% endraw %} spec: project: stackable-operators ignoreDifferences: @@ -38,17 +57,14 @@ spec: - .spec.names.shortNames | select(. == []) - .spec.versions[].additionalPrinterColumns | select(. == []) source: - repoURL: https://repo.stackable.tech/repository/helm-stable/ - targetRevision: "25.3.0" - # {% raw %} + repoURL: "{{ repoUrl }}" + targetRevision: "{{ targetRevision }}" chart: "{{ operator }}-operator" - # {% endraw %} helm: - # {% raw %} releaseName: "{{ operator }}-operator" - # {% endraw %} + destination: - server: https://kubernetes.default.svc + server: "{{ server }}" namespace: stackable-operators syncPolicy: syncOptions: @@ -58,3 +74,4 @@ spec: automated: selfHeal: true prune: true + # {% endraw %} diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index e387f2d8..8660ed99 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -9,13 +9,16 @@ stacks: - sealed secrets - git ops manifests: + ################################ + # bootstrap argo + ################################ - helmChart: stacks/_templates/argo-cd.yaml ################################ - # projects + # project - operators ################################ - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml ################################ - # operators + # applicationset - operators ################################ - plainYaml: stacks/argo-cd/applicationsets/stackable-operators.yaml ################################ From 41c9cb5908a75dc9fbc51b8a0b540077ab0b107c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:48:25 +0200 Subject: [PATCH 042/101] bump airflow version, adapt listenerclass, parameterize git sync repo --- demos/argo-cd/manifests/airflow/airflow.yaml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 8ebbb9bf..6f4badd6 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -5,15 +5,14 @@ metadata: name: airflow spec: image: - productVersion: 2.10.4 + productVersion: 3.0.1 clusterConfig: - listenerClass: external-unstable loadExamples: false exposeConfig: false credentialsSecret: airflow-credentials dagsGitSync: - - repo: https://github.com/stackabletech/demos/ - branch: spike/argocd-demo + - repo: "{{ customGitUrl }}" + branch: "{{ customGitBranch }}" gitFolder: "demos/argo-cd/dags" depth: 2 volumes: @@ -35,6 +34,8 @@ spec: - name: minio-tls mountPath: /stackable/minio-tls webservers: + roleConfig: + listenerClass: external-unstable envOverrides: &envOverrides AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" # Via sealed secrets, just kept for reference here @@ -63,6 +64,11 @@ spec: limit: 1Gi roleGroups: default: + # NOTE: In order to properly show ArgoCD in action - syncing changes via Git - do the following: + # - Fork this repository + # - Use the demo parameters `customGitUrl` and `customGitBranch` to point the + # the repository to your fork and branch + # - Change the replicas here and push that to the provided `customGitBranch` in your fork replicas: 1 kubernetesExecutors: envOverrides: *envOverrides From bb9e227aa7626f2b63c55e735255351b9698d558 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:52:49 +0200 Subject: [PATCH 043/101] revert templating - manged by argo --- demos/argo-cd/manifests/airflow/airflow.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 6f4badd6..d84d8267 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -10,9 +10,15 @@ spec: loadExamples: false exposeConfig: false credentialsSecret: airflow-credentials + # NOTE: This cannot be parameterized via stackablectl since it is synced via ArgoCD + # + # In terms of forking the repository, this should not be a problem since the DAGs are the same. + # You can still change this locally and point to the fork in case of any changes to DAGs. + # + # TODO(@maltesander): Adapt branch to main / 25.7.0 dagsGitSync: - - repo: "{{ customGitUrl }}" - branch: "{{ customGitBranch }}" + - repo: https://github.com/stackabletech/demos/ + branch: spike/argocd-demo gitFolder: "demos/argo-cd/dags" depth: 2 volumes: From 83e4ca0a4dbe9aceeb589efe8e42df8dd3cfae2a Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:53:06 +0200 Subject: [PATCH 044/101] adapt sealed secrets version --- stacks/argo-cd/applications/sealed-secrets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd/applications/sealed-secrets.yaml index 450e7225..0bb704f1 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd/applications/sealed-secrets.yaml @@ -8,7 +8,7 @@ spec: sources: - repoURL: "registry-1.docker.io/bitnamicharts" path: sealed-secrets - targetRevision: 2.5.9 # 0.29.0 + targetRevision: 2.5.16 # 0.30.0 chart: sealed-secrets helm: releaseName: sealed-secrets-controller From 304ec52b602ded7c82418f9f49ee1216f159760a Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:53:44 +0200 Subject: [PATCH 045/101] customize repo, add opensearch as comment --- .../applicationsets/stackable-operators.yaml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml index 23a7fcf3..b31931b8 100644 --- a/stacks/argo-cd/applicationsets/stackable-operators.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -20,6 +20,8 @@ spec: - operator: kafka - operator: nifi - operator: opa + # TODO: enable Opensearch operator + # - opensearch - operator: spark-k8s - operator: superset - operator: trino @@ -28,20 +30,12 @@ spec: elements: - cluster: demo server: https://kubernetes.default.svc - targetRevision: "25.3.0" - repoUrl: https://repo.stackable.tech/repository/helm-stable/ + targetRevision: "{{ stackableReleaseVersion }}" + repoUrl: "{{ stackableRepositoryUrl }}" # - cluster: development # server: https://kubernetes-development.default.svc # targetRevision: "0.0.0-dev" # repoUrl: https://repo.stackable.tech/repository/helm-dev/ - # - cluster: staging - # server: https://kubernetes-staging.default.svc - # targetRevision: "25.3.0" - # repoUrl: https://repo.stackable.tech/repository/helm-stable/ - # - cluster: production - # server: https://kubernetes-production.default.svc - # targetRevision: "24.11.1" - # repoUrl: https://repo.stackable.tech/repository/helm-stable/ # {% raw %} template: metadata: From 0057f8ea62d2c620999fe449a0ab11d4fdf4fad7 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:54:09 +0200 Subject: [PATCH 046/101] template repo urls --- demos/argo-cd/applications/airflow-postgres.yaml | 5 ++--- demos/argo-cd/applications/airflow.yaml | 5 ++--- demos/argo-cd/applications/minio.yaml | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd/applications/airflow-postgres.yaml index 7052b64e..93361499 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd/applications/airflow-postgres.yaml @@ -24,9 +24,8 @@ spec: database: airflow username: airflow existingSecret: postgresql-credentials - - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release-25.3 - targetRevision: "spike/argocd-demo" + - repoURL: "{{ customGitUrl }}" + targetRevision: "{{ customGitBranch }}" path: demos/argo-cd/manifests/airflow-postgres/ syncPolicy: syncOptions: diff --git a/demos/argo-cd/applications/airflow.yaml b/demos/argo-cd/applications/airflow.yaml index 82c1b71c..9070e058 100644 --- a/demos/argo-cd/applications/airflow.yaml +++ b/demos/argo-cd/applications/airflow.yaml @@ -9,9 +9,8 @@ spec: server: https://kubernetes.default.svc namespace: stackable-airflow source: - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release-25.3 - targetRevision: "spike/argocd-demo" + repoURL: "{{ customGitUrl }}" + targetRevision: "{{ customGitBranch }}" path: demos/argo-cd/manifests/airflow/ syncPolicy: syncOptions: diff --git a/demos/argo-cd/applications/minio.yaml b/demos/argo-cd/applications/minio.yaml index 42ca5407..7a2c1f4f 100644 --- a/demos/argo-cd/applications/minio.yaml +++ b/demos/argo-cd/applications/minio.yaml @@ -9,9 +9,8 @@ spec: server: https://kubernetes.default.svc namespace: minio source: - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release-25.3 - targetRevision: "spike/argocd-demo" + repoURL: "{{ customGitUrl }}" + targetRevision: "{{ customGitBranch }}" path: demos/argo-cd/manifests/minio/ syncPolicy: syncOptions: From 8a52bd91022d925a030c093789cdf70cfb47fd19 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 17:54:48 +0200 Subject: [PATCH 047/101] add parameters, improve descrition --- demos/demos-v2.yaml | 7 +++++++ stacks/stacks-v2.yaml | 13 +++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/demos/demos-v2.yaml b/demos/demos-v2.yaml index 327f944d..c8bd8285 100644 --- a/demos/demos-v2.yaml +++ b/demos/demos-v2.yaml @@ -32,6 +32,13 @@ demos: cpu: 2401m memory: 9010Mi pvc: 24Gi + parameters: + - name: customGitUrl + description: The URL to the Git repository (this can be adapted in case of forking the repository) to demonstrate syncing via Argo and Git. + default: https://github.com/stackabletech/demos/ + - name: customGitBranch + description: The Branch in the Git repository (this can be adapted in case of forking the repository) to demonstrate syncing via Argo and Git. + default: spike/argocd-demo airflow-scheduled-job: description: Activate a simple Airflow DAG to run continuously at a set interval stackableStack: airflow diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 7e773915..316ed0b4 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -2,11 +2,12 @@ stacks: argocd: description: Deploying Stackable Operators with ArgoCD - stackableRelease: dev - stackableOperators: ["argo-deploys-operators"] + stackableRelease: dev # This does not matter -> managed by ArgoCD + stackableOperators: ["argo-deploys-operators"] # This does not matter -> managed by ArgoCD labels: - argocd - sealed secrets + - stackable operators - git ops manifests: ################################ @@ -33,10 +34,14 @@ stacks: pvc: 20Gi parameters: - name: stackableReleaseVersion - description: Stackable release to be installed via Argo + description: The Stackable release to be installed via Argo. This replaces the `stackableRelease` parameter. default: 25.3.0 + - name: stackableRepositoryUrl + description: The Stackable repository URL. This is usually required to test dev versions. + #default: https://repo.stackable.tech/repository/helm-dev/ + default: https://repo.stackable.tech/repository/helm-stable/ - name: argocdAdminPassword - description: Password of the ArgoCD admin user + description: Password of the ArgoCD admin user. # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` default: $2y$10$HhJC3pGHTlk8RyBoS39N/.wC72mdWxV2X8QS1wROUwCFxl.2tGfky monitoring: From e0e9b0aac4acf37e331f9cebdd798d390ec1d5ea Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:12:33 +0200 Subject: [PATCH 048/101] bump argocd helm chart v8.1.4 --- stacks/_templates/argo-cd.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/_templates/argo-cd.yaml b/stacks/_templates/argo-cd.yaml index 1c72ab9c..b972f912 100644 --- a/stacks/_templates/argo-cd.yaml +++ b/stacks/_templates/argo-cd.yaml @@ -4,7 +4,7 @@ name: argo-cd repo: name: argo-cd url: https://argoproj.github.io/argo-helm -version: v7.8.23 +version: v8.1.4 options: configs: secret: From be5d6e620fcd3cb9c31edbfc421b235b675b8375 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:14:55 +0200 Subject: [PATCH 049/101] switch to 0.0.0-dev operators --- .../argo-cd/applicationsets/stackable-operators.yaml | 10 ++-------- stacks/stacks-v2.yaml | 8 ++------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd/applicationsets/stackable-operators.yaml index b31931b8..816d2119 100644 --- a/stacks/argo-cd/applicationsets/stackable-operators.yaml +++ b/stacks/argo-cd/applicationsets/stackable-operators.yaml @@ -31,11 +31,6 @@ spec: - cluster: demo server: https://kubernetes.default.svc targetRevision: "{{ stackableReleaseVersion }}" - repoUrl: "{{ stackableRepositoryUrl }}" - # - cluster: development - # server: https://kubernetes-development.default.svc - # targetRevision: "0.0.0-dev" - # repoUrl: https://repo.stackable.tech/repository/helm-dev/ # {% raw %} template: metadata: @@ -51,12 +46,11 @@ spec: - .spec.names.shortNames | select(. == []) - .spec.versions[].additionalPrinterColumns | select(. == []) source: - repoURL: "{{ repoUrl }}" + repoURL: "oci.stackable.tech" targetRevision: "{{ targetRevision }}" - chart: "{{ operator }}-operator" + chart: "sdp-charts/{{ operator }}-operator" helm: releaseName: "{{ operator }}-operator" - destination: server: "{{ server }}" namespace: stackable-operators diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 316ed0b4..17b2ad08 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -34,12 +34,8 @@ stacks: pvc: 20Gi parameters: - name: stackableReleaseVersion - description: The Stackable release to be installed via Argo. This replaces the `stackableRelease` parameter. - default: 25.3.0 - - name: stackableRepositoryUrl - description: The Stackable repository URL. This is usually required to test dev versions. - #default: https://repo.stackable.tech/repository/helm-dev/ - default: https://repo.stackable.tech/repository/helm-stable/ + description: The Stackable release to be installed via Argo. This replaces the demo `stackableRelease` parameter. + default: 0.0.0-dev - name: argocdAdminPassword description: Password of the ArgoCD admin user. # generated via: `htpasswd -nbBC 10 "" adminadmin | tr -d ':\n'` From 35099931bf726d21b1bc62a4504111490912e3eb Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:19:45 +0200 Subject: [PATCH 050/101] attempt to fix dags for airflow 3 --- demos/argo-cd/dags/date_demo.py | 2 +- demos/argo-cd/dags/pyspark_pi.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/argo-cd/dags/date_demo.py b/demos/argo-cd/dags/date_demo.py index 704aac51..45a5e211 100644 --- a/demos/argo-cd/dags/date_demo.py +++ b/demos/argo-cd/dags/date_demo.py @@ -6,7 +6,7 @@ with DAG( dag_id='date_demo', - schedule_interval='0-59 * * * *', + schedule='0-59 * * * *', start_date=datetime(2021, 1, 1), catchup=False, dagrun_timeout=timedelta(minutes=5), diff --git a/demos/argo-cd/dags/pyspark_pi.py b/demos/argo-cd/dags/pyspark_pi.py index 35bd4c38..ebc1290c 100644 --- a/demos/argo-cd/dags/pyspark_pi.py +++ b/demos/argo-cd/dags/pyspark_pi.py @@ -132,7 +132,7 @@ def poke(self, context: Dict) -> bool: with DAG( dag_id='sparkapp_dag', - schedule_interval=None, + schedule=None, start_date=datetime(2022, 1, 1), catchup=False, dagrun_timeout=timedelta(minutes=60), @@ -147,7 +147,7 @@ def load_body_to_dict(body): raise AirflowException(f"Exception when loading resource definition: {e}\n") return body_dict - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') with open(yaml_path, 'r') as file: crd = file.read() From f364191ec3d0e45ef03b2ebc06ff50b362c7979e Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:19:55 +0200 Subject: [PATCH 051/101] fix scope --- demos/argo-cd/manifests/airflow/airflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index d84d8267..39a2bc1c 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -28,7 +28,7 @@ spec: metadata: annotations: secrets.stackable.tech/class: tls - secrets.stackable.tech/scope: pod,node + secrets.stackable.tech/scope: pod spec: accessModes: - ReadWriteOnce From d9eb2c794615670ea26f6135ac6beaad6689fa63 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:38:05 +0200 Subject: [PATCH 052/101] attempt to fix dag --- demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml | 2 +- stacks/airflow/airflow.yaml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml b/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml index 559f4822..d5d84da3 100644 --- a/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml +++ b/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml @@ -6,7 +6,7 @@ metadata: spec: version: "1.0" sparkImage: - productVersion: 3.5.2 + productVersion: 3.5.6 mode: cluster mainApplicationFile: local:///stackable/spark/examples/src/main/python/pi.py job: diff --git a/stacks/airflow/airflow.yaml b/stacks/airflow/airflow.yaml index 1a02b1ef..e3b8cf36 100644 --- a/stacks/airflow/airflow.yaml +++ b/stacks/airflow/airflow.yaml @@ -238,7 +238,7 @@ data: raise AirflowException(f"Exception when loading resource definition: {e}\n") return body_dict - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') with open(yaml_path, 'r') as file: crd = file.read() @@ -303,6 +303,8 @@ data: memory: limit: 1024Mi replicas: 3 + + # {% endraw %} --- apiVersion: v1 From 24ff3e87fd61321bfa0e6737d0625ce8aa59c55c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 21 Jul 2025 19:47:58 +0200 Subject: [PATCH 053/101] change path in correct airflow file... --- demos/argo-cd/dags/pyspark_pi.py | 2 +- stacks/airflow/airflow.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/dags/pyspark_pi.py b/demos/argo-cd/dags/pyspark_pi.py index ebc1290c..9c408527 100644 --- a/demos/argo-cd/dags/pyspark_pi.py +++ b/demos/argo-cd/dags/pyspark_pi.py @@ -147,7 +147,7 @@ def load_body_to_dict(body): raise AirflowException(f"Exception when loading resource definition: {e}\n") return body_dict - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') with open(yaml_path, 'r') as file: crd = file.read() diff --git a/stacks/airflow/airflow.yaml b/stacks/airflow/airflow.yaml index e3b8cf36..dab3f072 100644 --- a/stacks/airflow/airflow.yaml +++ b/stacks/airflow/airflow.yaml @@ -238,7 +238,7 @@ data: raise AirflowException(f"Exception when loading resource definition: {e}\n") return body_dict - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') + yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), 'pyspark_pi.yaml') with open(yaml_path, 'r') as file: crd = file.read() From 0b9761f487a145d2c29e30ac2d83eb4316d4df8c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 22 Jul 2025 12:34:09 +0200 Subject: [PATCH 054/101] use airflow 2.10.5 --- demos/argo-cd/manifests/airflow/airflow.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd/manifests/airflow/airflow.yaml index 39a2bc1c..dbc8f311 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd/manifests/airflow/airflow.yaml @@ -5,12 +5,15 @@ metadata: name: airflow spec: image: - productVersion: 3.0.1 + # Currently does not work with the kubernetes executor S3 logging + # (and its still marked experimental as of release 25.7) + # productVersion: 3.0.1 + productVersion: 2.10.5 clusterConfig: loadExamples: false exposeConfig: false credentialsSecret: airflow-credentials - # NOTE: This cannot be parameterized via stackablectl since it is synced via ArgoCD + # NOTE: This cannot be parameterized via stackablectl since it is synced via ArgoCD. # # In terms of forking the repository, this should not be a problem since the DAGs are the same. # You can still change this locally and point to the fork in case of any changes to DAGs. From 59c25dcf618d033961f79c15e4b9ecb073e2a60b Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 22 Jul 2025 12:36:26 +0200 Subject: [PATCH 055/101] deploy sealed secrets before operators --- stacks/stacks-v2.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index 17b2ad08..aabda5d2 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -15,6 +15,10 @@ stacks: ################################ - helmChart: stacks/_templates/argo-cd.yaml ################################ + # prerequisites + ################################ + - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml + ################################ # project - operators ################################ - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml @@ -22,10 +26,6 @@ stacks: # applicationset - operators ################################ - plainYaml: stacks/argo-cd/applicationsets/stackable-operators.yaml - ################################ - # prerequisites - ################################ - - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml supportedNamespaces: - argo-cd resourceRequests: From 6b538b1910065f1073c9cc402972aba87c3221c2 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 15:34:30 +0200 Subject: [PATCH 056/101] change demo name to argo-cd-git-ops --- .../applications/airflow-postgres.yaml | 2 +- .../applications/airflow.yaml | 2 +- .../applications/minio.yaml | 2 +- .../{argo-cd => argo-cd-git-ops}/dags/date_demo.py | 0 .../dags/pyspark_pi.py | 0 .../sealed-airflow-postgres-credentials.yaml | 0 .../airflow/airflow-spark-clusterrole.yaml | 0 .../airflow/airflow-spark-clusterrolebinding.yaml | 0 .../manifests/airflow/airflow.yaml | 2 +- .../airflow/sealed-airflow-credentials.yaml | 0 .../airflow/sealed-airflow-minio-connection.yaml | 0 .../manifests/minio/minio.yaml | 0 .../manifests/minio/sealed-minio-credentials.yaml | 0 .../manifests/spark-k8s/pyspark_pi.yaml | 0 .../projects/airflow.yaml | 0 .../projects/minio.yaml | 0 demos/demos-v2.yaml | 14 +++++++------- .../applications/sealed-secrets.yaml | 2 +- .../applicationsets/stackable-operators.yaml | 0 .../projects/stackable-operators.yaml | 0 .../secrets/sealed-secrets-key.yaml | 0 stacks/stacks-v2.yaml | 8 ++++---- 22 files changed, 16 insertions(+), 16 deletions(-) rename demos/{argo-cd => argo-cd-git-ops}/applications/airflow-postgres.yaml (94%) rename demos/{argo-cd => argo-cd-git-ops}/applications/airflow.yaml (88%) rename demos/{argo-cd => argo-cd-git-ops}/applications/minio.yaml (88%) rename demos/{argo-cd => argo-cd-git-ops}/dags/date_demo.py (100%) rename demos/{argo-cd => argo-cd-git-ops}/dags/pyspark_pi.py (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow/airflow-spark-clusterrole.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow/airflow-spark-clusterrolebinding.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow/airflow.yaml (98%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow/sealed-airflow-credentials.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/airflow/sealed-airflow-minio-connection.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/minio/minio.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/minio/sealed-minio-credentials.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/manifests/spark-k8s/pyspark_pi.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/projects/airflow.yaml (100%) rename demos/{argo-cd => argo-cd-git-ops}/projects/minio.yaml (100%) rename stacks/{argo-cd => argo-cd-git-ops}/applications/sealed-secrets.yaml (94%) rename stacks/{argo-cd => argo-cd-git-ops}/applicationsets/stackable-operators.yaml (100%) rename stacks/{argo-cd => argo-cd-git-ops}/projects/stackable-operators.yaml (100%) rename stacks/{argo-cd => argo-cd-git-ops}/secrets/sealed-secrets-key.yaml (100%) diff --git a/demos/argo-cd/applications/airflow-postgres.yaml b/demos/argo-cd-git-ops/applications/airflow-postgres.yaml similarity index 94% rename from demos/argo-cd/applications/airflow-postgres.yaml rename to demos/argo-cd-git-ops/applications/airflow-postgres.yaml index 93361499..a2f4daf1 100644 --- a/demos/argo-cd/applications/airflow-postgres.yaml +++ b/demos/argo-cd-git-ops/applications/airflow-postgres.yaml @@ -26,7 +26,7 @@ spec: existingSecret: postgresql-credentials - repoURL: "{{ customGitUrl }}" targetRevision: "{{ customGitBranch }}" - path: demos/argo-cd/manifests/airflow-postgres/ + path: demos/argo-cd-git-ops/manifests/airflow-postgres/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/applications/airflow.yaml b/demos/argo-cd-git-ops/applications/airflow.yaml similarity index 88% rename from demos/argo-cd/applications/airflow.yaml rename to demos/argo-cd-git-ops/applications/airflow.yaml index 9070e058..276ede5e 100644 --- a/demos/argo-cd/applications/airflow.yaml +++ b/demos/argo-cd-git-ops/applications/airflow.yaml @@ -11,7 +11,7 @@ spec: source: repoURL: "{{ customGitUrl }}" targetRevision: "{{ customGitBranch }}" - path: demos/argo-cd/manifests/airflow/ + path: demos/argo-cd-git-ops/manifests/airflow/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/applications/minio.yaml b/demos/argo-cd-git-ops/applications/minio.yaml similarity index 88% rename from demos/argo-cd/applications/minio.yaml rename to demos/argo-cd-git-ops/applications/minio.yaml index 7a2c1f4f..12e220fa 100644 --- a/demos/argo-cd/applications/minio.yaml +++ b/demos/argo-cd-git-ops/applications/minio.yaml @@ -11,7 +11,7 @@ spec: source: repoURL: "{{ customGitUrl }}" targetRevision: "{{ customGitBranch }}" - path: demos/argo-cd/manifests/minio/ + path: demos/argo-cd-git-ops/manifests/minio/ syncPolicy: syncOptions: - CreateNamespace=true diff --git a/demos/argo-cd/dags/date_demo.py b/demos/argo-cd-git-ops/dags/date_demo.py similarity index 100% rename from demos/argo-cd/dags/date_demo.py rename to demos/argo-cd-git-ops/dags/date_demo.py diff --git a/demos/argo-cd/dags/pyspark_pi.py b/demos/argo-cd-git-ops/dags/pyspark_pi.py similarity index 100% rename from demos/argo-cd/dags/pyspark_pi.py rename to demos/argo-cd-git-ops/dags/pyspark_pi.py diff --git a/demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml b/demos/argo-cd-git-ops/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml similarity index 100% rename from demos/argo-cd/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml rename to demos/argo-cd-git-ops/manifests/airflow-postgres/sealed-airflow-postgres-credentials.yaml diff --git a/demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml similarity index 100% rename from demos/argo-cd/manifests/airflow/airflow-spark-clusterrole.yaml rename to demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml diff --git a/demos/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml similarity index 100% rename from demos/argo-cd/manifests/airflow/airflow-spark-clusterrolebinding.yaml rename to demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml diff --git a/demos/argo-cd/manifests/airflow/airflow.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml similarity index 98% rename from demos/argo-cd/manifests/airflow/airflow.yaml rename to demos/argo-cd-git-ops/manifests/airflow/airflow.yaml index dbc8f311..8a5be9c2 100644 --- a/demos/argo-cd/manifests/airflow/airflow.yaml +++ b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml @@ -22,7 +22,7 @@ spec: dagsGitSync: - repo: https://github.com/stackabletech/demos/ branch: spike/argocd-demo - gitFolder: "demos/argo-cd/dags" + gitFolder: "demos/argo-cd-git-ops/dags" depth: 2 volumes: - name: minio-tls diff --git a/demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml b/demos/argo-cd-git-ops/manifests/airflow/sealed-airflow-credentials.yaml similarity index 100% rename from demos/argo-cd/manifests/airflow/sealed-airflow-credentials.yaml rename to demos/argo-cd-git-ops/manifests/airflow/sealed-airflow-credentials.yaml diff --git a/demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml b/demos/argo-cd-git-ops/manifests/airflow/sealed-airflow-minio-connection.yaml similarity index 100% rename from demos/argo-cd/manifests/airflow/sealed-airflow-minio-connection.yaml rename to demos/argo-cd-git-ops/manifests/airflow/sealed-airflow-minio-connection.yaml diff --git a/demos/argo-cd/manifests/minio/minio.yaml b/demos/argo-cd-git-ops/manifests/minio/minio.yaml similarity index 100% rename from demos/argo-cd/manifests/minio/minio.yaml rename to demos/argo-cd-git-ops/manifests/minio/minio.yaml diff --git a/demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml b/demos/argo-cd-git-ops/manifests/minio/sealed-minio-credentials.yaml similarity index 100% rename from demos/argo-cd/manifests/minio/sealed-minio-credentials.yaml rename to demos/argo-cd-git-ops/manifests/minio/sealed-minio-credentials.yaml diff --git a/demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml b/demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml similarity index 100% rename from demos/argo-cd/manifests/spark-k8s/pyspark_pi.yaml rename to demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml diff --git a/demos/argo-cd/projects/airflow.yaml b/demos/argo-cd-git-ops/projects/airflow.yaml similarity index 100% rename from demos/argo-cd/projects/airflow.yaml rename to demos/argo-cd-git-ops/projects/airflow.yaml diff --git a/demos/argo-cd/projects/minio.yaml b/demos/argo-cd-git-ops/projects/minio.yaml similarity index 100% rename from demos/argo-cd/projects/minio.yaml rename to demos/argo-cd-git-ops/projects/minio.yaml diff --git a/demos/demos-v2.yaml b/demos/demos-v2.yaml index 66622b5c..683a174d 100644 --- a/demos/demos-v2.yaml +++ b/demos/demos-v2.yaml @@ -1,8 +1,8 @@ --- demos: - argocd: + argo-cd-git-ops: description: Deploy Stackable operators and Airflow via ArgoCD and activate a simple Airflow DAG. - stackableStack: argocd + stackableStack: argo-cd-git-ops labels: - argocd - git ops @@ -15,17 +15,17 @@ demos: ################################ # projects ################################ - - plainYaml: demos/argo-cd/projects/airflow.yaml - - plainYaml: demos/argo-cd/projects/minio.yaml + - plainYaml: demos/argo-cd-git-ops/projects/airflow.yaml + - plainYaml: demos/argo-cd-git-ops/projects/minio.yaml ################################ # prerequisites ################################ - - plainYaml: demos/argo-cd/applications/airflow-postgres.yaml - - plainYaml: demos/argo-cd/applications/minio.yaml + - plainYaml: demos/argo-cd-git-ops/applications/airflow-postgres.yaml + - plainYaml: demos/argo-cd-git-ops/applications/minio.yaml ################################ # products ################################ - - plainYaml: demos/argo-cd/applications/airflow.yaml + - plainYaml: demos/argo-cd-git-ops/applications/airflow.yaml supportedNamespaces: - argo-cd resourceRequests: diff --git a/stacks/argo-cd/applications/sealed-secrets.yaml b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml similarity index 94% rename from stacks/argo-cd/applications/sealed-secrets.yaml rename to stacks/argo-cd-git-ops/applications/sealed-secrets.yaml index 0bb704f1..84284847 100644 --- a/stacks/argo-cd/applications/sealed-secrets.yaml +++ b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml @@ -17,7 +17,7 @@ spec: - repoURL: https://github.com/stackabletech/demos.git # TODO: adapt to release-25.3 targetRevision: "spike/argocd-demo" - path: stacks/argo-cd/secrets/ + path: stacks/argo-cd-git-ops/secrets/ destination: server: https://kubernetes.default.svc namespace: kube-system diff --git a/stacks/argo-cd/applicationsets/stackable-operators.yaml b/stacks/argo-cd-git-ops/applicationsets/stackable-operators.yaml similarity index 100% rename from stacks/argo-cd/applicationsets/stackable-operators.yaml rename to stacks/argo-cd-git-ops/applicationsets/stackable-operators.yaml diff --git a/stacks/argo-cd/projects/stackable-operators.yaml b/stacks/argo-cd-git-ops/projects/stackable-operators.yaml similarity index 100% rename from stacks/argo-cd/projects/stackable-operators.yaml rename to stacks/argo-cd-git-ops/projects/stackable-operators.yaml diff --git a/stacks/argo-cd/secrets/sealed-secrets-key.yaml b/stacks/argo-cd-git-ops/secrets/sealed-secrets-key.yaml similarity index 100% rename from stacks/argo-cd/secrets/sealed-secrets-key.yaml rename to stacks/argo-cd-git-ops/secrets/sealed-secrets-key.yaml diff --git a/stacks/stacks-v2.yaml b/stacks/stacks-v2.yaml index adea23df..9bf264b4 100644 --- a/stacks/stacks-v2.yaml +++ b/stacks/stacks-v2.yaml @@ -1,6 +1,6 @@ --- stacks: - argocd: + argo-cd-git-ops: description: Deploying Stackable Operators with ArgoCD stackableRelease: dev # This does not matter -> managed by ArgoCD stackableOperators: ["argo-deploys-operators"] # This does not matter -> managed by ArgoCD @@ -17,15 +17,15 @@ stacks: ################################ # prerequisites ################################ - - plainYaml: stacks/argo-cd/applications/sealed-secrets.yaml + - plainYaml: stacks/argo-cd-git-ops/applications/sealed-secrets.yaml ################################ # project - operators ################################ - - plainYaml: stacks/argo-cd/projects/stackable-operators.yaml + - plainYaml: stacks/argo-cd-git-ops/projects/stackable-operators.yaml ################################ # applicationset - operators ################################ - - plainYaml: stacks/argo-cd/applicationsets/stackable-operators.yaml + - plainYaml: stacks/argo-cd-git-ops/applicationsets/stackable-operators.yaml supportedNamespaces: - argo-cd resourceRequests: From 68778e105c4087844d7cf2232ccb94b2c2d8f9b5 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 15:46:09 +0200 Subject: [PATCH 057/101] parameterize sealed secrets repo / target revision --- stacks/argo-cd-git-ops/applications/sealed-secrets.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml index 84284847..1415daf0 100644 --- a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml +++ b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml @@ -14,9 +14,8 @@ spec: releaseName: sealed-secrets-controller valuesObject: secretName: sealed-secrets-key - - repoURL: https://github.com/stackabletech/demos.git - # TODO: adapt to release-25.3 - targetRevision: "spike/argocd-demo" + - repoURL: "{{ customGitUrl }}" + targetRevision: "{{ customGitBranch }}" path: stacks/argo-cd-git-ops/secrets/ destination: server: https://kubernetes.default.svc From f63e6a126b2080cf0eaa5876cf02401c3670da8e Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 15:46:16 +0200 Subject: [PATCH 058/101] wip - docs --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 283 ++++++++++++++++++ docs/modules/demos/partials/demos.adoc | 1 + 2 files changed, 284 insertions(+) create mode 100644 docs/modules/demos/pages/argo-cd-git-ops.adoc diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc new file mode 100644 index 00000000..065233c4 --- /dev/null +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -0,0 +1,283 @@ += argo-cd-git-ops +:description: Deploy Stackable operators and products with ArgoCD. Sync manifests and secrets from Git. + +:k8s-cpu: https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/#cpu +:argo-cd: https://argoproj.github.io/cd/ +:argo-cd-application: https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#applications +:argo-cd-applicationset: https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/ +:sealed-secrets: https://github.com/bitnami-labs/sealed-secrets +:stackable-demo-repository: https://github.com/stackabletech/demos/ +:airflow: https://airflow.apache.org/ + +This demo shows how to utilize GitOps and Infrastructure as Code (IaC) with Stackable and {argo-cd}[ArgoCD]. +All products and manifests are synced and deployed via ArgoCD (except ArgoCD itself, which is bootstrapped via `stackablectl`). + +The key points to show are: +* GitOps: How to deploy my changes from a Git repository to my cluster +* Secrets: How to safely deploy credentials, access keys and store them in a Git repository +* Although not included in this Demo, it assumes / tries to imitate a possible + multicluster setup for development, staging and production. +* Interaction with Stackable products (e.g. Airflow and DAGs via gitsync) + +Install this demo on an existing Kubernetes cluster: + +[source,console] +---- +$ `stackablectl` demo install argo-cd-git-ops --namespace argo-cd +---- + +WARNING: This demo should not be run alongside other demos. + +NOTE: ArgoCD will be deployed in the `argo-cd` namespace by `stackablectl`. ArgoCD itself will create other namespaces for the deployed products. + +[#system-requirements] +== System requirements + +To run this demo, your system needs at least: + +* 20 {k8s-cpu}[cpu units] (core/hyperthread) +* 20GiB memory +* 20GiB disk storage + +== Overview + +This demo consists of multiple parts: + +* Bootstrapping via `stackablectl` +** Install a {sealed-secrets}[Sealed Secrets] controller via `stackablectl` to handle sensitive data like credentials or secret keys. +** Install {argo-cd}[Argo CD] via `stackablectl`. +* After the initial bootstrapping, ArgoCD takes over the deployment: +** Install all Stackable operators using an `ApplicationSet`. +** Spin up requirements like Minio and Postgres as `Application`. +** Deploy Stackable Airflow manifests in their respective `Projects`. +** DAGs are synced via Airflow gitsync, not ArgoCD. +** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. +** DAGs can be started manually in the Airflow webserver UI + +TODO: arch overview image + +== ArgoCD UI + +ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. + +[source,console] +---- +kubectl --namespace argo-cd port-forward service/argocd-server 8443:https +---- + +In your browser, go to `https://localhost:8443` and login with username `admin` and password `adminadmin`. + +NOTE: There will be an initial warning from the Browser that this site is insecure due to self-signed certificates. This can be ignored in this case. + +TODO: screenshots + +== Sealed Secrets + +When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. + +There are multiple solutions like Hashicorp or Bitwarden, which heavily depend on the infrastructure already available. + +For the sake of this demo, {sealed-secrets}[Bitnami's Sealed Secrets] are utilized. +Sensitive data is encrypted as a `SealedSecret` before commiting to the Git repository, synced via ArgoCD and decrypted by the Sealed Secrets controller into a standard Kubernetes `Secret`. + +This way, everything will be stored and managed in Git. + +== Stackable operators + +The Stackable operators are deployed via ArgoCD using the Stackable Helm charts and an ArgoCD {argo-cd-applicationset}[`ApplicationSet`]. +`ApplicationSets` allow templating, which is required to e.g. manage and deploy to multi cluster environments (e.g. development - staging - production), +using different versions and Git sources (repository & branch) as well as the possibility to deploy to different clusters. + +NOTE: This demo does not use a multi cluster environment for the sake of simplicity. + +[source,console] +---- +--- +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: stackable-operators +spec: + generators: + - matrix: + generators: + - list: + elements: + - operator: commons + - operator: listener + - operator: secret + - operator: airflow + - operator: druid + - operator: hbase + - operator: hdfs + - operator: hive + - operator: kafka + - operator: nifi + - operator: opa + - operator: spark-k8s + - operator: superset + - operator: trino + - operator: zookeeper + - list: + elements: + - cluster: demo + server: https://kubernetes.default.svc + targetRevision: 25.7.0 + ########################################################################################### + # The following definitions are not used in this Demo, it is shown for completeness + # for multi cluster setups + ########################################################################################### + + ########################################################################################### + # Development cluster: Checking newest Stackable developments for nightly 0.0.0-dev builds + ########################################################################################### + # - cluster: development + # server: https://kubernetes-development.default.svc + # targetRevision: 0.0.0-dev + ########################################################################################### + # Staging cluster: Checking compatibility for upgrades from 25.3.0 to 25.7.0 + ########################################################################################### + # - cluster: staging + # server: https://kubernetes-staging.default.svc + # targetRevision: 25.7.0 + ########################################################################################### + # Production cluster: Currently running release 25.3.0 and awaiting upgrade to 25.7.0 + ########################################################################################### + # - cluster: production + # server: https://kubernetes-production.default.svc + # targetRevision: 25.3.0 +# [...] +---- + +The `matrix.generators.list[].elements[]` will create a union of parameters that may be used in the `ApplicationSet` template as follows: + +[source,console] +---- +# [...] +template: + metadata: + name: "{{ operator }}-operator" + spec: + project: "stackable-operators" + ignoreDifferences: + # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: "oci.stackable.tech" + targetRevision: "{{ targetRevision }}" + chart: "sdp-charts/{{ operator }}-operator" + helm: + releaseName: "{{ operator }}-operator" + destination: + server: "{{ server }}" + namespace: "stackable-operators" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true +---- + +The templated version for e.g. the parameters `operator=zookeeper`, `server=https://kubernetes.default.svc` and `targetRevision=25.7.0` will result in the following template: + +[source,console] +---- +# [...] +template: + metadata: + name: "zookeeper-operator" + spec: + project: "stackable-operators" + ignoreDifferences: + - group: "apiextensions.k8s.io" + kind: "CustomResourceDefinition" + jqPathExpressions: + - .spec.names.categories | select(. == []) + - .spec.names.shortNames | select(. == []) + - .spec.versions[].additionalPrinterColumns | select(. == []) + source: + repoURL: "oci.stackable.tech" + targetRevision: "25.7.0" + chart: "sdp-charts/zookeeper-operator" + helm: + releaseName: "zookeeper-operator" + destination: + server: "https://kubernetes.default.svc" + namespace: "stackable-operators" + syncPolicy: + syncOptions: + - CreateNamespace=true + - ServerSideApply=true + - RespectIgnoreDifferences=true + automated: + selfHeal: true + prune: true +---- + +This allows control over which releases and versions are deployed to which cluster. + +Now with ArgoCD deployed, the Sealed Secrets controller and Stackable operators up and running, you can inspect Airflow as the first Stackable product. + +== Airflow + +The Airflow Web UI is reachable via Nodeport or easier, using a port-forward: + +[source,console] +---- +kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8080 +---- + +In your browser, go to `https://localhost:8080` and login with username `admin` and password `adminadmin`. + +TODO: Screenshots + +TODO: Similar to the ArgoCD {argo-cd-application}[`Application`] + +=== Starting DAGs + +TODO: screenshots? + +=== Checking logs + +TODO: even important here? + +== How to interact with ArgoCD and the Git repository + +Since this Demo is hosted in the {stackable-demo-repository}[Stackable Demo repository], where merging etc. requires approval, the recommendation is to fork the {stackable-demo-repository}[Stackable Demo repository]. + +Once forked, you can install this demo using `stackablectl` parameters to customize the forked repository: + +[source,console] +---- +stackablectl demo install argo-cd-git-ops --namespace argo-cd --parameters customGitUrl= --parameters customGitBranch= +---- + +This way, ArgoCD is instructed to pull the Stackable manifests from the forked repository, where your changes can be properly synced via ArgoCD. + +=== Increase Airflow webserver replicas + +Assuming your working directory ist the root of the forked demo repository, try to increase the `spec.webservers.roleGroups..replicas` in the folder `demos/argo-cd-git-ops/manifests/airflow/airflow.yaml`. +Once this is pushed / merged, ArgoCD should sync the changes and you should see more webserver pods. + +=== Add new Airflow DAGs + +Similar to ArgoCD, after adding a new DAG to the folder `demos/argo-cd-git-ops/dags`, Airflow should pick up the new DAG via gitsync. + + + + + + + + + + + diff --git a/docs/modules/demos/partials/demos.adoc b/docs/modules/demos/partials/demos.adoc index ebd54e62..c02bf24e 100644 --- a/docs/modules/demos/partials/demos.adoc +++ b/docs/modules/demos/partials/demos.adoc @@ -1,4 +1,5 @@ * xref:airflow-scheduled-job.adoc[] +* xref:argo-cd-git-ops.adoc[] * xref:data-lakehouse-iceberg-trino-spark.adoc[] * xref:end-to-end-security.adoc[] * xref:hbase-hdfs-load-cycling-data.adoc[] From 7d747c2c144cb66f64c0aeb57afdcdca127f3738 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 16:12:36 +0200 Subject: [PATCH 059/101] small fixes --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 065233c4..0c97ce87 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -23,7 +23,7 @@ Install this demo on an existing Kubernetes cluster: [source,console] ---- -$ `stackablectl` demo install argo-cd-git-ops --namespace argo-cd +$ stackablectl demo install argo-cd-git-ops --namespace argo-cd ---- WARNING: This demo should not be run alongside other demos. @@ -235,7 +235,7 @@ The Airflow Web UI is reachable via Nodeport or easier, using a port-forward: kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8080 ---- -In your browser, go to `https://localhost:8080` and login with username `admin` and password `adminadmin`. +In your browser, go to `http://localhost:8080` and login with username `admin` and password `adminadmin`. TODO: Screenshots @@ -269,7 +269,7 @@ Once this is pushed / merged, ArgoCD should sync the changes and you should see === Add new Airflow DAGs -Similar to ArgoCD, after adding a new DAG to the folder `demos/argo-cd-git-ops/dags`, Airflow should pick up the new DAG via gitsync. +Similar to ArgoCD, after adding a new DAG to the folder `demos/argo-cd-git-ops/dags`, Airflow should pick up the new DAG via gitsync and display it in the UI. From 957d7e4bbbb92f5045e77f7f3a7446c4930d0cdf Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 16:35:49 +0200 Subject: [PATCH 060/101] revert sealed secret paramterization - demo parameters not picked up in stack --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 28 +++++++++++++++++-- .../applications/sealed-secrets.yaml | 7 +++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 0c97ce87..f736801b 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -100,7 +100,19 @@ metadata: spec: generators: - matrix: - generators: + generators:licationSet`. +** Spin up requirements like Minio and Postgres as `Application`. +** Deploy Stackable Airflow manifests in their respective `Projects`. +** DAGs are synced via Airflow gitsync, not ArgoCD. +** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. +** DAGs can be started manually in the Airflow webserver UI + +TODO: arch overview image + +== ArgoCD UI + +ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. + - list: elements: - operator: commons @@ -108,7 +120,19 @@ spec: - operator: secret - operator: airflow - operator: druid - - operator: hbase + - operator: hbaselicationSet`. +** Spin up requirements like Minio and Postgres as `Application`. +** Deploy Stackable Airflow manifests in their respective `Projects`. +** DAGs are synced via Airflow gitsync, not ArgoCD. +** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. +** DAGs can be started manually in the Airflow webserver UI + +TODO: arch overview image + +== ArgoCD UI + +ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. + - operator: hdfs - operator: hive - operator: kafka diff --git a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml index 1415daf0..1522ae34 100644 --- a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml +++ b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml @@ -14,8 +14,11 @@ spec: releaseName: sealed-secrets-controller valuesObject: secretName: sealed-secrets-key - - repoURL: "{{ customGitUrl }}" - targetRevision: "{{ customGitBranch }}" + # TODO: This should be parameterized with customGitUrl and customGitBranch + # Currently these parameters are defined in the demo-v2.yaml and are + # not picked up in the stack - What to do? + - repoURL: https://github.com/stackabletech/demos/ + targetRevision: spike/argocd-demo path: stacks/argo-cd-git-ops/secrets/ destination: server: https://kubernetes.default.svc From c4ae6157d422427f2d09111cf109d71d6c44d6d5 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 17:15:35 +0200 Subject: [PATCH 061/101] docs fixes --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 59 ++++++------------- .../applications/sealed-secrets.yaml | 3 +- 2 files changed, 19 insertions(+), 43 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index f736801b..9af8415b 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -56,6 +56,17 @@ This demo consists of multiple parts: TODO: arch overview image +== Sealed Secrets + +When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. + +There are multiple solutions like Hashicorp or Bitwarden, which heavily depend on the infrastructure already available. + +For the sake of this demo, {sealed-secrets}[Bitnami's Sealed Secrets] are utilized. +Sensitive data is encrypted as a `SealedSecret` before commiting to the Git repository, synced via ArgoCD and decrypted by the Sealed Secrets controller into a standard Kubernetes `Secret`. + +This way, everything will be stored and managed in Git. + == ArgoCD UI ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. @@ -67,21 +78,10 @@ kubectl --namespace argo-cd port-forward service/argocd-server 8443:https In your browser, go to `https://localhost:8443` and login with username `admin` and password `adminadmin`. -NOTE: There will be an initial warning from the Browser that this site is insecure due to self-signed certificates. This can be ignored in this case. +NOTE: There will be an initial warning from the Browser, that this site is insecure due to self-signed certificates. This can be ignored in this case. TODO: screenshots -== Sealed Secrets - -When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. - -There are multiple solutions like Hashicorp or Bitwarden, which heavily depend on the infrastructure already available. - -For the sake of this demo, {sealed-secrets}[Bitnami's Sealed Secrets] are utilized. -Sensitive data is encrypted as a `SealedSecret` before commiting to the Git repository, synced via ArgoCD and decrypted by the Sealed Secrets controller into a standard Kubernetes `Secret`. - -This way, everything will be stored and managed in Git. - == Stackable operators The Stackable operators are deployed via ArgoCD using the Stackable Helm charts and an ArgoCD {argo-cd-applicationset}[`ApplicationSet`]. @@ -90,8 +90,7 @@ using different versions and Git sources (repository & branch) as well as the po NOTE: This demo does not use a multi cluster environment for the sake of simplicity. -[source,console] ----- +[source,yaml] --- apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet @@ -100,19 +99,7 @@ metadata: spec: generators: - matrix: - generators:licationSet`. -** Spin up requirements like Minio and Postgres as `Application`. -** Deploy Stackable Airflow manifests in their respective `Projects`. -** DAGs are synced via Airflow gitsync, not ArgoCD. -** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. -** DAGs can be started manually in the Airflow webserver UI - -TODO: arch overview image - -== ArgoCD UI - -ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. - + generators: - list: elements: - operator: commons @@ -120,19 +107,7 @@ ArgoCD will be the first product that is deployed in this Demo. Once the pods ar - operator: secret - operator: airflow - operator: druid - - operator: hbaselicationSet`. -** Spin up requirements like Minio and Postgres as `Application`. -** Deploy Stackable Airflow manifests in their respective `Projects`. -** DAGs are synced via Airflow gitsync, not ArgoCD. -** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. -** DAGs can be started manually in the Airflow webserver UI - -TODO: arch overview image - -== ArgoCD UI - -ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. - + - operator: hbase - operator: hdfs - operator: hive - operator: kafka @@ -175,7 +150,7 @@ ArgoCD will be the first product that is deployed in this Demo. Once the pods ar The `matrix.generators.list[].elements[]` will create a union of parameters that may be used in the `ApplicationSet` template as follows: -[source,console] +[source,yaml] ---- # [...] template: @@ -212,7 +187,7 @@ template: The templated version for e.g. the parameters `operator=zookeeper`, `server=https://kubernetes.default.svc` and `targetRevision=25.7.0` will result in the following template: -[source,console] +[source,yaml] ---- # [...] template: diff --git a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml index 1522ae34..b05275db 100644 --- a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml +++ b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml @@ -14,9 +14,10 @@ spec: releaseName: sealed-secrets-controller valuesObject: secretName: sealed-secrets-key - # TODO: This should be parameterized with customGitUrl and customGitBranch + # TODO: This should be parameterized with customGitUrl and customGitBranch parameters. # Currently these parameters are defined in the demo-v2.yaml and are # not picked up in the stack - What to do? + # TODO: adapt to main / 25.7 - repoURL: https://github.com/stackabletech/demos/ targetRevision: spike/argocd-demo path: stacks/argo-cd-git-ops/secrets/ From 01ba8c1e877fdf35231a2d947c79be408b543980 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 17:16:23 +0200 Subject: [PATCH 062/101] doc fixes 2 --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 9af8415b..2881578e 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -91,6 +91,7 @@ using different versions and Git sources (repository & branch) as well as the po NOTE: This demo does not use a multi cluster environment for the sake of simplicity. [source,yaml] +---- --- apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet From 4428e486044970dc8a8317ee77e0b29e021cbfc8 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 23 Jul 2025 17:17:19 +0200 Subject: [PATCH 063/101] doc fixes 3 --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 2881578e..1f3cff66 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -13,6 +13,7 @@ This demo shows how to utilize GitOps and Infrastructure as Code (IaC) with Stac All products and manifests are synced and deployed via ArgoCD (except ArgoCD itself, which is bootstrapped via `stackablectl`). The key points to show are: + * GitOps: How to deploy my changes from a Git repository to my cluster * Secrets: How to safely deploy credentials, access keys and store them in a Git repository * Although not included in this Demo, it assumes / tries to imitate a possible @@ -160,7 +161,6 @@ template: spec: project: "stackable-operators" ignoreDifferences: - # mitigating: https://github.com/stackabletech/hdfs-operator/issues/626 - group: "apiextensions.k8s.io" kind: "CustomResourceDefinition" jqPathExpressions: From fcd3bf765545a9af0180a080d5d9fea72490608d Mon Sep 17 00:00:00 2001 From: maltesander Date: Thu, 24 Jul 2025 14:52:07 +0200 Subject: [PATCH 064/101] fix overview parts --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 1f3cff66..dd643daf 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -45,9 +45,9 @@ To run this demo, your system needs at least: This demo consists of multiple parts: * Bootstrapping via `stackablectl` -** Install a {sealed-secrets}[Sealed Secrets] controller via `stackablectl` to handle sensitive data like credentials or secret keys. ** Install {argo-cd}[Argo CD] via `stackablectl`. * After the initial bootstrapping, ArgoCD takes over the deployment: +** Install a {sealed-secrets}[Sealed Secrets] controller to handle sensitive data like credentials or secret keys. ** Install all Stackable operators using an `ApplicationSet`. ** Spin up requirements like Minio and Postgres as `Application`. ** Deploy Stackable Airflow manifests in their respective `Projects`. From eb78876d4d83a91463f165469d58e51629353332 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 28 Jul 2025 12:44:23 +0200 Subject: [PATCH 065/101] change namespace to sealed-secrets --- stacks/argo-cd-git-ops/applications/sealed-secrets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml index b05275db..b6dd9ccd 100644 --- a/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml +++ b/stacks/argo-cd-git-ops/applications/sealed-secrets.yaml @@ -23,7 +23,7 @@ spec: path: stacks/argo-cd-git-ops/secrets/ destination: server: https://kubernetes.default.svc - namespace: kube-system + namespace: sealed-secrets syncPolicy: syncOptions: - CreateNamespace=true From a9789be3190eb1a65ca8c836dca42e2a72974f0d Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 28 Jul 2025 12:44:54 +0200 Subject: [PATCH 066/101] increase webserver memory 1gb to 1.5gb --- demos/argo-cd-git-ops/manifests/airflow/airflow.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml index 8a5be9c2..ac171a7b 100644 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml +++ b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml @@ -47,7 +47,7 @@ spec: listenerClass: external-unstable envOverrides: &envOverrides AIRFLOW_CONN_KUBERNETES_IN_CLUSTER: "kubernetes://?__extra__=%7B%22extra__kubernetes__in_cluster%22%3A+true%2C+%22extra__kubernetes__kube_config%22%3A+%22%22%2C+%22extra__kubernetes__kube_config_path%22%3A+%22%22%2C+%22extra__kubernetes__namespace%22%3A+%22%22%7D" - # Via sealed secrets, just kept for reference here + # Via sealed secrets and pod overrides, just kept for reference here # AIRFLOW_CONN_MINIO: "aws://admin:adminadmin@/?endpoint_url=https%3A%2F%2Fminio.minio.svc.cluster.local%3A9000" AWS_CA_BUNDLE: "/stackable/minio-tls/ca.crt" AIRFLOW__LOGGING__REMOTE_LOGGING: "True" @@ -70,7 +70,7 @@ spec: min: 400m max: "1" memory: - limit: 1Gi + limit: 1.5Gi roleGroups: default: # NOTE: In order to properly show ArgoCD in action - syncing changes via Git - do the following: From d76d52606d25eb0b668ed5b82c1a3356d07c849c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Mon, 28 Jul 2025 13:41:54 +0200 Subject: [PATCH 067/101] test 3.0.1 and remote logging --- demos/argo-cd-git-ops/manifests/airflow/airflow.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml index ac171a7b..167f7a47 100644 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml +++ b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml @@ -7,8 +7,7 @@ spec: image: # Currently does not work with the kubernetes executor S3 logging # (and its still marked experimental as of release 25.7) - # productVersion: 3.0.1 - productVersion: 2.10.5 + productVersion: 3.0.1 clusterConfig: loadExamples: false exposeConfig: false From 8fb3bff8bc3d2cb11e7dc68e6b445063d7e3882c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 29 Jul 2025 09:16:44 +0200 Subject: [PATCH 068/101] improve git interaction docs --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index dd643daf..aacd402e 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -269,15 +269,14 @@ Once this is pushed / merged, ArgoCD should sync the changes and you should see === Add new Airflow DAGs -Similar to ArgoCD, after adding a new DAG to the folder `demos/argo-cd-git-ops/dags`, Airflow should pick up the new DAG via gitsync and display it in the UI. - - - - - - - - - +In the `demos/argo-cd-git-ops/manifests/airflow/airflow.yaml` manifest you have to adapt the gitsync configuration for DAGs to the forked repository: +[source,yaml] +---- + dagsGitSync: + - repo: + branch: + [...] +---- +Similar to ArgoCD, after adding a new DAG to the folder `demos/argo-cd-git-ops/dags`, Airflow should pick up the new DAG via gitsync and display it in the UI. From 3530c105ae164e023ab5c64f1037129014f9884f Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 29 Jul 2025 10:07:40 +0200 Subject: [PATCH 069/101] downgrade airflow to 2.10.5 - remote logging not working for 3 --- demos/argo-cd-git-ops/manifests/airflow/airflow.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml index 167f7a47..4fb995aa 100644 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml +++ b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml @@ -6,8 +6,11 @@ metadata: spec: image: # Currently does not work with the kubernetes executor S3 logging - # (and its still marked experimental as of release 25.7) - productVersion: 3.0.1 + # (and its still marked experimental as of release 25.7). See: + # https://github.com/apache/airflow/issues/50583 + # https://github.com/apache/airflow/issues/52501 + # productVersion: 3.0.1 + productVersion: 2.10.5 clusterConfig: loadExamples: false exposeConfig: false From 47a885acc7525e8998f3859aed594aea31ab8a49 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 29 Jul 2025 10:51:32 +0200 Subject: [PATCH 070/101] add architecture overview svg to docs --- .../argo-cd-git-ops/architecture-overview.svg | 4 +++ docs/modules/demos/pages/argo-cd-git-ops.adoc | 32 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg new file mode 100644 index 00000000..c2cabc58 --- /dev/null +++ b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg @@ -0,0 +1,4 @@ + + + +
Kubernetes cluster
Kubernetes cluster
Argo applies 
manifests and
Helm charts
into the cluster
Argo applies...
Git repository
Git repository
Bootstrap ArgoCD
via Helm chart
Bootstrap ArgoCD...
Deploy Argo Projects
Deploy Argo Projects
Deploy Argo Applications
Deploy Argo Applications
Deploy Argo ApplicationSets
Deploy Argo ApplicationSets
stackablectl
stackablectl
Projects
Projects
- stackable-operators
- minio
- airflow
- stackable-operators...
Applications
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
- sealed-secrets-controlle...
ApplicationSets
ApplicationSets
- stackable-operators
- stackable-operators
Synchronise
manifests and
Helm charts
Synchronise...
creates
creates
airflow-operator
airflow-operator
Synchronize
DAGs from 
Git
Synchronize...
run
DAG
run...
airflow-cluster
airflow-cluster
airflow-postgres
airflow-postgres
applies
applies
DAG
pyspark_pi
DAG...
creates
creates
spark-k8s-operator
spark-k8s-operator
spark-application
spark-application
spark-
submit
spark-...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index aacd402e..cbecac7a 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -14,12 +14,14 @@ All products and manifests are synced and deployed via ArgoCD (except ArgoCD its The key points to show are: -* GitOps: How to deploy my changes from a Git repository to my cluster -* Secrets: How to safely deploy credentials, access keys and store them in a Git repository -* Although not included in this Demo, it assumes / tries to imitate a possible - multicluster setup for development, staging and production. +* GitOps: How to deploy changes from a Git repository to my cluster? +* Secrets: How to safely store and deploy credentials, access keys from a Git repository? * Interaction with Stackable products (e.g. Airflow and DAGs via gitsync) +ArgoCD and other deployed products and dependencies are illustrated in the following diagram: + +image::argo-cd-git-ops/architecture-overview.svg[] + Install this demo on an existing Kubernetes cluster: [source,console] @@ -44,16 +46,18 @@ To run this demo, your system needs at least: This demo consists of multiple parts: -* Bootstrapping via `stackablectl` -** Install {argo-cd}[Argo CD] via `stackablectl`. -* After the initial bootstrapping, ArgoCD takes over the deployment: -** Install a {sealed-secrets}[Sealed Secrets] controller to handle sensitive data like credentials or secret keys. -** Install all Stackable operators using an `ApplicationSet`. -** Spin up requirements like Minio and Postgres as `Application`. -** Deploy Stackable Airflow manifests in their respective `Projects`. -** DAGs are synced via Airflow gitsync, not ArgoCD. -** Airflow uses the Kubernetes executor and write its logs to S3 / Minio. -** DAGs can be started manually in the Airflow webserver UI +* Bootstrapping via `stackablectl`: +** Install {argo-cd}[Argo CD] via `stackablectl` +* Deploy components via ArgoCD: +** Install a {sealed-secrets}[Sealed Secrets] controller to handle sensitive data like credentials or secret keys +** Install all Stackable operators using an `ApplicationSet` +** Install requirements like Minio and Postgres as `Application` +** Deploy Stackable Airflow manifests into their respective `Projects` +* Inspect ArgoCD UI +* Inspect Airflow and start DAGs +** Checkout Airflow UI and synced DAGs (the DAGs are synced via gitsync, not ArgoCD) +** Start a DAG and inspect the logs written to S3 / Minio by the Kubernetes executor +* Optional: Inspect Minio UI for logs TODO: arch overview image From 0bcade94cb531ec945081ef1576751981b1bffa7 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Tue, 29 Jul 2025 13:39:52 +0200 Subject: [PATCH 071/101] wip - docs --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 59 +++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index cbecac7a..8f01feac 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -24,6 +24,8 @@ image::argo-cd-git-ops/architecture-overview.svg[] Install this demo on an existing Kubernetes cluster: +TODO: We need a pointer here to the last paragraph (forking repo) if people want to "interact" and not just install the demo (install command requires extra parameters) + [source,console] ---- $ stackablectl demo install argo-cd-git-ops --namespace argo-cd @@ -38,9 +40,9 @@ NOTE: ArgoCD will be deployed in the `argo-cd` namespace by `stackablectl`. Argo To run this demo, your system needs at least: -* 20 {k8s-cpu}[cpu units] (core/hyperthread) -* 20GiB memory -* 20GiB disk storage +* 15 {k8s-cpu}[cpu units] (core/hyperthread) +* 15 GiB memory +* 5 GiB disk storage == Overview @@ -74,7 +76,7 @@ This way, everything will be stored and managed in Git. == ArgoCD UI -ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the Web UI. +ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the web UI. [source,console] ---- @@ -85,7 +87,25 @@ In your browser, go to `https://localhost:8443` and login with username `admin` NOTE: There will be an initial warning from the Browser, that this site is insecure due to self-signed certificates. This can be ignored in this case. -TODO: screenshots +The ArgoCD Web UI entry page shows an overview of deployed applications and their status and other metadata as the repository or the date of the last synchronization run. + +TODO: Screenshot - Argo UI overview + +Single applications can be inspected closer after clicking on e.g. the `airflow` project. + +TODO: Screenshot - Argo UI - Airflow + +Detailed information about the cluster, the cluster status and deployed components can be accessed in the application details. +Additionally, if the Git repository and the cluster state itself differ, possible applied changes can be previewed in a code diff similar to Git pull requests. + +TODO: Screenshot - Argo UI - application details Network / List tab -> mark network tabs etc. + +Per default in this demo, the ArgoCD `Sync Policy` is set to `auto-sync`. This means that changes to the Git repository are immediatly synced into the cluster. +This is nice in the demo case, but should be disabled for production use cases. + +TODO: Screenshot - Argo UI - applications/airflow/details + +Now, after a quick overview of the ArgoCD web UI, the following part demonstrates how to sync and deploy Stackable operators via ArgoCD. == Stackable operators @@ -95,6 +115,8 @@ using different versions and Git sources (repository & branch) as well as the po NOTE: This demo does not use a multi cluster environment for the sake of simplicity. +TODO: Do the code snippets actually help? Maybe text is better... its about showing at least some parts of a multi cluster setup... + [source,yaml] ---- --- @@ -232,26 +254,39 @@ Now with ArgoCD deployed, the Sealed Secrets controller and Stackable operators == Airflow -The Airflow Web UI is reachable via Nodeport or easier, using a port-forward: +The Airflow web UI is reachable via Nodeport or easier, using a port-forward: [source,console] ---- -kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8080 +kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8081:8080 ---- In your browser, go to `http://localhost:8080` and login with username `admin` and password `adminadmin`. -TODO: Screenshots - -TODO: Similar to the ArgoCD {argo-cd-application}[`Application`] +TODO: Screenshots - start dag === Starting DAGs TODO: screenshots? -=== Checking logs +== Minio / S3 - check logs + +Since the Airflow Kubernetes Executor will be deleted after its run, the logs are written to an S3 bucket. When accessing the logs via the Airflow webserver, +the logs are fetched from S3 instead of the (already deleted) executor pods. The Minio / S3 instance can be accessed via port-forward: + +[source,console] +---- +kubectl --namespace minio port-forward service/minio-console 9001:9001 +---- + +Minio then is reachable via `https://localhost:9001` with username `admin` and password `adminadmin`. After the successful Airflow DAG run, logs should be stored in `demo/airflow-task-logs`. + +NOTE: There will be an initial warning from the Browser, that this site is insecure due to self-signed certificates. This can be ignored in this case. + +TODO: Screenshot - minio UI with log data -TODO: even important here? +As a last step, in order to better interact and not just "sync" from the Git repository, the following paragraph demonstrates how to fork the demo repository and adapt the `stackablectl` install command to point to the forked repository. +In this forked repository, changes can be made the code and synced into the cluster via ArgoCD. == How to interact with ArgoCD and the Git repository From 1ef3516c1f967729554e3388f09ac47aa6168103 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 08:51:11 +0200 Subject: [PATCH 072/101] add readme for sealing secrets --- demos/argo-cd-git-ops/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 demos/argo-cd-git-ops/README.md diff --git a/demos/argo-cd-git-ops/README.md b/demos/argo-cd-git-ops/README.md new file mode 100644 index 00000000..26c3b43f --- /dev/null +++ b/demos/argo-cd-git-ops/README.md @@ -0,0 +1,16 @@ +# argo-cd-git-ops + +## How to create sealed secrets + +This demo uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) to decrypt secrets stored in Git. + +The CLI tool `kubeseal` must be installed as described in the [Sealed Secrets readme](https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#kubeseal). + +The easiest way to seal secrets via `kubeseal` is to have the `argo-cd-git-ops` installed. It provides the Sealed Secrets controller and +a generated certificate that is automatically used for signing. + +```sh +kubeseal -n stackable-airflow --format=yaml < airflow-credentials.yaml > sealed-airflow-credentials.yaml +``` + +TODO: We should probably create a script that seals all secrets and puts them in the respective stack / demo folders From e3e672737c0179000cef0fc9be193b77db29fa99 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 08:52:17 +0200 Subject: [PATCH 073/101] improve seal secret docs --- demos/argo-cd-git-ops/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/argo-cd-git-ops/README.md b/demos/argo-cd-git-ops/README.md index 26c3b43f..9834cac4 100644 --- a/demos/argo-cd-git-ops/README.md +++ b/demos/argo-cd-git-ops/README.md @@ -2,12 +2,12 @@ ## How to create sealed secrets -This demo uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) to decrypt secrets stored in Git. +This demo uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) to decrypt secrets stored in a Git repository. The CLI tool `kubeseal` must be installed as described in the [Sealed Secrets readme](https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#kubeseal). -The easiest way to seal secrets via `kubeseal` is to have the `argo-cd-git-ops` installed. It provides the Sealed Secrets controller and -a generated certificate that is automatically used for signing. +The easiest way to seal secrets via `kubeseal` is to have the `argo-cd-git-ops` Stack installed. It provides the Sealed Secrets controller and +a generated certificate that is automatically used for signing via `kubeseal`. ```sh kubeseal -n stackable-airflow --format=yaml < airflow-credentials.yaml > sealed-airflow-credentials.yaml From 7c6da944d62395858b9ee0b7a02f635c88796e77 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 10:24:32 +0200 Subject: [PATCH 074/101] add kubeseal offline guide --- demos/argo-cd-git-ops/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/demos/argo-cd-git-ops/README.md b/demos/argo-cd-git-ops/README.md index 9834cac4..71115809 100644 --- a/demos/argo-cd-git-ops/README.md +++ b/demos/argo-cd-git-ops/README.md @@ -13,4 +13,11 @@ a generated certificate that is automatically used for signing via `kubeseal`. kubeseal -n stackable-airflow --format=yaml < airflow-credentials.yaml > sealed-airflow-credentials.yaml ``` +For "offline" usage you can first fetch the CA from the `sealed-secrets-controller` and use that for encryption when the demo / stack is not available. + +```sh +kubeseal --fetch-cert --controller-name sealed-secrets-controller --controller-namespace sealed-secrets > sealed-secrets.crt +kubeseal --cert sealed-secrets.crt -n stackable-airflow --format=yaml < airflow-credentials.yaml > sealed-airflow-credentials.yaml +``` + TODO: We should probably create a script that seals all secrets and puts them in the respective stack / demo folders From cb58dfa8c6b5a4607d92a53c02a98cfec3af6b57 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 17:21:05 +0200 Subject: [PATCH 075/101] increase webserver memory limit to 2gb --- demos/argo-cd-git-ops/manifests/airflow/airflow.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml index 4fb995aa..df0e6de1 100644 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml +++ b/demos/argo-cd-git-ops/manifests/airflow/airflow.yaml @@ -72,7 +72,7 @@ spec: min: 400m max: "1" memory: - limit: 1.5Gi + limit: 2Gi roleGroups: default: # NOTE: In order to properly show ArgoCD in action - syncing changes via Git - do the following: From 05f43455278a4612b1fbaaa9827ef2b50538e0aa Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 17:22:07 +0200 Subject: [PATCH 076/101] remove pyspark dag & spark references --- demos/argo-cd-git-ops/dags/pyspark_pi.py | 177 ------------------ .../airflow/airflow-spark-clusterrole.yaml | 28 --- .../airflow-spark-clusterrolebinding.yaml | 13 -- .../manifests/spark-k8s/pyspark_pi.yaml | 36 ---- 4 files changed, 254 deletions(-) delete mode 100644 demos/argo-cd-git-ops/dags/pyspark_pi.py delete mode 100644 demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml delete mode 100644 demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml delete mode 100644 demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml diff --git a/demos/argo-cd-git-ops/dags/pyspark_pi.py b/demos/argo-cd-git-ops/dags/pyspark_pi.py deleted file mode 100644 index 9c408527..00000000 --- a/demos/argo-cd-git-ops/dags/pyspark_pi.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Example DAG demonstrating how to apply a Kubernetes Resource from Airflow running in-cluster""" -from datetime import datetime, timedelta -from airflow import DAG -from typing import TYPE_CHECKING, Optional, Sequence, Dict -from kubernetes import client -from airflow.exceptions import AirflowException -from airflow.sensors.base import BaseSensorOperator -from airflow.models import BaseOperator -from airflow.providers.cncf.kubernetes.hooks.kubernetes import KubernetesHook -import yaml -from airflow.utils import yaml -import os - -if TYPE_CHECKING: - from airflow.utils.context import Context - -class SparkKubernetesOperator(BaseOperator): - template_fields: Sequence[str] = ('application_file', 'namespace') - template_ext: Sequence[str] = ('.yaml', '.yml', '.json') - ui_color = '#f4a460' - - def __init__( - self, - *, - application_file: str, - namespace: Optional[str] = None, - kubernetes_conn_id: str = 'kubernetes_in_cluster', - api_group: str = 'spark.stackable.tech', - api_version: str = 'v1alpha1', - **kwargs, - ) -> None: - super().__init__(**kwargs) - self.application_file = application_file - self.namespace = namespace - self.kubernetes_conn_id = kubernetes_conn_id - self.api_group = api_group - self.api_version = api_version - self.plural = "sparkapplications" - - def execute(self, context: 'Context'): - hook = KubernetesHook(conn_id=self.kubernetes_conn_id) - self.log.info("Creating SparkApplication...") - response = hook.create_custom_object( - group=self.api_group, - version=self.api_version, - plural=self.plural, - body=self.application_file, - namespace=self.namespace, - ) - return response - - -class SparkKubernetesSensor(BaseSensorOperator): - template_fields = ("application_name", "namespace") - # See https://github.com/stackabletech/spark-k8s-operator/pull/460/files#diff-d737837121132af6b60f50279a78464b05dcfd06c05d1d090f4198a5e962b5f6R371 - # Unknown is set immediately so it must be excluded from the failed states. - FAILURE_STATES = ("Failed") - SUCCESS_STATES = ("Succeeded") - - def __init__( - self, - *, - application_name: str, - attach_log: bool = False, - namespace: Optional[str] = None, - kubernetes_conn_id: str = 'kubernetes_in_cluster', - api_group: str = 'spark.stackable.tech', - api_version: str = 'v1alpha1', - poke_interval: float = 60, - **kwargs, - ) -> None: - super().__init__(**kwargs) - self.application_name = application_name - self.attach_log = attach_log - self.namespace = namespace - self.kubernetes_conn_id = kubernetes_conn_id - self.hook = KubernetesHook(conn_id=self.kubernetes_conn_id) - self.api_group = api_group - self.api_version = api_version - self.poke_interval = poke_interval - - def _log_driver(self, application_state: str, response: dict) -> None: - if not self.attach_log: - return - status_info = response["status"] - if "driverInfo" not in status_info: - return - driver_info = status_info["driverInfo"] - if "podName" not in driver_info: - return - driver_pod_name = driver_info["podName"] - namespace = response["metadata"]["namespace"] - log_method = self.log.error if application_state in self.FAILURE_STATES else self.log.info - try: - log = "" - for line in self.hook.get_pod_logs(driver_pod_name, namespace=namespace): - log += line.decode() - log_method(log) - except client.rest.ApiException as e: - self.log.warning( - "Could not read logs for pod %s. It may have been disposed.\n" - "Make sure timeToLiveSeconds is set on your SparkApplication spec.\n" - "underlying exception: %s", - driver_pod_name, - e, - ) - - def poke(self, context: Dict) -> bool: - self.log.info("Poking: %s", self.application_name) - response = self.hook.get_custom_object( - group=self.api_group, - version=self.api_version, - plural="sparkapplications", - name=self.application_name, - namespace=self.namespace, - ) - try: - application_state = response["status"]["phase"] - except KeyError: - self.log.debug(f"SparkApplication status could not be established: {response}") - return False - if self.attach_log and application_state in self.FAILURE_STATES + self.SUCCESS_STATES: - self._log_driver(application_state, response) - if application_state in self.FAILURE_STATES: - raise AirflowException(f"SparkApplication failed with state: {application_state}") - elif application_state in self.SUCCESS_STATES: - self.log.info("SparkApplication ended successfully") - return True - else: - self.log.info("SparkApplication is still in state: %s", application_state) - return False - -with DAG( - dag_id='sparkapp_dag', - schedule=None, - start_date=datetime(2022, 1, 1), - catchup=False, - dagrun_timeout=timedelta(minutes=60), - tags=['example'], - params={"example_key": "example_value"}, -) as dag: - - def load_body_to_dict(body): - try: - body_dict = yaml.safe_load(body) - except yaml.YAMLError as e: - raise AirflowException(f"Exception when loading resource definition: {e}\n") - return body_dict - - yaml_path = os.path.join(os.environ.get('AIRFLOW__CORE__DAGS_FOLDER'), '../manifests/spark-k8s/pyspark_pi.yaml') - - with open(yaml_path, 'r') as file: - crd = file.read() - with open('/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as file: - ns = file.read() - - document=load_body_to_dict(crd) - application_name='pyspark-pi-'+datetime.utcnow().strftime('%Y%m%d%H%M%S') - document.update({'metadata': {'name': application_name, 'namespace': ns}}) - - t1 = SparkKubernetesOperator( - task_id='spark_pi_submit', - namespace=ns, - application_file=document, - do_xcom_push=True, - dag=dag, - ) - - t2 = SparkKubernetesSensor( - task_id='spark_pi_monitor', - namespace=ns, - application_name="{{ task_instance.xcom_pull(task_ids='spark_pi_submit')['metadata']['name'] }}", - poke_interval=5, - dag=dag, - ) - - t1 >> t2 diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml deleted file mode 100644 index d13657fa..00000000 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrole.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: airflow-spark-clusterrole -rules: - - apiGroups: - - spark.stackable.tech - resources: - - sparkapplications - verbs: - - create - - get - - list - - apiGroups: - - apps - resources: - - statefulsets - verbs: - - get - - watch - - list - - apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - list diff --git a/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml b/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml deleted file mode 100644 index 1f9e1b5d..00000000 --- a/demos/argo-cd-git-ops/manifests/airflow/airflow-spark-clusterrolebinding.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: airflow-spark-clusterrole-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: airflow-spark-clusterrole -subjects: - - apiGroup: rbac.authorization.k8s.io - kind: Group - name: system:serviceaccounts diff --git a/demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml b/demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml deleted file mode 100644 index d5d84da3..00000000 --- a/demos/argo-cd-git-ops/manifests/spark-k8s/pyspark_pi.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -apiVersion: spark.stackable.tech/v1alpha1 -kind: SparkApplication -metadata: - name: pyspark-pi -spec: - version: "1.0" - sparkImage: - productVersion: 3.5.6 - mode: cluster - mainApplicationFile: local:///stackable/spark/examples/src/main/python/pi.py - job: - config: - resources: - cpu: - min: 500m - max: 500m - memory: - limit: 512Mi - driver: - config: - resources: - cpu: - min: 1000m - max: 1200m - memory: - limit: 1024Mi - executor: - config: - resources: - cpu: - min: 500m - max: 1000m - memory: - limit: 1024Mi - replicas: 3 From 4b2a5accc8aad03d1fc73b93243ea25aa41539fd Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 17:33:37 +0200 Subject: [PATCH 077/101] improve arch overview --- .../images/argo-cd-git-ops/architecture-overview.drawio.svg | 4 ++++ .../demos/images/argo-cd-git-ops/architecture-overview.svg | 4 ---- docs/modules/demos/pages/argo-cd-git-ops.adoc | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) create mode 100644 docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg delete mode 100644 docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg new file mode 100644 index 00000000..797e8299 --- /dev/null +++ b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg @@ -0,0 +1,4 @@ + + + +
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create
Stackable
airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow manifests
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg deleted file mode 100644 index c2cabc58..00000000 --- a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Kubernetes cluster
Kubernetes cluster
Argo applies 
manifests and
Helm charts
into the cluster
Argo applies...
Git repository
Git repository
Bootstrap ArgoCD
via Helm chart
Bootstrap ArgoCD...
Deploy Argo Projects
Deploy Argo Projects
Deploy Argo Applications
Deploy Argo Applications
Deploy Argo ApplicationSets
Deploy Argo ApplicationSets
stackablectl
stackablectl
Projects
Projects
- stackable-operators
- minio
- airflow
- stackable-operators...
Applications
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
- sealed-secrets-controlle...
ApplicationSets
ApplicationSets
- stackable-operators
- stackable-operators
Synchronise
manifests and
Helm charts
Synchronise...
creates
creates
airflow-operator
airflow-operator
Synchronize
DAGs from 
Git
Synchronize...
run
DAG
run...
airflow-cluster
airflow-cluster
airflow-postgres
airflow-postgres
applies
applies
DAG
pyspark_pi
DAG...
creates
creates
spark-k8s-operator
spark-k8s-operator
spark-application
spark-application
spark-
submit
spark-...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 8f01feac..f3d2f079 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -20,7 +20,7 @@ The key points to show are: ArgoCD and other deployed products and dependencies are illustrated in the following diagram: -image::argo-cd-git-ops/architecture-overview.svg[] +image::argo-cd-git-ops/architecture-overview.drawio.svg[] Install this demo on an existing Kubernetes cluster: @@ -61,8 +61,6 @@ This demo consists of multiple parts: ** Start a DAG and inspect the logs written to S3 / Minio by the Kubernetes executor * Optional: Inspect Minio UI for logs -TODO: arch overview image - == Sealed Secrets When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. From ace946162e7c48d7a3766ced2a355a8c2651bc4b Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Wed, 30 Jul 2025 17:35:56 +0200 Subject: [PATCH 078/101] fix diagram --- .../images/argo-cd-git-ops/architecture-overview.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg index 797e8299..ab34f4f1 100644 --- a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg +++ b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg @@ -1,4 +1,4 @@ -
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create
Stackable
airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow manifests
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file +
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create

airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow manifests
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file From a4325185eb3725a3b8b5118885d211c18b4018b3 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 09:31:10 +0200 Subject: [PATCH 079/101] copy&paste fixes overview --- .../images/argo-cd-git-ops/architecture-overview.drawio.svg | 2 +- docs/modules/demos/pages/argo-cd-git-ops.adoc | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg index ab34f4f1..5858a4e9 100644 --- a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg +++ b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg @@ -1,4 +1,4 @@ -
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create

airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow manifests
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file +
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests,
secrets, credentials
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create

airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow DAGs
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index f3d2f079..f2a854ab 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -256,13 +256,11 @@ The Airflow web UI is reachable via Nodeport or easier, using a port-forward: [source,console] ---- -kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8081:8080 +kubectl --namespace stackable-airflow port-forward service/airflow-webserver 8080:8080 ---- In your browser, go to `http://localhost:8080` and login with username `admin` and password `adminadmin`. -TODO: Screenshots - start dag - === Starting DAGs TODO: screenshots? From 20ba3a2f50822cccde41e56ec9862aa94a9db0d9 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 09:59:04 +0200 Subject: [PATCH 080/101] fix arrows --- .../images/argo-cd-git-ops/architecture-overview.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg index 5858a4e9..cf4bb292 100644 --- a/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg +++ b/docs/modules/demos/images/argo-cd-git-ops/architecture-overview.drawio.svg @@ -1,4 +1,4 @@ -
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets
stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests,
secrets, credentials
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create

airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow DAGs
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file +
Bootstrapping
ArgoCD via
Helm Chart
Apply ArgoCD
Projects
Apply ArgoCD
Applications
Apply ArgoCD
ApplicationSets

stackablectl
Projects
- stackable-operators
- minio
- airflow
ApplicationSets
- stackable-operators
Airflow manifests,
secrets, credentials
Install via
Helm Chart
Helm / Container registry
Apply operator 
Helm charts
from registry
Apply 
sealed-secrets-controller,
airflow-postgres,
via Helm chart
Apply
airflow
manifets
from Git
Apply manifests,
credentials, clusterroles
Update Airflow
manifest, e.g. 
version update,
increase replicas
Cluster
Admin
DAG
Developer
create

airflow-operator
read by
Airflow
Cluster
Update ArgoCD
projects and
applications e.g.,
stackable release
version
             sealed-
                 secrets-
                 controller
Airflow
data
read/write
logs
airflow-credentials
read and decrypted by
sealed-airflow-credentials
create
decrypted
secret
read by
Airflow DAGs
Synchronize DAGs
via gitsync
Update DAGs
(can be a different
Git repository)
Applications
- sealed-secrets-controller
- minio
- airflow
- airflow-postgres
\ No newline at end of file From 91ff3dd30ac1be4bbdd7e2b8350265c11dbf26d9 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 11:52:00 +0200 Subject: [PATCH 081/101] remove autoformatting --- stacks/airflow/airflow.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/stacks/airflow/airflow.yaml b/stacks/airflow/airflow.yaml index dab3f072..1a02b1ef 100644 --- a/stacks/airflow/airflow.yaml +++ b/stacks/airflow/airflow.yaml @@ -303,8 +303,6 @@ data: memory: limit: 1024Mi replicas: 3 - - # {% endraw %} --- apiVersion: v1 From ccb712cfd46fa18ee249e42d78134eb6721065d6 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 12:33:56 +0200 Subject: [PATCH 082/101] Apply suggestions from code review Co-authored-by: Andrew Kenworthy <1712947+adwk67@users.noreply.github.com> --- demos/argo-cd-git-ops/README.md | 4 ++-- docs/modules/demos/pages/argo-cd-git-ops.adoc | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/demos/argo-cd-git-ops/README.md b/demos/argo-cd-git-ops/README.md index 71115809..00d62892 100644 --- a/demos/argo-cd-git-ops/README.md +++ b/demos/argo-cd-git-ops/README.md @@ -6,8 +6,8 @@ This demo uses [Sealed Secrets](https://github.com/bitnami-labs/sealed-secrets) The CLI tool `kubeseal` must be installed as described in the [Sealed Secrets readme](https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#kubeseal). -The easiest way to seal secrets via `kubeseal` is to have the `argo-cd-git-ops` Stack installed. It provides the Sealed Secrets controller and -a generated certificate that is automatically used for signing via `kubeseal`. +The easiest way to seal secrets via `kubeseal` is to have the `argo-cd-git-ops` Stack installed. +It provides the Sealed Secrets controller and a generated certificate that is automatically used for signing via `kubeseal`. ```sh kubeseal -n stackable-airflow --format=yaml < airflow-credentials.yaml > sealed-airflow-credentials.yaml diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index f2a854ab..99e1a66d 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -33,7 +33,8 @@ $ stackablectl demo install argo-cd-git-ops --namespace argo-cd WARNING: This demo should not be run alongside other demos. -NOTE: ArgoCD will be deployed in the `argo-cd` namespace by `stackablectl`. ArgoCD itself will create other namespaces for the deployed products. +NOTE: ArgoCD will be deployed in the `argo-cd` namespace by `stackablectl`. +ArgoCD itself will create other namespaces for the deployed products. [#system-requirements] == System requirements @@ -65,7 +66,7 @@ This demo consists of multiple parts: When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. -There are multiple solutions like Hashicorp or Bitwarden, which heavily depend on the infrastructure already available. +There are multiple solutions to this such as Hashicorp or Bitwarden, which depend heavily on the infrastructure already available. For the sake of this demo, {sealed-secrets}[Bitnami's Sealed Secrets] are utilized. Sensitive data is encrypted as a `SealedSecret` before commiting to the Git repository, synced via ArgoCD and decrypted by the Sealed Secrets controller into a standard Kubernetes `Secret`. @@ -74,7 +75,8 @@ This way, everything will be stored and managed in Git. == ArgoCD UI -ArgoCD will be the first product that is deployed in this Demo. Once the pods are ready, you can port-forward the argocd-server in order to access the web UI. +ArgoCD will be the first product that is deployed in this Demo. +Once the pods are ready, you can port-forward the argocd-server in order to access the web UI. [source,console] ---- @@ -83,7 +85,8 @@ kubectl --namespace argo-cd port-forward service/argocd-server 8443:https In your browser, go to `https://localhost:8443` and login with username `admin` and password `adminadmin`. -NOTE: There will be an initial warning from the Browser, that this site is insecure due to self-signed certificates. This can be ignored in this case. +NOTE: There will be an initial warning from the browser, stating that the site is insecure due to self-signed certificates. +This can be ignored in this case. The ArgoCD Web UI entry page shows an overview of deployed applications and their status and other metadata as the repository or the date of the last synchronization run. @@ -94,7 +97,7 @@ Single applications can be inspected closer after clicking on e.g. the `airflow` TODO: Screenshot - Argo UI - Airflow Detailed information about the cluster, the cluster status and deployed components can be accessed in the application details. -Additionally, if the Git repository and the cluster state itself differ, possible applied changes can be previewed in a code diff similar to Git pull requests. +Additionally, if the Git repository and the cluster state itself differ, these differences can be previewed in a code diff similar to Git pull requests. TODO: Screenshot - Argo UI - application details Network / List tab -> mark network tabs etc. @@ -275,9 +278,11 @@ the logs are fetched from S3 instead of the (already deleted) executor pods. The kubectl --namespace minio port-forward service/minio-console 9001:9001 ---- -Minio then is reachable via `https://localhost:9001` with username `admin` and password `adminadmin`. After the successful Airflow DAG run, logs should be stored in `demo/airflow-task-logs`. +Minio then is reachable via `https://localhost:9001` with username `admin` and password `adminadmin`. +After the successful Airflow DAG run, logs should be stored in `demo/airflow-task-logs`. -NOTE: There will be an initial warning from the Browser, that this site is insecure due to self-signed certificates. This can be ignored in this case. +NOTE: There will be an initial warning from the browser, stating that the site is insecure due to self-signed certificates. +This can be ignored in this case. TODO: Screenshot - minio UI with log data From fb74c68a2ff098a7640646b64e93ed076fb76457 Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 15:55:13 +0200 Subject: [PATCH 083/101] make tecnical parts collapsible --- docs/modules/demos/pages/argo-cd-git-ops.adoc | 105 +++++++----------- 1 file changed, 39 insertions(+), 66 deletions(-) diff --git a/docs/modules/demos/pages/argo-cd-git-ops.adoc b/docs/modules/demos/pages/argo-cd-git-ops.adoc index 99e1a66d..86c5e0d6 100644 --- a/docs/modules/demos/pages/argo-cd-git-ops.adoc +++ b/docs/modules/demos/pages/argo-cd-git-ops.adoc @@ -14,8 +14,8 @@ All products and manifests are synced and deployed via ArgoCD (except ArgoCD its The key points to show are: -* GitOps: How to deploy changes from a Git repository to my cluster? -* Secrets: How to safely store and deploy credentials, access keys from a Git repository? +* GitOps: How to deploy changes from a Git repository to a cluster? +* Secrets: How to safely store and deploy credentials or access keys from a Git repository? * Interaction with Stackable products (e.g. Airflow and DAGs via gitsync) ArgoCD and other deployed products and dependencies are illustrated in the following diagram: @@ -49,22 +49,20 @@ To run this demo, your system needs at least: This demo consists of multiple parts: -* Bootstrapping via `stackablectl`: -** Install {argo-cd}[Argo CD] via `stackablectl` +* Bootstrapping {argo-cd}[Argo CD] via `stackablectl`: * Deploy components via ArgoCD: -** Install a {sealed-secrets}[Sealed Secrets] controller to handle sensitive data like credentials or secret keys -** Install all Stackable operators using an `ApplicationSet` -** Install requirements like Minio and Postgres as `Application` -** Deploy Stackable Airflow manifests into their respective `Projects` -* Inspect ArgoCD UI -* Inspect Airflow and start DAGs -** Checkout Airflow UI and synced DAGs (the DAGs are synced via gitsync, not ArgoCD) -** Start a DAG and inspect the logs written to S3 / Minio by the Kubernetes executor -* Optional: Inspect Minio UI for logs +** Install a {sealed-secrets}[Sealed Secrets] controller to decrypt secrets stored in a Git repository +** Install all Stackable operators using an ArgoCD `ApplicationSet` +** Install the Airflow dependencies Minio and Postgres as ArgoCD `Application` +** Deploy Stackable Airflow manifests into their respective ArgoCD `Projects` +* Inspect Airflow web UI +** DAGs are synced from a Git repository +** Start a DAG and check the results +** Check Kubernetes Executor logs persisted in Minio == Sealed Secrets -When managing all resources and configs via Git, deploying sensitive properties like certificates or credentials via Git becomes a problem. +When managing all resources and configuration via Git, deploying sensitive data like certificates or credentials via Git becomes a problem. There are multiple solutions to this such as Hashicorp or Bitwarden, which depend heavily on the infrastructure already available. @@ -75,8 +73,7 @@ This way, everything will be stored and managed in Git. == ArgoCD UI -ArgoCD will be the first product that is deployed in this Demo. -Once the pods are ready, you can port-forward the argocd-server in order to access the web UI. +After bootstrapping ArgoCD via `stackablectl`, once the pods are ready, you can port-forward the argocd-server Service in order to access the web UI. [source,console] ---- @@ -88,7 +85,7 @@ In your browser, go to `https://localhost:8443` and login with username `admin` NOTE: There will be an initial warning from the browser, stating that the site is insecure due to self-signed certificates. This can be ignored in this case. -The ArgoCD Web UI entry page shows an overview of deployed applications and their status and other metadata as the repository or the date of the last synchronization run. +The ArgoCD Web UI entry page shows an overview of deployed applications, their status and other metadata as the repository or the date of the last synchronization run. TODO: Screenshot - Argo UI overview @@ -96,8 +93,8 @@ Single applications can be inspected closer after clicking on e.g. the `airflow` TODO: Screenshot - Argo UI - Airflow -Detailed information about the cluster, the cluster status and deployed components can be accessed in the application details. -Additionally, if the Git repository and the cluster state itself differ, these differences can be previewed in a code diff similar to Git pull requests. +Detailed information about the Airflow cluster, the cluster status and deployed components can be accessed in the application details. +Additionally, if the Git repository and the cluster state itself differ, these differences can be previewed in a code diff preview. TODO: Screenshot - Argo UI - application details Network / List tab -> mark network tabs etc. @@ -116,11 +113,13 @@ using different versions and Git sources (repository & branch) as well as the po NOTE: This demo does not use a multi cluster environment for the sake of simplicity. -TODO: Do the code snippets actually help? Maybe text is better... its about showing at least some parts of a multi cluster setup... +The following part is dives deeper into the definition of theStackable operator `ApplicationSet` and can be skipped. +.Stackable operators `ApplicationSet` details +[%collapsible] +==== [source,yaml] ---- ---- apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: @@ -130,7 +129,7 @@ spec: - matrix: generators: - list: - elements: + elements: # <1> - operator: commons - operator: listener - operator: secret @@ -147,7 +146,7 @@ spec: - operator: trino - operator: zookeeper - list: - elements: + elements: # <2> - cluster: demo server: https://kubernetes.default.svc targetRevision: 25.7.0 @@ -176,6 +175,8 @@ spec: # targetRevision: 25.3.0 # [...] ---- +<1> List of Stackable operators to install. +<2> List of clusters and Stackable release versions for each cluster. The `matrix.generators.list[].elements[]` will create a union of parameters that may be used in the `ApplicationSet` template as follows: @@ -186,7 +187,7 @@ template: metadata: name: "{{ operator }}-operator" spec: - project: "stackable-operators" + project: "stackable-operators" # <1> ignoreDifferences: - group: "apiextensions.k8s.io" kind: "CustomResourceDefinition" @@ -196,60 +197,32 @@ template: - .spec.versions[].additionalPrinterColumns | select(. == []) source: repoURL: "oci.stackable.tech" - targetRevision: "{{ targetRevision }}" - chart: "sdp-charts/{{ operator }}-operator" + targetRevision: "{{ targetRevision }}" # <2> + chart: "sdp-charts/{{ operator }}-operator" # <3> helm: - releaseName: "{{ operator }}-operator" + releaseName: "{{ operator }}-operator" # <4> destination: - server: "{{ server }}" - namespace: "stackable-operators" + server: "{{ server }}" # <5> + namespace: "stackable-operators" # <6> syncPolicy: syncOptions: - - CreateNamespace=true - - ServerSideApply=true - - RespectIgnoreDifferences=true - automated: - selfHeal: true - prune: true ----- - -The templated version for e.g. the parameters `operator=zookeeper`, `server=https://kubernetes.default.svc` and `targetRevision=25.7.0` will result in the following template: - -[source,yaml] ----- -# [...] -template: - metadata: - name: "zookeeper-operator" - spec: - project: "stackable-operators" - ignoreDifferences: - - group: "apiextensions.k8s.io" - kind: "CustomResourceDefinition" - jqPathExpressions: - - .spec.names.categories | select(. == []) - - .spec.names.shortNames | select(. == []) - - .spec.versions[].additionalPrinterColumns | select(. == []) - source: - repoURL: "oci.stackable.tech" - targetRevision: "25.7.0" - chart: "sdp-charts/zookeeper-operator" - helm: - releaseName: "zookeeper-operator" - destination: - server: "https://kubernetes.default.svc" - namespace: "stackable-operators" - syncPolicy: - syncOptions: - - CreateNamespace=true + - CreateNamespace=true # <7> - ServerSideApply=true - RespectIgnoreDifferences=true automated: selfHeal: true prune: true ---- +<1> The ArgoCD project name. +<2> The Stackable release version, e.g. `25.7.0` (templated from the matrix generators). +<3> The Chart name in the repository e.g. `"sdp-charts/airflow-operator"` (templated from the matrix generators). +<4> The Helm release name e.g. `airflow-operator` (templated from the matrix generators). +<5> The Kubernetes cluster, e.g. `https://kubernetes.default.svc` for this demo (templated from the matrix generators). +<6> The namespace to deploy the operators in. Will be created if `spec.syncPolicy.syncOptions[].CreateNamespace` is set to true. +<7> Automatically create missing namespaces. This allows control over which releases and versions are deployed to which cluster. +==== Now with ArgoCD deployed, the Sealed Secrets controller and Stackable operators up and running, you can inspect Airflow as the first Stackable product. From 8e781fd71d5f4c2ecf4df7624c541b379c27dc5c Mon Sep 17 00:00:00 2001 From: Malte Sander Date: Thu, 31 Jul 2025 16:54:48 +0200 Subject: [PATCH 084/101] add images, improve docs --- .../argo-cd-git-ops/airflow-dag-overview.png | Bin 0 -> 148010 bytes .../argo-cd-git-ops/airflow-dag-run-logs.png | Bin 0 -> 293125 bytes .../argo-cd-git-ops/airflow-welcome-page.png | Bin 0 -> 87123 bytes .../argo-cd-git-ops/minio-dag-run-logs.png | Bin 0 -> 172369 bytes docs/modules/demos/pages/argo-cd-git-ops.adoc | 59 +++++++++++++----- 5 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 docs/modules/demos/images/argo-cd-git-ops/airflow-dag-overview.png create mode 100644 docs/modules/demos/images/argo-cd-git-ops/airflow-dag-run-logs.png create mode 100644 docs/modules/demos/images/argo-cd-git-ops/airflow-welcome-page.png create mode 100644 docs/modules/demos/images/argo-cd-git-ops/minio-dag-run-logs.png diff --git a/docs/modules/demos/images/argo-cd-git-ops/airflow-dag-overview.png b/docs/modules/demos/images/argo-cd-git-ops/airflow-dag-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..b84c70f145aca0f90d3c9dad5fd5805cda67fbc5 GIT binary patch literal 148010 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

wO!eecu|j$ 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 BqPYM7 literal 0 HcmV?d00001 diff --git a/docs/modules/demos/images/argo-cd-git-ops/airflow-dag-run-logs.png b/docs/modules/demos/images/argo-cd-git-ops/airflow-dag-run-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..eecb9382fe08666407c46e12493565b51ee0fc45 GIT binary patch literal 293125 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 z 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

*SA}#WURa551tXU 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

85~`w1cRNyp+}iCjs{$tWy+A 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 E0D8i6DF6Tf literal 0 HcmV?d00001 diff --git a/docs/modules/demos/images/argo-cd-git-ops/airflow-welcome-page.png b/docs/modules/demos/images/argo-cd-git-ops/airflow-welcome-page.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcc1c599bde398bad053e9ae102c6b05dd874ab GIT binary patch literal 87123 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

`oCgls*S;LWcjiV(^xUp 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 literal 0 HcmV?d00001 diff --git a/docs/modules/demos/images/argo-cd-git-ops/minio-dag-run-logs.png b/docs/modules/demos/images/argo-cd-git-ops/minio-dag-run-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8de47253e5e5d6338ec12b4c0533e5400e250f GIT binary patch literal 172369 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�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