From a6fbe86a5ab87d0c71c6abd5e25c357507ec6aba Mon Sep 17 00:00:00 2001 From: Bast Date: Fri, 13 Nov 2026 12:48:00 -0600 Subject: [PATCH] ev crash backloop von hier --- clean-boday-it.sh | 11 ++ consul-tf-backup.json | 17 ++ kind_kubeconfig/config | 6 +- main.tf | 4 +- main.tf.bak | 107 ++++++++++ nginx.conf | 8 +- terraform.tfstate | 414 +++++++++++++++++++++++++++++++++++++++ terraform.tfstate.backup | 414 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 975 insertions(+), 6 deletions(-) create mode 100755 clean-boday-it.sh create mode 100644 consul-tf-backup.json create mode 100644 main.tf.bak create mode 100644 terraform.tfstate create mode 100644 terraform.tfstate.backup diff --git a/clean-boday-it.sh b/clean-boday-it.sh new file mode 100755 index 0000000..4e49658 --- /dev/null +++ b/clean-boday-it.sh @@ -0,0 +1,11 @@ +# 1. Helm's release records (what causes the "name still in use" error) +docker compose exec k3s-cluster kubectl delete secret -n default -l owner=helm,name=boday-it + +# 2. The release's resources +docker compose exec k3s-cluster kubectl delete -n default \ + deployment/boday-it-web statefulset/boday-it-db \ + svc/boday-it-web svc/boday-it-db \ + ingress/boday-it-ingress secret/boday-it-secrets + +# 3. Check: only the PVC should remain +docker compose exec k3s-cluster kubectl get all,ingress,pvc -n default | grep boday diff --git a/consul-tf-backup.json b/consul-tf-backup.json new file mode 100644 index 0000000..0a3e008 --- /dev/null +++ b/consul-tf-backup.json @@ -0,0 +1,17 @@ +[ + { + "key": "terraform/states/boday_tf", + "flags": 0, + "value": "ewogICJ2ZXJzaW9uIjogNCwKICAidGVycmFmb3JtX3ZlcnNpb24iOiAiMS43LjAiLAogICJzZXJpYWwiOiA5LAogICJsaW5lYWdlIjogIjQ5NGY2MWVhLTEyNDAtMDJjZC0zZjNmLTg0NjNhZTc0YzY5ZSIsCiAgIm91dHB1dHMiOiB7fSwKICAicmVzb3VyY2VzIjogWwogICAgewogICAgICAibW9kZSI6ICJtYW5hZ2VkIiwKICAgICAgInR5cGUiOiAiaGVsbV9yZWxlYXNlIiwKICAgICAgIm5hbWUiOiAiYm9kYXlfd2Vic2l0ZSIsCiAgICAgICJwcm92aWRlciI6ICJwcm92aWRlcltcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvaGVsbVwiXSIsCiAgICAgICJpbnN0YW5jZXMiOiBbCiAgICAgICAgewogICAgICAgICAgInNjaGVtYV92ZXJzaW9uIjogMSwKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiYXRvbWljIjogdHJ1ZSwKICAgICAgICAgICAgImNoYXJ0IjogIi4vY2hhcnRzL2JvZGF5LWl0IiwKICAgICAgICAgICAgImNsZWFudXBfb25fZmFpbCI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlX25hbWVzcGFjZSI6IGZhbHNlLAogICAgICAgICAgICAiZGVwZW5kZW5jeV91cGRhdGUiOiBmYWxzZSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgImRldmVsIjogbnVsbCwKICAgICAgICAgICAgImRpc2FibGVfY3JkX2hvb2tzIjogZmFsc2UsCiAgICAgICAgICAgICJkaXNhYmxlX29wZW5hcGlfdmFsaWRhdGlvbiI6IGZhbHNlLAogICAgICAgICAgICAiZGlzYWJsZV93ZWJob29rcyI6IGZhbHNlLAogICAgICAgICAgICAiZm9yY2VfdXBkYXRlIjogZmFsc2UsCiAgICAgICAgICAgICJpZCI6ICJib2RheS1pdCIsCiAgICAgICAgICAgICJrZXlyaW5nIjogbnVsbCwKICAgICAgICAgICAgImxpbnQiOiBmYWxzZSwKICAgICAgICAgICAgIm1hbmlmZXN0IjogbnVsbCwKICAgICAgICAgICAgIm1heF9oaXN0b3J5IjogMCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhcHBfdmVyc2lvbiI6ICIxLjAuMCIsCiAgICAgICAgICAgICAgICAiY2hhcnQiOiAiYm9kYXktaXQiLAogICAgICAgICAgICAgICAgImZpcnN0X2RlcGxveWVkIjogMTc5NDUyMTMzMiwKICAgICAgICAgICAgICAgICJsYXN0X2RlcGxveWVkIjogMTc5NDU5Mjg2NywKICAgICAgICAgICAgICAgICJuYW1lIjogImJvZGF5LWl0IiwKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiAiZGVmYXVsdCIsCiAgICAgICAgICAgICAgICAibm90ZXMiOiAiIiwKICAgICAgICAgICAgICAgICJyZXZpc2lvbiI6IDgsCiAgICAgICAgICAgICAgICAidmFsdWVzIjogIntcImltYWdlXCI6e1widGFnXCI6XCJlNDQ1MTk2ZGFlZDYyNTAwY2E3ZGIxNDE3OTgxNDc3NDk4NjI2YmM4XCJ9fSIsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJuYW1lIjogImJvZGF5LWl0IiwKICAgICAgICAgICAgIm5hbWVzcGFjZSI6ICJkZWZhdWx0IiwKICAgICAgICAgICAgInBhc3NfY3JlZGVudGlhbHMiOiBmYWxzZSwKICAgICAgICAgICAgInBvc3RyZW5kZXIiOiBbXSwKICAgICAgICAgICAgInJlY3JlYXRlX3BvZHMiOiBmYWxzZSwKICAgICAgICAgICAgInJlbmRlcl9zdWJjaGFydF9ub3RlcyI6IHRydWUsCiAgICAgICAgICAgICJyZXBsYWNlIjogZmFsc2UsCiAgICAgICAgICAgICJyZXBvc2l0b3J5IjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfY2FfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2NlcnRfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2tleV9maWxlIjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfcGFzc3dvcmQiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV91c2VybmFtZSI6IG51bGwsCiAgICAgICAgICAgICJyZXNldF92YWx1ZXMiOiBmYWxzZSwKICAgICAgICAgICAgInJldXNlX3ZhbHVlcyI6IGZhbHNlLAogICAgICAgICAgICAic2V0IjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogImltYWdlLnRhZyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICIiLAogICAgICAgICAgICAgICAgInZhbHVlIjogImU0NDUxOTZkYWVkNjI1MDBjYTdkYjE0MTc5ODE0Nzc0OTg2MjZiYzgiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAic2V0X2xpc3QiOiBbXSwKICAgICAgICAgICAgInNldF9zZW5zaXRpdmUiOiBbXSwKICAgICAgICAgICAgInNraXBfY3JkcyI6IGZhbHNlLAogICAgICAgICAgICAic3RhdHVzIjogImRlcGxveWVkIiwKICAgICAgICAgICAgInRpbWVvdXQiOiA2MDAsCiAgICAgICAgICAgICJ1cGdyYWRlX2luc3RhbGwiOiBudWxsLAogICAgICAgICAgICAidmFsdWVzIjogWwogICAgICAgICAgICAgICIjIGszcyDigJMgVGVzdHVtZ2VidW5nOiByZW5kZXJ0IGlkZW50aXNjaCB6dW0gYmlzaGVyaWdlbiBTdGFuZFxuIgogICAgICAgICAgICBdLAogICAgICAgICAgICAidmVyaWZ5IjogZmFsc2UsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgIndhaXQiOiB0cnVlLAogICAgICAgICAgICAid2FpdF9mb3Jfam9icyI6IGZhbHNlCiAgICAgICAgICB9LAogICAgICAgICAgInNlbnNpdGl2ZV9hdHRyaWJ1dGVzIjogW10sCiAgICAgICAgICAicHJpdmF0ZSI6ICJleUp6WTJobGJXRmZkbVZ5YzJsdmJpSTZJakVpZlE9PSIKICAgICAgICB9CiAgICAgIF0KICAgIH0KICBdLAogICJjaGVja19yZXN1bHRzIjogbnVsbAp9Cg==" + }, + { + "key": "terraform/states/boday_tf_prod", + "flags": 0, + "value": "ewogICJ2ZXJzaW9uIjogNCwKICAidGVycmFmb3JtX3ZlcnNpb24iOiAiMS43LjAiLAogICJzZXJpYWwiOiA3LAogICJsaW5lYWdlIjogIjkyM2YwOTQzLTE2YmYtNGQ3MC0wZWQxLWNjYTBlMTNhM2Q1MiIsCiAgIm91dHB1dHMiOiB7fSwKICAicmVzb3VyY2VzIjogWwogICAgewogICAgICAibW9kZSI6ICJtYW5hZ2VkIiwKICAgICAgInR5cGUiOiAiaGVsbV9yZWxlYXNlIiwKICAgICAgIm5hbWUiOiAiYm9kYXlfd2Vic2l0ZSIsCiAgICAgICJwcm92aWRlciI6ICJwcm92aWRlcltcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvaGVsbVwiXSIsCiAgICAgICJpbnN0YW5jZXMiOiBbCiAgICAgICAgewogICAgICAgICAgInNjaGVtYV92ZXJzaW9uIjogMSwKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiYXRvbWljIjogdHJ1ZSwKICAgICAgICAgICAgImNoYXJ0IjogIi4vY2hhcnRzL2JvZGF5LWl0IiwKICAgICAgICAgICAgImNsZWFudXBfb25fZmFpbCI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlX25hbWVzcGFjZSI6IHRydWUsCiAgICAgICAgICAgICJkZXBlbmRlbmN5X3VwZGF0ZSI6IGZhbHNlLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiBudWxsLAogICAgICAgICAgICAiZGV2ZWwiOiBudWxsLAogICAgICAgICAgICAiZGlzYWJsZV9jcmRfaG9va3MiOiBmYWxzZSwKICAgICAgICAgICAgImRpc2FibGVfb3BlbmFwaV92YWxpZGF0aW9uIjogZmFsc2UsCiAgICAgICAgICAgICJkaXNhYmxlX3dlYmhvb2tzIjogZmFsc2UsCiAgICAgICAgICAgICJmb3JjZV91cGRhdGUiOiBmYWxzZSwKICAgICAgICAgICAgImlkIjogImJvZGF5LWl0IiwKICAgICAgICAgICAgImtleXJpbmciOiBudWxsLAogICAgICAgICAgICAibGludCI6IGZhbHNlLAogICAgICAgICAgICAibWFuaWZlc3QiOiBudWxsLAogICAgICAgICAgICAibWF4X2hpc3RvcnkiOiAwLAogICAgICAgICAgICAibWV0YWRhdGEiOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImFwcF92ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgICAgICJjaGFydCI6ICJib2RheS1pdCIsCiAgICAgICAgICAgICAgICAiZmlyc3RfZGVwbG95ZWQiOiAxNzk0NTIzMjc0LAogICAgICAgICAgICAgICAgImxhc3RfZGVwbG95ZWQiOiAxNzk0NTkyOTA5LAogICAgICAgICAgICAgICAgIm5hbWUiOiAiYm9kYXktaXQiLAogICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6ICJib2RheS1pdCIsCiAgICAgICAgICAgICAgICAibm90ZXMiOiAiIiwKICAgICAgICAgICAgICAgICJyZXZpc2lvbiI6IDYsCiAgICAgICAgICAgICAgICAidmFsdWVzIjogIntcImltYWdlXCI6e1widGFnXCI6XCJlNDQ1MTk2ZGFlZDYyNTAwY2E3ZGIxNDE3OTgxNDc3NDk4NjI2YmM4XCJ9LFwiaW5ncmVzc1wiOntcImFubm90YXRpb25zXCI6e1wiY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyXCI6XCJsZXRzZW5jcnlwdC1wcm9kXCIsXCJrdWJlcm5ldGVzLmlvL2luZ3Jlc3MuY2xhc3NcIjpudWxsfSxcImNsYXNzTmFtZVwiOlwidHJhZWZpa1wiLFwidGxzXCI6e1wiZW5hYmxlZFwiOnRydWUsXCJzZWNyZXROYW1lXCI6XCJib2RheS1pdC10bHNcIn19LFwicG9zdGdyZXNcIjp7XCJwZ2RhdGFTdWJkaXJcIjp0cnVlLFwic3RvcmFnZUNsYXNzTmFtZVwiOlwibG9uZ2hvcm5cIixcInN0b3JhZ2VTaXplXCI6XCI1R2lcIn19IiwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm5hbWUiOiAiYm9kYXktaXQiLAogICAgICAgICAgICAibmFtZXNwYWNlIjogImJvZGF5LWl0IiwKICAgICAgICAgICAgInBhc3NfY3JlZGVudGlhbHMiOiBmYWxzZSwKICAgICAgICAgICAgInBvc3RyZW5kZXIiOiBbXSwKICAgICAgICAgICAgInJlY3JlYXRlX3BvZHMiOiBmYWxzZSwKICAgICAgICAgICAgInJlbmRlcl9zdWJjaGFydF9ub3RlcyI6IHRydWUsCiAgICAgICAgICAgICJyZXBsYWNlIjogZmFsc2UsCiAgICAgICAgICAgICJyZXBvc2l0b3J5IjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfY2FfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2NlcnRfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2tleV9maWxlIjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfcGFzc3dvcmQiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV91c2VybmFtZSI6IG51bGwsCiAgICAgICAgICAgICJyZXNldF92YWx1ZXMiOiBmYWxzZSwKICAgICAgICAgICAgInJldXNlX3ZhbHVlcyI6IGZhbHNlLAogICAgICAgICAgICAic2V0IjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogImltYWdlLnRhZyIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICIiLAogICAgICAgICAgICAgICAgInZhbHVlIjogImU0NDUxOTZkYWVkNjI1MDBjYTdkYjE0MTc5ODE0Nzc0OTg2MjZiYzgiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAic2V0X2xpc3QiOiBbXSwKICAgICAgICAgICAgInNldF9zZW5zaXRpdmUiOiBbXSwKICAgICAgICAgICAgInNraXBfY3JkcyI6IGZhbHNlLAogICAgICAgICAgICAic3RhdHVzIjogImRlcGxveWVkIiwKICAgICAgICAgICAgInRpbWVvdXQiOiA2MDAsCiAgICAgICAgICAgICJ1cGdyYWRlX2luc3RhbGwiOiBudWxsLAogICAgICAgICAgICAidmFsdWVzIjogWwogICAgICAgICAgICAgICIjIFRhbG9zIOKAkyBQcm9kdWt0aW9uXG5wb3N0Z3JlczpcbiAgc3RvcmFnZVNpemU6IDVHaVxuICBzdG9yYWdlQ2xhc3NOYW1lOiBsb25naG9yblxuICBwZ2RhdGFTdWJkaXI6IHRydWVcblxuaW5ncmVzczpcbiAgY2xhc3NOYW1lOiB0cmFlZmlrXG4gIGFubm90YXRpb25zOlxuICAgIGt1YmVybmV0ZXMuaW8vaW5ncmVzcy5jbGFzczogbnVsbCAgICMgYWx0ZSBBbm5vdGF0aW9uIGVudGZlcm5lblxuICAgICMgY2VydC1tYW5hZ2VyIGhvbHQgZGFzIFplcnRpZmlrYXQgZsO8ciBhbGxlIGhvc3RzIGF1dG9tYXRpc2NoIChIVFRQLTAxIMO8YmVyIFBvcnQgODApXG4gICAgY2VydC1tYW5hZ2VyLmlvL2NsdXN0ZXItaXNzdWVyOiBsZXRzZW5jcnlwdC1wcm9kXG4gIHRsczpcbiAgICBlbmFibGVkOiB0cnVlXG4gICAgc2VjcmV0TmFtZTogYm9kYXktaXQtdGxzXG4iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJ2ZXJpZnkiOiBmYWxzZSwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAogICAgICAgICAgICAid2FpdCI6IHRydWUsCiAgICAgICAgICAgICJ3YWl0X2Zvcl9qb2JzIjogZmFsc2UKICAgICAgICAgIH0sCiAgICAgICAgICAic2Vuc2l0aXZlX2F0dHJpYnV0ZXMiOiBbXSwKICAgICAgICAgICJwcml2YXRlIjogImV5SnpZMmhsYldGZmRtVnljMmx2YmlJNklqRWlmUT09IgogICAgICAgIH0KICAgICAgXQogICAgfQogIF0sCiAgImNoZWNrX3Jlc3VsdHMiOiBudWxsCn0K" + }, + { + "key": "terraform/states/talos_platform", + "flags": 0, + "value": "ewogICJ2ZXJzaW9uIjogNCwKICAidGVycmFmb3JtX3ZlcnNpb24iOiAiMS43LjAiLAogICJzZXJpYWwiOiAzLAogICJsaW5lYWdlIjogImY5M2VjZWJlLTI1YzEtOTZkZC04MDk0LTc2MDRmZDEyNDk3NiIsCiAgIm91dHB1dHMiOiB7CiAgICAidHJhZWZpa19sYl9pcCI6IHsKICAgICAgInZhbHVlIjogIjE3Mi4yNS42NC4yMDAiLAogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9CiAgfSwKICAicmVzb3VyY2VzIjogWwogICAgewogICAgICAibW9kZSI6ICJtYW5hZ2VkIiwKICAgICAgInR5cGUiOiAiaGVsbV9yZWxlYXNlIiwKICAgICAgIm5hbWUiOiAiY2VydF9tYW5hZ2VyIiwKICAgICAgInByb3ZpZGVyIjogInByb3ZpZGVyW1wicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9oZWxtXCJdIiwKICAgICAgImluc3RhbmNlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAic2NoZW1hX3ZlcnNpb24iOiAxLAogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJhdG9taWMiOiB0cnVlLAogICAgICAgICAgICAiY2hhcnQiOiAiY2VydC1tYW5hZ2VyIiwKICAgICAgICAgICAgImNsZWFudXBfb25fZmFpbCI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlX25hbWVzcGFjZSI6IHRydWUsCiAgICAgICAgICAgICJkZXBlbmRlbmN5X3VwZGF0ZSI6IGZhbHNlLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiBudWxsLAogICAgICAgICAgICAiZGV2ZWwiOiBudWxsLAogICAgICAgICAgICAiZGlzYWJsZV9jcmRfaG9va3MiOiBmYWxzZSwKICAgICAgICAgICAgImRpc2FibGVfb3BlbmFwaV92YWxpZGF0aW9uIjogZmFsc2UsCiAgICAgICAgICAgICJkaXNhYmxlX3dlYmhvb2tzIjogZmFsc2UsCiAgICAgICAgICAgICJmb3JjZV91cGRhdGUiOiBmYWxzZSwKICAgICAgICAgICAgImlkIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICJrZXlyaW5nIjogbnVsbCwKICAgICAgICAgICAgImxpbnQiOiBmYWxzZSwKICAgICAgICAgICAgIm1hbmlmZXN0IjogbnVsbCwKICAgICAgICAgICAgIm1heF9oaXN0b3J5IjogMCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhcHBfdmVyc2lvbiI6ICJ2MS4yMS4wIiwKICAgICAgICAgICAgICAgICJjaGFydCI6ICJjZXJ0LW1hbmFnZXIiLAogICAgICAgICAgICAgICAgImZpcnN0X2RlcGxveWVkIjogMTc5NDU4NDgxMSwKICAgICAgICAgICAgICAgICJsYXN0X2RlcGxveWVkIjogMTc5NDU4NDgxMSwKICAgICAgICAgICAgICAgICJuYW1lIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICAgICAibm90ZXMiOiAiXG5jZXJ0LW1hbmFnZXIgdjEuMjEuMCBoYXMgYmVlbiBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXG5cbkluIG9yZGVyIHRvIGJlZ2luIGlzc3VpbmcgY2VydGlmaWNhdGVzLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCB1cCBhIENsdXN0ZXJJc3N1ZXJcbm9yIElzc3VlciByZXNvdXJjZSAoZm9yIGV4YW1wbGUsIGJ5IGNyZWF0aW5nIGEgJ2xldHNlbmNyeXB0LXN0YWdpbmcnIGlzc3VlcikuXG5cbk1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBpc3N1ZXJzIGFuZCBob3cgdG8gY29uZmlndXJlIHRoZW1cbmNhbiBiZSBmb3VuZCBpbiBvdXIgZG9jdW1lbnRhdGlvbjpcblxuaHR0cHM6Ly9jZXJ0LW1hbmFnZXIuaW8vZG9jcy9jb25maWd1cmF0aW9uL1xuXG5Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSBjZXJ0LW1hbmFnZXIgdG8gYXV0b21hdGljYWxseSBwcm92aXNpb25cbkNlcnRpZmljYXRlcyBmb3IgSW5ncmVzcyByZXNvdXJjZXMsIHRha2UgYSBsb29rIGF0IHRoZSBgaW5ncmVzcy1zaGltYFxuZG9jdW1lbnRhdGlvbjpcblxuaHR0cHM6Ly9jZXJ0LW1hbmFnZXIuaW8vZG9jcy91c2FnZS9pbmdyZXNzL1xuXG5Gb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSBjZXJ0LW1hbmFnZXIgdG8gYXV0b21hdGljYWxseSBwcm92aXNpb25cbkNlcnRpZmljYXRlcyBmb3IgR2F0ZXdheSBBUEkgcmVzb3VyY2VzLCB0YWtlIGEgbG9vayBhdCB0aGUgYGdhdGV3YXkgcmVzb3VyY2VgXG5kb2N1bWVudGF0aW9uOlxuXG5odHRwczovL2NlcnQtbWFuYWdlci5pby9kb2NzL3VzYWdlL2dhdGV3YXkvXG4iLAogICAgICAgICAgICAgICAgInJldmlzaW9uIjogMSwKICAgICAgICAgICAgICAgICJ2YWx1ZXMiOiAie1wiY3Jkc1wiOntcImVuYWJsZWRcIjp0cnVlfX0iLAogICAgICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMjEuMCIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJuYW1lIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICJuYW1lc3BhY2UiOiAiY2VydC1tYW5hZ2VyIiwKICAgICAgICAgICAgInBhc3NfY3JlZGVudGlhbHMiOiBmYWxzZSwKICAgICAgICAgICAgInBvc3RyZW5kZXIiOiBbXSwKICAgICAgICAgICAgInJlY3JlYXRlX3BvZHMiOiBmYWxzZSwKICAgICAgICAgICAgInJlbmRlcl9zdWJjaGFydF9ub3RlcyI6IHRydWUsCiAgICAgICAgICAgICJyZXBsYWNlIjogZmFsc2UsCiAgICAgICAgICAgICJyZXBvc2l0b3J5IjogImh0dHBzOi8vY2hhcnRzLmpldHN0YWNrLmlvIiwKICAgICAgICAgICAgInJlcG9zaXRvcnlfY2FfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2NlcnRfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2tleV9maWxlIjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfcGFzc3dvcmQiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV91c2VybmFtZSI6IG51bGwsCiAgICAgICAgICAgICJyZXNldF92YWx1ZXMiOiBmYWxzZSwKICAgICAgICAgICAgInJldXNlX3ZhbHVlcyI6IGZhbHNlLAogICAgICAgICAgICAic2V0IjogW10sCiAgICAgICAgICAgICJzZXRfbGlzdCI6IFtdLAogICAgICAgICAgICAic2V0X3NlbnNpdGl2ZSI6IFtdLAogICAgICAgICAgICAic2tpcF9jcmRzIjogZmFsc2UsCiAgICAgICAgICAgICJzdGF0dXMiOiAiZGVwbG95ZWQiLAogICAgICAgICAgICAidGltZW91dCI6IDYwMCwKICAgICAgICAgICAgInVwZ3JhZGVfaW5zdGFsbCI6IG51bGwsCiAgICAgICAgICAgICJ2YWx1ZXMiOiBbCiAgICAgICAgICAgICAgIlwiY3Jkc1wiOlxuICBcImVuYWJsZWRcIjogdHJ1ZVxuIgogICAgICAgICAgICBdLAogICAgICAgICAgICAidmVyaWZ5IjogZmFsc2UsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjIxLjAiLAogICAgICAgICAgICAid2FpdCI6IHRydWUsCiAgICAgICAgICAgICJ3YWl0X2Zvcl9qb2JzIjogZmFsc2UKICAgICAgICAgIH0sCiAgICAgICAgICAic2Vuc2l0aXZlX2F0dHJpYnV0ZXMiOiBbXSwKICAgICAgICAgICJwcml2YXRlIjogImV5SnpZMmhsYldGZmRtVnljMmx2YmlJNklqRWlmUT09IgogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgIm1vZGUiOiAibWFuYWdlZCIsCiAgICAgICJ0eXBlIjogImhlbG1fcmVsZWFzZSIsCiAgICAgICJuYW1lIjogImNsdXN0ZXJfaXNzdWVyIiwKICAgICAgInByb3ZpZGVyIjogInByb3ZpZGVyW1wicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9oZWxtXCJdIiwKICAgICAgImluc3RhbmNlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAic2NoZW1hX3ZlcnNpb24iOiAxLAogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJhdG9taWMiOiBmYWxzZSwKICAgICAgICAgICAgImNoYXJ0IjogIi4vY2hhcnRzL2NsdXN0ZXItaXNzdWVyIiwKICAgICAgICAgICAgImNsZWFudXBfb25fZmFpbCI6IGZhbHNlLAogICAgICAgICAgICAiY3JlYXRlX25hbWVzcGFjZSI6IGZhbHNlLAogICAgICAgICAgICAiZGVwZW5kZW5jeV91cGRhdGUiOiBmYWxzZSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogbnVsbCwKICAgICAgICAgICAgImRldmVsIjogbnVsbCwKICAgICAgICAgICAgImRpc2FibGVfY3JkX2hvb2tzIjogZmFsc2UsCiAgICAgICAgICAgICJkaXNhYmxlX29wZW5hcGlfdmFsaWRhdGlvbiI6IGZhbHNlLAogICAgICAgICAgICAiZGlzYWJsZV93ZWJob29rcyI6IGZhbHNlLAogICAgICAgICAgICAiZm9yY2VfdXBkYXRlIjogZmFsc2UsCiAgICAgICAgICAgICJpZCI6ICJjbHVzdGVyLWlzc3VlciIsCiAgICAgICAgICAgICJrZXlyaW5nIjogbnVsbCwKICAgICAgICAgICAgImxpbnQiOiBmYWxzZSwKICAgICAgICAgICAgIm1hbmlmZXN0IjogbnVsbCwKICAgICAgICAgICAgIm1heF9oaXN0b3J5IjogMCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhcHBfdmVyc2lvbiI6ICIiLAogICAgICAgICAgICAgICAgImNoYXJ0IjogImNsdXN0ZXItaXNzdWVyIiwKICAgICAgICAgICAgICAgICJmaXJzdF9kZXBsb3llZCI6IDE3OTQ1ODQ4ODksCiAgICAgICAgICAgICAgICAibGFzdF9kZXBsb3llZCI6IDE3OTQ1ODQ4ODksCiAgICAgICAgICAgICAgICAibmFtZSI6ICJjbHVzdGVyLWlzc3VlciIsCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICAgICAibm90ZXMiOiAiIiwKICAgICAgICAgICAgICAgICJyZXZpc2lvbiI6IDEsCiAgICAgICAgICAgICAgICAidmFsdWVzIjogIntcImVtYWlsXCI6XCJpbmZvQGJvZGF5LWl0LmNoXCJ9IiwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm5hbWUiOiAiY2x1c3Rlci1pc3N1ZXIiLAogICAgICAgICAgICAibmFtZXNwYWNlIjogImNlcnQtbWFuYWdlciIsCiAgICAgICAgICAgICJwYXNzX2NyZWRlbnRpYWxzIjogZmFsc2UsCiAgICAgICAgICAgICJwb3N0cmVuZGVyIjogW10sCiAgICAgICAgICAgICJyZWNyZWF0ZV9wb2RzIjogZmFsc2UsCiAgICAgICAgICAgICJyZW5kZXJfc3ViY2hhcnRfbm90ZXMiOiB0cnVlLAogICAgICAgICAgICAicmVwbGFjZSI6IGZhbHNlLAogICAgICAgICAgICAicmVwb3NpdG9yeSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2NhX2ZpbGUiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV9jZXJ0X2ZpbGUiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV9rZXlfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X3Bhc3N3b3JkIjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfdXNlcm5hbWUiOiBudWxsLAogICAgICAgICAgICAicmVzZXRfdmFsdWVzIjogZmFsc2UsCiAgICAgICAgICAgICJyZXVzZV92YWx1ZXMiOiBmYWxzZSwKICAgICAgICAgICAgInNldCI6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJlbWFpbCIsCiAgICAgICAgICAgICAgICAidHlwZSI6ICIiLAogICAgICAgICAgICAgICAgInZhbHVlIjogImluZm9AYm9kYXktaXQuY2giCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAic2V0X2xpc3QiOiBbXSwKICAgICAgICAgICAgInNldF9zZW5zaXRpdmUiOiBbXSwKICAgICAgICAgICAgInNraXBfY3JkcyI6IGZhbHNlLAogICAgICAgICAgICAic3RhdHVzIjogImRlcGxveWVkIiwKICAgICAgICAgICAgInRpbWVvdXQiOiAzMDAsCiAgICAgICAgICAgICJ1cGdyYWRlX2luc3RhbGwiOiBudWxsLAogICAgICAgICAgICAidmFsdWVzIjogbnVsbCwKICAgICAgICAgICAgInZlcmlmeSI6IGZhbHNlLAogICAgICAgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCiAgICAgICAgICAgICJ3YWl0IjogdHJ1ZSwKICAgICAgICAgICAgIndhaXRfZm9yX2pvYnMiOiBmYWxzZQogICAgICAgICAgfSwKICAgICAgICAgICJzZW5zaXRpdmVfYXR0cmlidXRlcyI6IFtdLAogICAgICAgICAgInByaXZhdGUiOiAiZXlKelkyaGxiV0ZmZG1WeWMybHZiaUk2SWpFaWZRPT0iLAogICAgICAgICAgImRlcGVuZGVuY2llcyI6IFsKICAgICAgICAgICAgImhlbG1fcmVsZWFzZS5jZXJ0X21hbmFnZXIiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICBdCiAgICB9LAogICAgewogICAgICAibW9kZSI6ICJtYW5hZ2VkIiwKICAgICAgInR5cGUiOiAiaGVsbV9yZWxlYXNlIiwKICAgICAgIm5hbWUiOiAidHJhZWZpayIsCiAgICAgICJwcm92aWRlciI6ICJwcm92aWRlcltcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvaGVsbVwiXSIsCiAgICAgICJpbnN0YW5jZXMiOiBbCiAgICAgICAgewogICAgICAgICAgInNjaGVtYV92ZXJzaW9uIjogMSwKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiYXRvbWljIjogdHJ1ZSwKICAgICAgICAgICAgImNoYXJ0IjogInRyYWVmaWsiLAogICAgICAgICAgICAiY2xlYW51cF9vbl9mYWlsIjogZmFsc2UsCiAgICAgICAgICAgICJjcmVhdGVfbmFtZXNwYWNlIjogZmFsc2UsCiAgICAgICAgICAgICJkZXBlbmRlbmN5X3VwZGF0ZSI6IGZhbHNlLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5zdGFsbCBjb21wbGV0ZSIsCiAgICAgICAgICAgICJkZXZlbCI6IG51bGwsCiAgICAgICAgICAgICJkaXNhYmxlX2NyZF9ob29rcyI6IGZhbHNlLAogICAgICAgICAgICAiZGlzYWJsZV9vcGVuYXBpX3ZhbGlkYXRpb24iOiBmYWxzZSwKICAgICAgICAgICAgImRpc2FibGVfd2ViaG9va3MiOiBmYWxzZSwKICAgICAgICAgICAgImZvcmNlX3VwZGF0ZSI6IGZhbHNlLAogICAgICAgICAgICAiaWQiOiAidHJhZWZpayIsCiAgICAgICAgICAgICJrZXlyaW5nIjogbnVsbCwKICAgICAgICAgICAgImxpbnQiOiBmYWxzZSwKICAgICAgICAgICAgIm1hbmlmZXN0IjogbnVsbCwKICAgICAgICAgICAgIm1heF9oaXN0b3J5IjogMCwKICAgICAgICAgICAgIm1ldGFkYXRhIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhcHBfdmVyc2lvbiI6ICJ2My43LjE3IiwKICAgICAgICAgICAgICAgICJjaGFydCI6ICJ0cmFlZmlrIiwKICAgICAgICAgICAgICAgICJmaXJzdF9kZXBsb3llZCI6IDE3OTQyMDgwOTksCiAgICAgICAgICAgICAgICAibGFzdF9kZXBsb3llZCI6IDE3OTQ1OTM5MzksCiAgICAgICAgICAgICAgICAibmFtZSI6ICJ0cmFlZmlrIiwKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiAidHJhZWZpayIsCiAgICAgICAgICAgICAgICAibm90ZXMiOiAiXG5cbnRyYWVmaWsgd2l0aCBkb2NrZXIuaW8vdHJhZWZpazp2My43LjE3IGhhcyBiZWVuIGRlcGxveWVkIHN1Y2Nlc3NmdWxseSBvbiB0cmFlZmlrIG5hbWVzcGFjZSFcbiIsCiAgICAgICAgICAgICAgICAicmV2aXNpb24iOiAyLAogICAgICAgICAgICAgICAgInZhbHVlcyI6ICJ7XCJkZXBsb3ltZW50XCI6e1wicmVwbGljYXNcIjoyfSxcImV4dHJhT2JqZWN0c1wiOlt7XCJhcGlWZXJzaW9uXCI6XCJ2MVwiLFwia2luZFwiOlwiU2VjcmV0XCIsXCJtZXRhZGF0YVwiOntcIm5hbWVcIjpcImxvbmdob3JuLWJhc2ljLWF1dGhcIixcIm5hbWVzcGFjZVwiOlwibG9uZ2hvcm4tc3lzdGVtXCJ9LFwic3RyaW5nRGF0YVwiOntcInVzZXJzXCI6XCJhZG1pbjokMnkkMDUkbi9WN2tRRWJxdDkxRXhiSFRwZnoxLlBzS1BBcUZLNnEzY09reEtpWC91cHVPRTNTaktvblNcIn0sXCJ0eXBlXCI6XCJPcGFxdWVcIn0se1wiYXBpVmVyc2lvblwiOlwidHJhZWZpay5pby92MWFscGhhMVwiLFwia2luZFwiOlwiTWlkZGxld2FyZVwiLFwibWV0YWRhdGFcIjp7XCJuYW1lXCI6XCJsb25naG9ybi1hdXRoXCIsXCJuYW1lc3BhY2VcIjpcImxvbmdob3JuLXN5c3RlbVwifSxcInNwZWNcIjp7XCJiYXNpY0F1dGhcIjp7XCJzZWNyZXRcIjpcImxvbmdob3JuLWJhc2ljLWF1dGhcIn19fSx7XCJhcGlWZXJzaW9uXCI6XCJuZXR3b3JraW5nLms4cy5pby92MVwiLFwia2luZFwiOlwiSW5ncmVzc1wiLFwibWV0YWRhdGFcIjp7XCJhbm5vdGF0aW9uc1wiOntcInRyYWVmaWsuaW5ncmVzcy5rdWJlcm5ldGVzLmlvL3JvdXRlci5taWRkbGV3YXJlc1wiOlwibG9uZ2hvcm4tc3lzdGVtLWxvbmdob3JuLWF1dGhAa3ViZXJuZXRlc2NyZFwifSxcIm5hbWVcIjpcImxvbmdob3JuXCIsXCJuYW1lc3BhY2VcIjpcImxvbmdob3JuLXN5c3RlbVwifSxcInNwZWNcIjp7XCJpbmdyZXNzQ2xhc3NOYW1lXCI6XCJ0cmFlZmlrXCIsXCJydWxlc1wiOlt7XCJob3N0XCI6XCJsb25naG9ybi5ib2RheS1pdC5jaFwiLFwiaHR0cFwiOntcInBhdGhzXCI6W3tcImJhY2tlbmRcIjp7XCJzZXJ2aWNlXCI6e1wibmFtZVwiOlwibG9uZ2hvcm4tZnJvbnRlbmRcIixcInBvcnRcIjp7XCJudW1iZXJcIjo4MH19fSxcInBhdGhcIjpcIi9cIixcInBhdGhUeXBlXCI6XCJQcmVmaXhcIn1dfX1dfX1dLFwiaW5ncmVzc0NsYXNzXCI6e1wiZW5hYmxlZFwiOnRydWUsXCJpc0RlZmF1bHRDbGFzc1wiOnRydWUsXCJuYW1lXCI6XCJ0cmFlZmlrXCJ9LFwicHJvdmlkZXJzXCI6e1wia3ViZXJuZXRlc0NSRFwiOntcImVuYWJsZWRcIjp0cnVlfSxcImt1YmVybmV0ZXNJbmdyZXNzXCI6e1wiZW5hYmxlZFwiOnRydWV9fSxcInNlcnZpY2VcIjp7XCJhbm5vdGF0aW9uc1wiOntcIm1ldGFsbGIuaW8vbG9hZEJhbGFuY2VySVBzXCI6XCIxNzIuMjUuNjQuMjAwXCJ9LFwic3BlY1wiOntcImV4dGVybmFsVHJhZmZpY1BvbGljeVwiOlwiTG9jYWxcIn0sXCJ0eXBlXCI6XCJMb2FkQmFsYW5jZXJcIn0sXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6W3tcImxhYmVsU2VsZWN0b3JcIjp7XCJtYXRjaExhYmVsc1wiOntcImFwcC5rdWJlcm5ldGVzLmlvL2luc3RhbmNlXCI6XCJ0cmFlZmlrLXRyYWVmaWtcIixcImFwcC5rdWJlcm5ldGVzLmlvL25hbWVcIjpcInRyYWVmaWtcIn19LFwibWF4U2tld1wiOjEsXCJ0b3BvbG9neUtleVwiOlwia3ViZXJuZXRlcy5pby9ob3N0bmFtZVwiLFwid2hlblVuc2F0aXNmaWFibGVcIjpcIlNjaGVkdWxlQW55d2F5XCJ9XX0iLAogICAgICAgICAgICAgICAgInZlcnNpb24iOiAiNDIuMy4wIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm5hbWUiOiAidHJhZWZpayIsCiAgICAgICAgICAgICJuYW1lc3BhY2UiOiAidHJhZWZpayIsCiAgICAgICAgICAgICJwYXNzX2NyZWRlbnRpYWxzIjogZmFsc2UsCiAgICAgICAgICAgICJwb3N0cmVuZGVyIjogW10sCiAgICAgICAgICAgICJyZWNyZWF0ZV9wb2RzIjogZmFsc2UsCiAgICAgICAgICAgICJyZW5kZXJfc3ViY2hhcnRfbm90ZXMiOiB0cnVlLAogICAgICAgICAgICAicmVwbGFjZSI6IGZhbHNlLAogICAgICAgICAgICAicmVwb3NpdG9yeSI6ICJodHRwczovL3RyYWVmaWsuZ2l0aHViLmlvL2NoYXJ0cyIsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X2NhX2ZpbGUiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV9jZXJ0X2ZpbGUiOiBudWxsLAogICAgICAgICAgICAicmVwb3NpdG9yeV9rZXlfZmlsZSI6IG51bGwsCiAgICAgICAgICAgICJyZXBvc2l0b3J5X3Bhc3N3b3JkIjogbnVsbCwKICAgICAgICAgICAgInJlcG9zaXRvcnlfdXNlcm5hbWUiOiBudWxsLAogICAgICAgICAgICAicmVzZXRfdmFsdWVzIjogZmFsc2UsCiAgICAgICAgICAgICJyZXVzZV92YWx1ZXMiOiBmYWxzZSwKICAgICAgICAgICAgInNldCI6IFtdLAogICAgICAgICAgICAic2V0X2xpc3QiOiBbXSwKICAgICAgICAgICAgInNldF9zZW5zaXRpdmUiOiBbXSwKICAgICAgICAgICAgInNraXBfY3JkcyI6IGZhbHNlLAogICAgICAgICAgICAic3RhdHVzIjogImRlcGxveWVkIiwKICAgICAgICAgICAgInRpbWVvdXQiOiA2MDAsCiAgICAgICAgICAgICJ1cGdyYWRlX2luc3RhbGwiOiBudWxsLAogICAgICAgICAgICAidmFsdWVzIjogWwogICAgICAgICAgICAgICJcImRlcGxveW1lbnRcIjpcbiAgXCJyZXBsaWNhc1wiOiAyXG5cImV4dHJhT2JqZWN0c1wiOlxuLSBcImFwaVZlcnNpb25cIjogXCJ2MVwiXG4gIFwia2luZFwiOiBcIlNlY3JldFwiXG4gIFwibWV0YWRhdGFcIjpcbiAgICBcIm5hbWVcIjogXCJsb25naG9ybi1iYXNpYy1hdXRoXCJcbiAgICBcIm5hbWVzcGFjZVwiOiBcImxvbmdob3JuLXN5c3RlbVwiXG4gIFwic3RyaW5nRGF0YVwiOlxuICAgIFwidXNlcnNcIjogXCJhZG1pbjokMnkkMDUkbi9WN2tRRWJxdDkxRXhiSFRwZnoxLlBzS1BBcUZLNnEzY09reEtpWC91cHVPRTNTaktvblNcIlxuICBcInR5cGVcIjogXCJPcGFxdWVcIlxuLSBcImFwaVZlcnNpb25cIjogXCJ0cmFlZmlrLmlvL3YxYWxwaGExXCJcbiAgXCJraW5kXCI6IFwiTWlkZGxld2FyZVwiXG4gIFwibWV0YWRhdGFcIjpcbiAgICBcIm5hbWVcIjogXCJsb25naG9ybi1hdXRoXCJcbiAgICBcIm5hbWVzcGFjZVwiOiBcImxvbmdob3JuLXN5c3RlbVwiXG4gIFwic3BlY1wiOlxuICAgIFwiYmFzaWNBdXRoXCI6XG4gICAgICBcInNlY3JldFwiOiBcImxvbmdob3JuLWJhc2ljLWF1dGhcIlxuLSBcImFwaVZlcnNpb25cIjogXCJuZXR3b3JraW5nLms4cy5pby92MVwiXG4gIFwia2luZFwiOiBcIkluZ3Jlc3NcIlxuICBcIm1ldGFkYXRhXCI6XG4gICAgXCJhbm5vdGF0aW9uc1wiOlxuICAgICAgXCJ0cmFlZmlrLmluZ3Jlc3Mua3ViZXJuZXRlcy5pby9yb3V0ZXIubWlkZGxld2FyZXNcIjogXCJsb25naG9ybi1zeXN0ZW0tbG9uZ2hvcm4tYXV0aEBrdWJlcm5ldGVzY3JkXCJcbiAgICBcIm5hbWVcIjogXCJsb25naG9yblwiXG4gICAgXCJuYW1lc3BhY2VcIjogXCJsb25naG9ybi1zeXN0ZW1cIlxuICBcInNwZWNcIjpcbiAgICBcImluZ3Jlc3NDbGFzc05hbWVcIjogXCJ0cmFlZmlrXCJcbiAgICBcInJ1bGVzXCI6XG4gICAgLSBcImhvc3RcIjogXCJsb25naG9ybi5ib2RheS1pdC5jaFwiXG4gICAgICBcImh0dHBcIjpcbiAgICAgICAgXCJwYXRoc1wiOlxuICAgICAgICAtIFwiYmFja2VuZFwiOlxuICAgICAgICAgICAgXCJzZXJ2aWNlXCI6XG4gICAgICAgICAgICAgIFwibmFtZVwiOiBcImxvbmdob3JuLWZyb250ZW5kXCJcbiAgICAgICAgICAgICAgXCJwb3J0XCI6XG4gICAgICAgICAgICAgICAgXCJudW1iZXJcIjogODBcbiAgICAgICAgICBcInBhdGhcIjogXCIvXCJcbiAgICAgICAgICBcInBhdGhUeXBlXCI6IFwiUHJlZml4XCJcblwiaW5ncmVzc0NsYXNzXCI6XG4gIFwiZW5hYmxlZFwiOiB0cnVlXG4gIFwiaXNEZWZhdWx0Q2xhc3NcIjogdHJ1ZVxuICBcIm5hbWVcIjogXCJ0cmFlZmlrXCJcblwicHJvdmlkZXJzXCI6XG4gIFwia3ViZXJuZXRlc0NSRFwiOlxuICAgIFwiZW5hYmxlZFwiOiB0cnVlXG4gIFwia3ViZXJuZXRlc0luZ3Jlc3NcIjpcbiAgICBcImVuYWJsZWRcIjogdHJ1ZVxuXCJzZXJ2aWNlXCI6XG4gIFwiYW5ub3RhdGlvbnNcIjpcbiAgICBcIm1ldGFsbGIuaW8vbG9hZEJhbGFuY2VySVBzXCI6IFwiMTcyLjI1LjY0LjIwMFwiXG4gIFwic3BlY1wiOlxuICAgIFwiZXh0ZXJuYWxUcmFmZmljUG9saWN5XCI6IFwiTG9jYWxcIlxuICBcInR5cGVcIjogXCJMb2FkQmFsYW5jZXJcIlxuXCJ0b3BvbG9neVNwcmVhZENvbnN0cmFpbnRzXCI6XG4tIFwibGFiZWxTZWxlY3RvclwiOlxuICAgIFwibWF0Y2hMYWJlbHNcIjpcbiAgICAgIFwiYXBwLmt1YmVybmV0ZXMuaW8vaW5zdGFuY2VcIjogXCJ0cmFlZmlrLXRyYWVmaWtcIlxuICAgICAgXCJhcHAua3ViZXJuZXRlcy5pby9uYW1lXCI6IFwidHJhZWZpa1wiXG4gIFwibWF4U2tld1wiOiAxXG4gIFwidG9wb2xvZ3lLZXlcIjogXCJrdWJlcm5ldGVzLmlvL2hvc3RuYW1lXCJcbiAgXCJ3aGVuVW5zYXRpc2ZpYWJsZVwiOiBcIlNjaGVkdWxlQW55d2F5XCJcbiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInZlcmlmeSI6IGZhbHNlLAogICAgICAgICAgICAidmVyc2lvbiI6ICI0Mi4zLjAiLAogICAgICAgICAgICAid2FpdCI6IHRydWUsCiAgICAgICAgICAgICJ3YWl0X2Zvcl9qb2JzIjogZmFsc2UKICAgICAgICAgIH0sCiAgICAgICAgICAic2Vuc2l0aXZlX2F0dHJpYnV0ZXMiOiBbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnZXRfYXR0ciIsCiAgICAgICAgICAgICAgICAidmFsdWUiOiAidmFsdWVzIgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInR5cGUiOiAiaW5kZXgiLAogICAgICAgICAgICAgICAgInZhbHVlIjogewogICAgICAgICAgICAgICAgICAidmFsdWUiOiAwLAogICAgICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgICBdLAogICAgICAgICAgInByaXZhdGUiOiAiZXlKelkyaGxiV0ZmZG1WeWMybHZiaUk2SWpFaWZRPT0iLAogICAgICAgICAgImRlcGVuZGVuY2llcyI6IFsKICAgICAgICAgICAgImt1YmVybmV0ZXNfbmFtZXNwYWNlLnRyYWVmaWsiCiAgICAgICAgICBdCiAgICAgICAgfQogICAgICBdCiAgICB9LAogICAgewogICAgICAibW9kZSI6ICJtYW5hZ2VkIiwKICAgICAgInR5cGUiOiAia3ViZXJuZXRlc19uYW1lc3BhY2UiLAogICAgICAibmFtZSI6ICJ0cmFlZmlrIiwKICAgICAgInByb3ZpZGVyIjogInByb3ZpZGVyW1wicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9rdWJlcm5ldGVzXCJdIiwKICAgICAgImluc3RhbmNlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAic2NoZW1hX3ZlcnNpb24iOiAwLAogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJpZCI6ICJ0cmFlZmlrIiwKICAgICAgICAgICAgIm1ldGFkYXRhIjogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJhbm5vdGF0aW9ucyI6IHt9LAogICAgICAgICAgICAgICAgImdlbmVyYXRlX25hbWUiOiAiIiwKICAgICAgICAgICAgICAgICJnZW5lcmF0aW9uIjogMCwKICAgICAgICAgICAgICAgICJsYWJlbHMiOiB7fSwKICAgICAgICAgICAgICAgICJuYW1lIjogInRyYWVmaWsiLAogICAgICAgICAgICAgICAgInJlc291cmNlX3ZlcnNpb24iOiAiMTI3NDIxIiwKICAgICAgICAgICAgICAgICJ1aWQiOiAiZmY3NDhiYTktMmE5MC00ZTJkLWFhZjctYmMwZGZlNTJhOTU3IgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgInRpbWVvdXRzIjogbnVsbCwKICAgICAgICAgICAgIndhaXRfZm9yX2RlZmF1bHRfc2VydmljZV9hY2NvdW50IjogbnVsbAogICAgICAgICAgfSwKICAgICAgICAgICJzZW5zaXRpdmVfYXR0cmlidXRlcyI6IFtdLAogICAgICAgICAgInByaXZhdGUiOiAiZXlKbE1tSm1ZamN6TUMxbFkyRmhMVEV4WlRZdE9HWTRPQzB6TkRNMk0ySmpOMk0wWXpBaU9uc2laR1ZzWlhSbElqb3pNREF3TURBd01EQXdNREI5TENKelkyaGxiV0ZmZG1WeWMybHZiaUk2SWpBaWZRPT0iCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXSwKICAiY2hlY2tfcmVzdWx0cyI6IG51bGwKfQo=" + } +] diff --git a/kind_kubeconfig/config b/kind_kubeconfig/config index d718f82..f3cbdb8 100644 --- a/kind_kubeconfig/config +++ b/kind_kubeconfig/config @@ -1,7 +1,7 @@ apiVersion: v1 clusters: - cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzT1RNME9UQXlPVFV3SGhjTk1qWXhNRE14TWpNME5EVTFXaGNOTXpZeE1ESTRNak0wTkRVMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzT1RNME9UQXlPVFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTbmxTYkxBeFRzWXZOTktka21ldHBhaG54aGV3ajJPT25ZelZCbjJuRzkKMXB4SlNoS01HbDF2UklmR084M1dvTG1JdExBNEYyaGVHcUsyQVl3c2hpTUhvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTBIbENUYXNkbGFEbmVLNUthM000CitOdXQ1YXN3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnUER1MTN1N2Y2TjA0WXpnR3dBM0gxcWZ4enpRS2d2YVoKMFdSNnMxNDBnUmtDSUMxUm5sNWRvbmVMWlFPZTVabG5RVjE0MHMyc3dtSzk4ZXo0TjJqQWJmM1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzT1RRME5ERXlNRFV3SGhjTk1qWXhNVEV4TWpNMU16STFXaGNOTXpZeE1UQTRNak0xTXpJMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzT1RRME5ERXlNRFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTUmR0V0FCOXZEU1VSNDZQeEFBcDUrZ05TNVRqZWhhQUZnanJsVmF4dS8KdVBFSnJ0b3JRdmpPSlpIVmVzR00yemtockRPU1F0VDE0WU4wUmIybGhFdWZvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUZic2kwVVFuYi9jQnZ3dXdKQyszCjREalZtSW93Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUpJcjh1ZUxybCtGUEZmS1RpS012WUJ5VUVoc2hBQkYKWkJJbXlqcUg5NzVuQWlFQXFOT2lrSkVxODJOcnNyTkJWMTNjQ1lEOEFEM1FGNU54RGlobVhmV0V4bmc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K server: https://127.0.0.1:6443 name: default contexts: @@ -15,5 +15,5 @@ preferences: {} users: - name: default user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJUktjdTNaVStITk13Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOemt6TkRrd01qazFNQjRYRFRJMk1UQXpNVEl6TkRRMU5Wb1hEVEkzTVRBegpNVEl6TkRRMU5Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJFdU9FVEJwV2pGNmwreEwKblcyMnlHcmZZSXdJb0ZwZVN6Tm42M1E1YzNJemRFSUJLV1J1NXp5SG4ydG1oMUJURWNoUVFidkM5ZnRqWWVGNgpxaUpxL0l1alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUmV2bHI4ZHFEZFh3ZklPb0gzQUc2Tm9tcTBwREFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQW15V0xlS0hFYmx1NE1TWVpVUWhjTVpibVQwcTk0L2RRUk5LYmRYQUM5VE1DSUNJenlYSS9uZkpadndNWAptay83V0pUdVFMQ0xSaFNtWjRNWUl6emsvcHp1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzT1RNME9UQXlPVFV3SGhjTk1qWXhNRE14TWpNME5EVTFXaGNOTXpZeE1ESTRNak0wTkRVMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzT1RNME9UQXlPVFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUL0w2aU5rbjI4c2lhcm9CVHFQbFR0d1pTZGlrTWlrdDZOV1djUWJGT0oKUEYwUTBjU01IT2JjTjhKZGRtRDNJUmVycldBaHhxa1NId1NyV0pXRmJvMWNvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVhyNWEvSGFnM1Y4SHlEcUI5d0J1CmphSnF0S1F3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUptWTA3MS8wM0Nqd2JMK1ZtRVRTcFJtcTFvcHJGTHAKSWRMN1A2cm9iYk16QWlFQW95TG1hZjZOTUswU1dDWGFIZUYwa0cwY0g0RndjQk1leE9rUGhKNWh6T3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUJRbnhwZzE5bVN3Q3VoOTZCb0JNTjhTRzRuQ3ZISXlWRnNnZjd3OE1lYldvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFUzQ0Uk1HbGFNWHFYN0V1ZGJiYklhdDlnakFpZ1dsNUxNMmZyZERsemNqTjBRZ0VwWkc3bgpQSWVmYTJhSFVGTVJ5RkJCdThMMSsyTmg0WHFxSW1yOGl3PT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJZFR0TU9wUjl0OWN3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOemswTkRReE1qQTFNQjRYRFRJMk1URXhNVEl6TlRNeU5Wb1hEVEkzTVRFeApNVEl6TlRNeU5Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJIcFRXZ2lOeGxsMklhSnkKVVVCbVNhcXdLOTdyZkhMT2pRaCtCbCtRN1kyOVlUM3FyL2VTd09qeEpZa3dqbFJybytYeVZPc2c0RExqSzl3NApjcUhmWVBPalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUk96Z1VYR0tGaWVQN05CRDhOQi85dGV6cFdwREFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQTBsbUtPSGRoOTVlYmV6WmI4cGJzRjAxYlAreDRzU3VpQXE3RTM3NTNUTzBDSURpS3dsOTg2Rk9iazJ0UAozY0dkU3RBenB4K3VHbXdUUDhKbWxFTE10U1hBCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzT1RRME5ERXlNRFV3SGhjTk1qWXhNVEV4TWpNMU16STFXaGNOTXpZeE1UQTRNak0xTXpJMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzT1RRME5ERXlNRFV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSelpocVBUUG9aeldsYWN0UzFKcjZVNUpvL0ZId2wxY3R1ODBzZmdTc3EKZmpnUk4yNnM5QmdoZlY4ZWU3cDY2SzloRzRWR05WdlpPQTVidldOYXAyNXBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVRzNEZGeGloWW5qK3pRUS9EUWYvCmJYczZWcVF3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWEdQZWR6WW1HRHdvZ1NhR0hNVzJRUFlpdWNpRXZaY0oKQlhnQm1ORHhyT2dDSUVGV1I3ejVTMVZsUmIzZFhPeUQ1c2lwRHBtd0FNNVpkQ0pvNzcvTFgrcFIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUh1cDZlUTJ5c0JOTzQ3T0ZCQXZPSUkxV09xdnpoRmVwZ3FwTlQ5M05CSTZvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFZWxOYUNJM0dXWFlob25KUlFHWkpxckFyM3V0OGNzNk5DSDRHWDVEdGpiMWhQZXF2OTVMQQo2UEVsaVRDT1ZHdWo1ZkpVNnlEZ011TXIzRGh5b2Q5Zzh3PT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo= diff --git a/main.tf b/main.tf index f6e0834..6aad492 100644 --- a/main.tf +++ b/main.tf @@ -30,7 +30,7 @@ provider "helm" { # 2. Den NGINX-Ingress-Controller installieren (Simuliert den Cloud-Loadbalancer) resource "helm_release" "nginx_ingress" { name = "ingress-nginx" - repository = "https://github.io" + repository = "https://kubernetes.github.io/ingress-nginx" chart = "ingress-nginx" namespace = "kube-system" @@ -71,7 +71,7 @@ resource "kubernetes_deployment" "webapp" { resource "kubernetes_service" "webapp_service" { metadata { name = "webapp-service" } spec { - selector = { app = "kubernetes_deployment.webapp.metadata[0].name" } + selector = { app = kubernetes_deployment.webapp.spec[0].template[0].metadata[0].labels.app } port { port = 80 target_port = 80 diff --git a/main.tf.bak b/main.tf.bak new file mode 100644 index 0000000..f6e0834 --- /dev/null +++ b/main.tf.bak @@ -0,0 +1,107 @@ +variable "app_version" { + type = string + default = "latest" +} + +terraform { + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 2.26" + } + helm = { + source = "hashicorp/helm" + version = "~> 2.12" + } + } +} + +# 1. Verbindung zum lokalen K3s-Container herstellen +provider "kubernetes" { + config_path = "./kind_kubeconfig/config" +} + +provider "helm" { + kubernetes { + config_path = "./kind_kubeconfig/config" + } +} + +# 2. Den NGINX-Ingress-Controller installieren (Simuliert den Cloud-Loadbalancer) +resource "helm_release" "nginx_ingress" { + name = "ingress-nginx" + repository = "https://github.io" + chart = "ingress-nginx" + namespace = "kube-system" + + # Zwingt den Ingress-Controller, auf K3s-Standard-Ports zu lauschen + set { + name = "controller.service.type" + value = "ClusterIP" + } + set { + name = "controller.hostNetwork" + value = "true" + } +} + +# 3. Deine Webapp (App 1) +resource "kubernetes_deployment" "webapp" { + metadata { + name = "webapp" + labels = { app = "webapp" } + } + spec { + replicas = 1 + selector { match_labels = { app = "webapp" } } + template { + metadata { labels = { app = "webapp" } } + spec { + container { + name = "web" + # Später: forgejo:3000/dein-user/webapp:${var.app_version} + image = "nginx:alpine" + port { container_port = 80 } + } + } + } + } +} + +resource "kubernetes_service" "webapp_service" { + metadata { name = "webapp-service" } + spec { + selector = { app = "kubernetes_deployment.webapp.metadata[0].name" } + port { + port = 80 + target_port = 80 + } + } +} + +# 4. Der Ingress-Routing-Eintrag (Das "Produktions-Verhalten") +resource "kubernetes_ingress_v1" "app_ingress" { + depends_on = [helm_release.nginx_ingress] + metadata { + name = "app-ingress" + annotations = { + "kubernetes.io/ingress.class" = "nginx" + } + } + spec { + rule { + http { + path { + path = "/" + path_type = "Prefix" + backend { + service { + name = kubernetes_service.webapp_service.metadata[0].name + port { number = 80 } + } + } + } + } + } + } +} diff --git a/nginx.conf b/nginx.conf index a126b04..7912945 100644 --- a/nginx.conf +++ b/nginx.conf @@ -2,7 +2,11 @@ events { worker_connections 1024; } http { client_max_body_size 0; - + map "$http_host|$upstream_http_www_authenticate" $registry_www_auth { + "~^registry\.local:3005\|(?
.*realm=\")https?://forgejo:3000(?.*)$"
+            "${pre}https://registry.local:3005${post}";
+        default $upstream_http_www_authenticate;
+    }
     # BLOCK 1: HTTPS (Port 443) - Für die Pipeline
     server {
         listen 443 ssl;
@@ -17,6 +21,8 @@ http {
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
+            proxy_hide_header WWW-Authenticate;
+            add_header WWW-Authenticate $registry_www_auth always;
         }
     }
 
diff --git a/terraform.tfstate b/terraform.tfstate
new file mode 100644
index 0000000..44a1247
--- /dev/null
+++ b/terraform.tfstate
@@ -0,0 +1,414 @@
+{
+  "version": 4,
+  "terraform_version": "1.9.8",
+  "serial": 13,
+  "lineage": "252fb5b6-b03d-ea0e-99be-fd8b89626463",
+  "outputs": {},
+  "resources": [
+    {
+      "mode": "managed",
+      "type": "helm_release",
+      "name": "nginx_ingress",
+      "provider": "provider[\"registry.terraform.io/hashicorp/helm\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "atomic": false,
+            "chart": "ingress-nginx",
+            "cleanup_on_fail": false,
+            "create_namespace": false,
+            "dependency_update": false,
+            "description": null,
+            "devel": null,
+            "disable_crd_hooks": false,
+            "disable_openapi_validation": false,
+            "disable_webhooks": false,
+            "force_update": false,
+            "id": "ingress-nginx",
+            "keyring": null,
+            "lint": false,
+            "manifest": null,
+            "max_history": 0,
+            "metadata": [
+              {
+                "app_version": "1.15.1",
+                "chart": "ingress-nginx",
+                "first_deployed": 1794522908,
+                "last_deployed": 1794522908,
+                "name": "ingress-nginx",
+                "namespace": "kube-system",
+                "notes": "The ingress-nginx controller has been installed.\nGet the application URL by running these commands:\n  export POD_NAME=\"$(kubectl get pods --namespace kube-system --selector app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/component=controller --output jsonpath=\"{.items[0].metadata.name}\")\"\n  kubectl port-forward --namespace kube-system \"${POD_NAME}\" 8080:80\n  echo \"Visit http://127.0.0.1:8080 to access your application.\"\n\nAn example Ingress that makes use of the controller:\n  apiVersion: networking.k8s.io/v1\n  kind: Ingress\n  metadata:\n    name: example\n    namespace: foo\n  spec:\n    ingressClassName: nginx\n    rules:\n      - host: www.example.com\n        http:\n          paths:\n            - pathType: Prefix\n              backend:\n                service:\n                  name: exampleService\n                  port:\n                    number: 80\n              path: /\n    # This section is only required if TLS is to be enabled for the Ingress\n    tls:\n      - hosts:\n        - www.example.com\n        secretName: example-tls\n\nIf TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:\n\n  apiVersion: v1\n  kind: Secret\n  metadata:\n    name: example-tls\n    namespace: foo\n  data:\n    tls.crt: \u003cbase64 encoded cert\u003e\n    tls.key: \u003cbase64 encoded key\u003e\n  type: kubernetes.io/tls\n",
+                "revision": 1,
+                "values": "{\"controller\":{\"hostNetwork\":true,\"service\":{\"type\":\"ClusterIP\"}}}",
+                "version": "4.15.1"
+              }
+            ],
+            "name": "ingress-nginx",
+            "namespace": "kube-system",
+            "pass_credentials": false,
+            "postrender": [],
+            "recreate_pods": false,
+            "render_subchart_notes": true,
+            "replace": false,
+            "repository": "https://kubernetes.github.io/ingress-nginx",
+            "repository_ca_file": null,
+            "repository_cert_file": null,
+            "repository_key_file": null,
+            "repository_password": null,
+            "repository_username": null,
+            "reset_values": false,
+            "reuse_values": false,
+            "set": [
+              {
+                "name": "controller.hostNetwork",
+                "type": "",
+                "value": "true"
+              },
+              {
+                "name": "controller.service.type",
+                "type": "",
+                "value": "ClusterIP"
+              }
+            ],
+            "set_list": [],
+            "set_sensitive": [],
+            "skip_crds": false,
+            "status": "deployed",
+            "timeout": 300,
+            "upgrade_install": null,
+            "values": null,
+            "verify": false,
+            "version": "4.15.1",
+            "wait": true,
+            "wait_for_jobs": false
+          },
+          "sensitive_attributes": [
+            [
+              {
+                "type": "get_attr",
+                "value": "repository_password"
+              }
+            ]
+          ],
+          "private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_deployment",
+      "name": "webapp",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "id": "default/webapp",
+            "metadata": [
+              {
+                "annotations": {},
+                "generate_name": "",
+                "generation": 1,
+                "labels": {
+                  "app": "webapp"
+                },
+                "name": "webapp",
+                "namespace": "default",
+                "resource_version": "25006",
+                "uid": "5d5fc79f-ed16-4cd6-9acf-f1d8d4e2614e"
+              }
+            ],
+            "spec": [
+              {
+                "min_ready_seconds": 0,
+                "paused": false,
+                "progress_deadline_seconds": 600,
+                "replicas": "1",
+                "revision_history_limit": 10,
+                "selector": [
+                  {
+                    "match_expressions": [],
+                    "match_labels": {
+                      "app": "webapp"
+                    }
+                  }
+                ],
+                "strategy": [
+                  {
+                    "rolling_update": [
+                      {
+                        "max_surge": "25%",
+                        "max_unavailable": "25%"
+                      }
+                    ],
+                    "type": "RollingUpdate"
+                  }
+                ],
+                "template": [
+                  {
+                    "metadata": [
+                      {
+                        "annotations": {},
+                        "generate_name": "",
+                        "generation": 0,
+                        "labels": {
+                          "app": "webapp"
+                        },
+                        "name": "",
+                        "namespace": "",
+                        "resource_version": "",
+                        "uid": ""
+                      }
+                    ],
+                    "spec": [
+                      {
+                        "active_deadline_seconds": 0,
+                        "affinity": [],
+                        "automount_service_account_token": true,
+                        "container": [
+                          {
+                            "args": [],
+                            "command": [],
+                            "env": [],
+                            "env_from": [],
+                            "image": "nginx:alpine",
+                            "image_pull_policy": "IfNotPresent",
+                            "lifecycle": [],
+                            "liveness_probe": [],
+                            "name": "web",
+                            "port": [
+                              {
+                                "container_port": 80,
+                                "host_ip": "",
+                                "host_port": 0,
+                                "name": "",
+                                "protocol": "TCP"
+                              }
+                            ],
+                            "readiness_probe": [],
+                            "resources": [
+                              {
+                                "limits": {},
+                                "requests": {}
+                              }
+                            ],
+                            "security_context": [],
+                            "startup_probe": [],
+                            "stdin": false,
+                            "stdin_once": false,
+                            "termination_message_path": "/dev/termination-log",
+                            "termination_message_policy": "File",
+                            "tty": false,
+                            "volume_device": [],
+                            "volume_mount": [],
+                            "working_dir": ""
+                          }
+                        ],
+                        "dns_config": [],
+                        "dns_policy": "ClusterFirst",
+                        "enable_service_links": true,
+                        "host_aliases": [],
+                        "host_ipc": false,
+                        "host_network": false,
+                        "host_pid": false,
+                        "hostname": "",
+                        "image_pull_secrets": [],
+                        "init_container": [],
+                        "node_name": "",
+                        "node_selector": {},
+                        "os": [],
+                        "priority_class_name": "",
+                        "readiness_gate": [],
+                        "restart_policy": "Always",
+                        "runtime_class_name": "",
+                        "scheduler_name": "default-scheduler",
+                        "security_context": [],
+                        "service_account_name": "",
+                        "share_process_namespace": false,
+                        "subdomain": "",
+                        "termination_grace_period_seconds": 30,
+                        "toleration": [],
+                        "topology_spread_constraint": [],
+                        "volume": []
+                      }
+                    ]
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_rollout": true
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6NjAwMDAwMDAwMDAwLCJ1cGRhdGUiOjYwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9"
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_ingress_v1",
+      "name": "app_ingress",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 0,
+          "attributes": {
+            "id": "default/app-ingress",
+            "metadata": [
+              {
+                "annotations": {
+                  "kubernetes.io/ingress.class": "nginx"
+                },
+                "generate_name": "",
+                "generation": 1,
+                "labels": {},
+                "name": "app-ingress",
+                "namespace": "default",
+                "resource_version": "25420",
+                "uid": "6e5e595a-2954-4977-aaba-74cf1afa90be"
+              }
+            ],
+            "spec": [
+              {
+                "default_backend": [],
+                "ingress_class_name": "",
+                "rule": [
+                  {
+                    "host": "",
+                    "http": [
+                      {
+                        "path": [
+                          {
+                            "backend": [
+                              {
+                                "resource": [],
+                                "service": [
+                                  {
+                                    "name": "webapp-service",
+                                    "port": [
+                                      {
+                                        "name": "",
+                                        "number": 80
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ],
+                            "path": "/",
+                            "path_type": "Prefix"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ],
+                "tls": []
+              }
+            ],
+            "status": [
+              {
+                "load_balancer": [
+                  {
+                    "ingress": []
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_load_balancer": null
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDB9fQ==",
+          "dependencies": [
+            "helm_release.nginx_ingress",
+            "kubernetes_deployment.webapp",
+            "kubernetes_service.webapp_service"
+          ]
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_service",
+      "name": "webapp_service",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "id": "default/webapp-service",
+            "metadata": [
+              {
+                "annotations": {},
+                "generate_name": "",
+                "generation": 0,
+                "labels": {},
+                "name": "webapp-service",
+                "namespace": "default",
+                "resource_version": "25273",
+                "uid": "2b45b34c-7b27-4bc1-b0bc-970ddc0f0fb6"
+              }
+            ],
+            "spec": [
+              {
+                "allocate_load_balancer_node_ports": true,
+                "cluster_ip": "10.43.255.164",
+                "cluster_ips": [
+                  "10.43.255.164"
+                ],
+                "external_ips": [],
+                "external_name": "",
+                "external_traffic_policy": "",
+                "health_check_node_port": 0,
+                "internal_traffic_policy": "Cluster",
+                "ip_families": [
+                  "IPv4"
+                ],
+                "ip_family_policy": "SingleStack",
+                "load_balancer_class": "",
+                "load_balancer_ip": "",
+                "load_balancer_source_ranges": [],
+                "port": [
+                  {
+                    "app_protocol": "",
+                    "name": "",
+                    "node_port": 0,
+                    "port": 80,
+                    "protocol": "TCP",
+                    "target_port": "80"
+                  }
+                ],
+                "publish_not_ready_addresses": false,
+                "selector": {
+                  "app": "webapp"
+                },
+                "session_affinity": "None",
+                "session_affinity_config": [],
+                "type": "ClusterIP"
+              }
+            ],
+            "status": [
+              {
+                "load_balancer": [
+                  {
+                    "ingress": []
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_load_balancer": true
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
+          "dependencies": [
+            "kubernetes_deployment.webapp"
+          ]
+        }
+      ]
+    }
+  ],
+  "check_results": null
+}
diff --git a/terraform.tfstate.backup b/terraform.tfstate.backup
new file mode 100644
index 0000000..97648c9
--- /dev/null
+++ b/terraform.tfstate.backup
@@ -0,0 +1,414 @@
+{
+  "version": 4,
+  "terraform_version": "1.9.8",
+  "serial": 12,
+  "lineage": "252fb5b6-b03d-ea0e-99be-fd8b89626463",
+  "outputs": {},
+  "resources": [
+    {
+      "mode": "managed",
+      "type": "helm_release",
+      "name": "nginx_ingress",
+      "provider": "provider[\"registry.terraform.io/hashicorp/helm\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "atomic": false,
+            "chart": "ingress-nginx",
+            "cleanup_on_fail": false,
+            "create_namespace": false,
+            "dependency_update": false,
+            "description": null,
+            "devel": null,
+            "disable_crd_hooks": false,
+            "disable_openapi_validation": false,
+            "disable_webhooks": false,
+            "force_update": false,
+            "id": "ingress-nginx",
+            "keyring": null,
+            "lint": false,
+            "manifest": null,
+            "max_history": 0,
+            "metadata": [
+              {
+                "app_version": "1.15.1",
+                "chart": "ingress-nginx",
+                "first_deployed": 1794522908,
+                "last_deployed": 1794522908,
+                "name": "ingress-nginx",
+                "namespace": "kube-system",
+                "notes": "The ingress-nginx controller has been installed.\nGet the application URL by running these commands:\n  export POD_NAME=\"$(kubectl get pods --namespace kube-system --selector app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/component=controller --output jsonpath=\"{.items[0].metadata.name}\")\"\n  kubectl port-forward --namespace kube-system \"${POD_NAME}\" 8080:80\n  echo \"Visit http://127.0.0.1:8080 to access your application.\"\n\nAn example Ingress that makes use of the controller:\n  apiVersion: networking.k8s.io/v1\n  kind: Ingress\n  metadata:\n    name: example\n    namespace: foo\n  spec:\n    ingressClassName: nginx\n    rules:\n      - host: www.example.com\n        http:\n          paths:\n            - pathType: Prefix\n              backend:\n                service:\n                  name: exampleService\n                  port:\n                    number: 80\n              path: /\n    # This section is only required if TLS is to be enabled for the Ingress\n    tls:\n      - hosts:\n        - www.example.com\n        secretName: example-tls\n\nIf TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:\n\n  apiVersion: v1\n  kind: Secret\n  metadata:\n    name: example-tls\n    namespace: foo\n  data:\n    tls.crt: \u003cbase64 encoded cert\u003e\n    tls.key: \u003cbase64 encoded key\u003e\n  type: kubernetes.io/tls\n",
+                "revision": 1,
+                "values": "{\"controller\":{\"hostNetwork\":true,\"service\":{\"type\":\"ClusterIP\"}}}",
+                "version": "4.15.1"
+              }
+            ],
+            "name": "ingress-nginx",
+            "namespace": "kube-system",
+            "pass_credentials": false,
+            "postrender": [],
+            "recreate_pods": false,
+            "render_subchart_notes": true,
+            "replace": false,
+            "repository": "https://kubernetes.github.io/ingress-nginx",
+            "repository_ca_file": null,
+            "repository_cert_file": null,
+            "repository_key_file": null,
+            "repository_password": null,
+            "repository_username": null,
+            "reset_values": false,
+            "reuse_values": false,
+            "set": [
+              {
+                "name": "controller.hostNetwork",
+                "type": "",
+                "value": "true"
+              },
+              {
+                "name": "controller.service.type",
+                "type": "",
+                "value": "ClusterIP"
+              }
+            ],
+            "set_list": [],
+            "set_sensitive": [],
+            "skip_crds": false,
+            "status": "deployed",
+            "timeout": 300,
+            "upgrade_install": null,
+            "values": null,
+            "verify": false,
+            "version": "4.15.1",
+            "wait": true,
+            "wait_for_jobs": false
+          },
+          "sensitive_attributes": [
+            [
+              {
+                "type": "get_attr",
+                "value": "repository_password"
+              }
+            ]
+          ],
+          "private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_deployment",
+      "name": "webapp",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "id": "default/webapp",
+            "metadata": [
+              {
+                "annotations": {},
+                "generate_name": "",
+                "generation": 1,
+                "labels": {
+                  "app": "webapp"
+                },
+                "name": "webapp",
+                "namespace": "default",
+                "resource_version": "25006",
+                "uid": "5d5fc79f-ed16-4cd6-9acf-f1d8d4e2614e"
+              }
+            ],
+            "spec": [
+              {
+                "min_ready_seconds": 0,
+                "paused": false,
+                "progress_deadline_seconds": 600,
+                "replicas": "1",
+                "revision_history_limit": 10,
+                "selector": [
+                  {
+                    "match_expressions": [],
+                    "match_labels": {
+                      "app": "webapp"
+                    }
+                  }
+                ],
+                "strategy": [
+                  {
+                    "rolling_update": [
+                      {
+                        "max_surge": "25%",
+                        "max_unavailable": "25%"
+                      }
+                    ],
+                    "type": "RollingUpdate"
+                  }
+                ],
+                "template": [
+                  {
+                    "metadata": [
+                      {
+                        "annotations": {},
+                        "generate_name": "",
+                        "generation": 0,
+                        "labels": {
+                          "app": "webapp"
+                        },
+                        "name": "",
+                        "namespace": "",
+                        "resource_version": "",
+                        "uid": ""
+                      }
+                    ],
+                    "spec": [
+                      {
+                        "active_deadline_seconds": 0,
+                        "affinity": [],
+                        "automount_service_account_token": true,
+                        "container": [
+                          {
+                            "args": [],
+                            "command": [],
+                            "env": [],
+                            "env_from": [],
+                            "image": "nginx:alpine",
+                            "image_pull_policy": "IfNotPresent",
+                            "lifecycle": [],
+                            "liveness_probe": [],
+                            "name": "web",
+                            "port": [
+                              {
+                                "container_port": 80,
+                                "host_ip": "",
+                                "host_port": 0,
+                                "name": "",
+                                "protocol": "TCP"
+                              }
+                            ],
+                            "readiness_probe": [],
+                            "resources": [
+                              {
+                                "limits": {},
+                                "requests": {}
+                              }
+                            ],
+                            "security_context": [],
+                            "startup_probe": [],
+                            "stdin": false,
+                            "stdin_once": false,
+                            "termination_message_path": "/dev/termination-log",
+                            "termination_message_policy": "File",
+                            "tty": false,
+                            "volume_device": [],
+                            "volume_mount": [],
+                            "working_dir": ""
+                          }
+                        ],
+                        "dns_config": [],
+                        "dns_policy": "ClusterFirst",
+                        "enable_service_links": true,
+                        "host_aliases": [],
+                        "host_ipc": false,
+                        "host_network": false,
+                        "host_pid": false,
+                        "hostname": "",
+                        "image_pull_secrets": [],
+                        "init_container": [],
+                        "node_name": "",
+                        "node_selector": {},
+                        "os": [],
+                        "priority_class_name": "",
+                        "readiness_gate": [],
+                        "restart_policy": "Always",
+                        "runtime_class_name": "",
+                        "scheduler_name": "default-scheduler",
+                        "security_context": [],
+                        "service_account_name": "",
+                        "share_process_namespace": false,
+                        "subdomain": "",
+                        "termination_grace_period_seconds": 30,
+                        "toleration": [],
+                        "topology_spread_constraint": [],
+                        "volume": []
+                      }
+                    ]
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_rollout": true
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6NjAwMDAwMDAwMDAwLCJ1cGRhdGUiOjYwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9"
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_ingress_v1",
+      "name": "app_ingress",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 0,
+          "attributes": {
+            "id": "default/app-ingress",
+            "metadata": [
+              {
+                "annotations": {
+                  "kubernetes.io/ingress.class": "nginx"
+                },
+                "generate_name": "",
+                "generation": 1,
+                "labels": null,
+                "name": "app-ingress",
+                "namespace": "default",
+                "resource_version": "25420",
+                "uid": "6e5e595a-2954-4977-aaba-74cf1afa90be"
+              }
+            ],
+            "spec": [
+              {
+                "default_backend": [],
+                "ingress_class_name": "",
+                "rule": [
+                  {
+                    "host": "",
+                    "http": [
+                      {
+                        "path": [
+                          {
+                            "backend": [
+                              {
+                                "resource": [],
+                                "service": [
+                                  {
+                                    "name": "webapp-service",
+                                    "port": [
+                                      {
+                                        "name": "",
+                                        "number": 80
+                                      }
+                                    ]
+                                  }
+                                ]
+                              }
+                            ],
+                            "path": "/",
+                            "path_type": "Prefix"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ],
+                "tls": []
+              }
+            ],
+            "status": [
+              {
+                "load_balancer": [
+                  {
+                    "ingress": []
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_load_balancer": null
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDB9fQ==",
+          "dependencies": [
+            "helm_release.nginx_ingress",
+            "kubernetes_deployment.webapp",
+            "kubernetes_service.webapp_service"
+          ]
+        }
+      ]
+    },
+    {
+      "mode": "managed",
+      "type": "kubernetes_service",
+      "name": "webapp_service",
+      "provider": "provider[\"registry.terraform.io/hashicorp/kubernetes\"]",
+      "instances": [
+        {
+          "schema_version": 1,
+          "attributes": {
+            "id": "default/webapp-service",
+            "metadata": [
+              {
+                "annotations": null,
+                "generate_name": "",
+                "generation": 0,
+                "labels": null,
+                "name": "webapp-service",
+                "namespace": "default",
+                "resource_version": "25273",
+                "uid": "2b45b34c-7b27-4bc1-b0bc-970ddc0f0fb6"
+              }
+            ],
+            "spec": [
+              {
+                "allocate_load_balancer_node_ports": true,
+                "cluster_ip": "10.43.255.164",
+                "cluster_ips": [
+                  "10.43.255.164"
+                ],
+                "external_ips": null,
+                "external_name": "",
+                "external_traffic_policy": "",
+                "health_check_node_port": 0,
+                "internal_traffic_policy": "Cluster",
+                "ip_families": [
+                  "IPv4"
+                ],
+                "ip_family_policy": "SingleStack",
+                "load_balancer_class": "",
+                "load_balancer_ip": "",
+                "load_balancer_source_ranges": null,
+                "port": [
+                  {
+                    "app_protocol": "",
+                    "name": "",
+                    "node_port": 0,
+                    "port": 80,
+                    "protocol": "TCP",
+                    "target_port": "80"
+                  }
+                ],
+                "publish_not_ready_addresses": false,
+                "selector": {
+                  "app": "webapp"
+                },
+                "session_affinity": "None",
+                "session_affinity_config": [],
+                "type": "ClusterIP"
+              }
+            ],
+            "status": [
+              {
+                "load_balancer": [
+                  {
+                    "ingress": []
+                  }
+                ]
+              }
+            ],
+            "timeouts": null,
+            "wait_for_load_balancer": true
+          },
+          "sensitive_attributes": [],
+          "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjEifQ==",
+          "dependencies": [
+            "kubernetes_deployment.webapp"
+          ]
+        }
+      ]
+    }
+  ],
+  "check_results": null
+}