{"id":19656576,"url":"https://github.com/daggerok/k8s-ingress-explained","last_synced_at":"2026-01-02T15:08:58.911Z","repository":{"id":44855656,"uuid":"223662431","full_name":"daggerok/k8s-ingress-explained","owner":"daggerok","description":"Kubernetes Ingress by nginx and traefik for spring-boot services in k8s","archived":false,"fork":false,"pushed_at":"2022-01-21T23:34:23.000Z","size":142,"stargazers_count":2,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-21T13:44:33.173Z","etag":null,"topics":["cloud-native","cloud-native-microservices","fabric8-docker-compose","fabric8-docker-compose-wait","fabric8-maven-plugin","ingress","ingress-controller","ingress-nginx","jib-maven-plugin","k8s","nginx","nginx-reverse-proxy","r2dbc","r2dbc-h2","rsocket","spring-boot-2","spring-data-r2dbc"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daggerok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-23T22:39:19.000Z","updated_at":"2023-04-28T07:35:26.000Z","dependencies_parsed_at":"2022-08-27T04:22:53.447Z","dependency_job_id":null,"html_url":"https://github.com/daggerok/k8s-ingress-explained","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fk8s-ingress-explained","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fk8s-ingress-explained/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fk8s-ingress-explained/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daggerok%2Fk8s-ingress-explained/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daggerok","download_url":"https://codeload.github.com/daggerok/k8s-ingress-explained/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243646672,"owners_count":20324586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloud-native","cloud-native-microservices","fabric8-docker-compose","fabric8-docker-compose-wait","fabric8-maven-plugin","ingress","ingress-controller","ingress-nginx","jib-maven-plugin","k8s","nginx","nginx-reverse-proxy","r2dbc","r2dbc-h2","rsocket","spring-boot-2","spring-data-r2dbc"],"created_at":"2024-11-11T15:28:11.012Z","updated_at":"2026-01-02T15:08:58.884Z","avatar_url":"https://github.com/daggerok.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# k8s ingress explained [![Build Status](https://travis-ci.org/daggerok/k8s-ingress-explained.svg?branch=master)](https://travis-ci.org/daggerok/k8s-ingress-explained)\nExpose kubernetes services with nginx / traefik ingress for spring-boot services in k8s with skaffold\n\n```\n                 +---------------------------------------------+\n                 |                        +-------+            |\n                 |      K8S               | hello |\u003c---+       |\n  O       +---------+                     +-------+    |       |\n /|\\ \u003c--\u003e | Ingress | \u003c---+                            |       |\n / \\      +---------+     |    +----------+      +----------+  |\n                 |        +--\u003e | frontend | ---\u003e | greeting |  |\n                 |             +----------+      +----------+  |\n                 +---------------------------------------------+\n```\n\n## table of content\n1. [version: 0.0.1]()\n   * [local workflow](#local)\n     * [hello](#local-hello-variants-service)\n     * [greeting](#local-greeting-service)\n     * [frontend](#local-frontend)\n   * [maven-release-plugin](#release)\n1. [version: 0.0.2]()\n   * [gib-maven-plugin](#gib)\n     * [fat jar configuration](#fat-jar-configuration)\n     * [thin jar configuration](#thin-jar-configuration)\n     * [debug jib images](#debug-jib)\n   * [fabric8 docker-maven-plugin](#fabric8)\n     * [configuration](#fabric8-configuration)\n     * [build, run and test](#run-with-fabric8)\n   * [dkanejs docker-compose-maven-plugin](#dkanejs-docker-compose-maven-plugin)\n     * [configuration](#dkanejs-configuration)\n     * [build, run and test](#run-using-dkanejs-docker-compose-maven-plugin)\n1. [0.0.3: kubernetes skaffold workflow](#k8s--skaffold)\n   * [k8s resources](#k8s)\n   * [skaffold docker for mac / windows](#skaffold)\n1. [version: 0.0.4]()\n   * [k8s nginx ingress for Docker for Mac / Windows](#k8s-nginx-ingress-for-docker-for-mac)\n     * [nginx ingress default backend](#nginx-ingress-default-backend)\n     * [nginx ingress rewrite-target](#nginx-ingress-rewrite-target)\n   * [k8s traefik ingress for k3d k3s](#k8s-traefik-ingress-for-k3d-k3s)\n     * [traefik ingress default backend](#traefik-ingress-default-backend)\n     * [traefik ingress PathPrefixStrip](#traefik-ingress-pathprefixstrip)\n1. [resources](#resources)\n\n## features\n\n* [k8s, k3s, k3d]()\n* [skaffold in multi-project]()\n* [fabric8 docker-compose wait]()\n* [docker-compose with fabric8 docker-maven-plugin]()\n* [jib thin jar]()\n* [jib fat jar]()\n* [spring.factories auto-configurations]()\n* [spring-boot maven multi-module project]()\n\n## local\n\n### local hello-variants-service\n\n```bash\n./mvnw -f hello-variants-service clean spring-boot:run \u0026\nhttp :8001/api/hello/find-all-hello\nhttp post :8001/actuator/shutdown\n```\n\n### local greeting-service\n\n```bash\n./mvnw -f greeting-service clean spring-boot:run \u0026\nhttp :8003/api/greeting/find-all-greetings\nhttp :8003/api/greeting/find-all-greetings/max\nhttp post :8003/actuator/shutdown\n```\n\n### local frontend\n\n```bash\n./mvnw -f frontend clean spring-boot:run \u0026\nhttp :8004/api/greeting/find-all-hello\nhttp :8004/api/greeting/find-all-greetings\nhttp :8004/api/greeting/find-all-greetings/max\nhttp post :8004/actuator/shutdown\n```\n\n## GIB\n\n**requires: Docker**\n\n* Add Google jib maven plugin in _pom.xml_ file for spring-boot all applications / services\n\n### fat jar configuration\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003ecom.google.cloud.tools\u003c/groupId\u003e\n    \u003cartifactId\u003ejib-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e${jib-maven-plugin.version}\u003c/version\u003e\n    \u003cconfiguration\u003e\n        \u003ccontainerizingMode\u003epackaged\u003c/containerizingMode\u003e\n        \u003ccontainer\u003e\n            \u003cappRoot\u003e/tmp\u003c/appRoot\u003e\n            \u003cuseCurrentTimestamp\u003etrue\u003c/useCurrentTimestamp\u003e\n            \u003centrypoint\u003e\n                \u003cshell\u003ebash\u003c/shell\u003e\n                \u003coption\u003e-c\u003c/option\u003e\n                \u003carg\u003ejava -cp /tmp/classpath:/tmp/*.jar\u003c/arg\u003e\n            \u003c/entrypoint\u003e\n            \u003cargs\u003e\n                \u003carg\u003e/bin/bash\u003c/arg\u003e\n            \u003c/args\u003e\n        \u003c/container\u003e\n        \u003cfrom\u003e\n            \u003cimage\u003eopenjdk:11.0.5-jre-stretch\u003c/image\u003e\n        \u003c/from\u003e\n        \u003cto\u003e\n            \u003cimage\u003edaggerok/${project.parent.artifactId}-${project.artifactId}\u003c/image\u003e\n            \u003ctags\u003e\n                \u003ctag\u003e${project.version}\u003c/tag\u003e\n                \u003ctag\u003elatest\u003c/tag\u003e\n            \u003c/tags\u003e\n        \u003c/to\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### thin jar configuration\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003ecom.google.cloud.tools\u003c/groupId\u003e\n    \u003cartifactId\u003ejib-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e${jib-maven-plugin.version}\u003c/version\u003e\n    \u003cconfiguration\u003e\n        \u003callowInsecureRegistries\u003etrue\u003c/allowInsecureRegistries\u003e\n        \u003ccontainer\u003e\n            \u003ccreationTime\u003eUSE_CURRENT_TIMESTAMP\u003c/creationTime\u003e\n        \u003c/container\u003e\n        \u003cto\u003e\n            \u003cimage\u003edaggerok/${project.parent.artifactId}-${project.artifactId}\u003c/image\u003e\n            \u003ctags\u003e\n                \u003ctag\u003e${project.version}\u003c/tag\u003e\n                \u003ctag\u003elatest\u003c/tag\u003e\n            \u003c/tags\u003e\n        \u003c/to\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### debug jib\n\nmake sure you are using:\n\n```xml\n\u003cfrom\u003e\n    \u003c!--\u003cimage\u003egcr.io/distroless/java:11\u003c/image\u003e--\u003e\n    \u003cimage\u003egcr.io/distroless/java:11-debug\u003c/image\u003e\n\u003c/from\u003e\n```\n\nthen build jib image and run command:\n\n```bash\ndocker run -it \\\n    --entrypoint /busybox/sh \\\n    --network docker_k8s-ingress-explained \\\n    daggerok/k8s-ingress-explained-frontend:latest\n```\n\n## fabric8\n\n### fabric8 configuration\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003eio.fabric8\u003c/groupId\u003e\n    \u003cartifactId\u003edocker-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e${docker-maven-plugin.version}\u003c/version\u003e\n    \u003cconfiguration\u003e\n        \u003cfollow\u003efalse\u003c/follow\u003e\n        \u003cverbose\u003etrue\u003c/verbose\u003e\n        \u003cuseColor\u003etrue\u003c/useColor\u003e\n        \u003clogDate\u003edefault\u003c/logDate\u003e\n        \u003cautoPull\u003ealways\u003c/autoPull\u003e\n        \u003ckeepRunning\u003efalse\u003c/keepRunning\u003e\n        \u003cwatchInterval\u003e500\u003c/watchInterval\u003e\n        \u003callContainers\u003etrue\u003c/allContainers\u003e\n        \u003cremoveVolumes\u003etrue\u003c/removeVolumes\u003e\n        \u003cimagePullPolicy\u003eIfNotPresent\u003c/imagePullPolicy\u003e\n        \u003cautoCreateCustomNetworks\u003etrue\u003c/autoCreateCustomNetworks\u003e\n        \u003cimages\u003e\n            \u003cimage\u003e\n                \u003calias\u003efrontend\u003c/alias\u003e\n                \u003cexternal\u003e\n                    \u003ctype\u003ecompose\u003c/type\u003e\n                    \u003cbasedir\u003esrc/main/docker\u003c/basedir\u003e\n                    \u003ccomposeFile\u003edocker-compose.yml\u003c/composeFile\u003e\n                \u003c/external\u003e\n                \u003crun\u003e\n                    \u003cwait\u003e\n                        \u003chttp\u003e\n                            \u003curl\u003ehttp://127.0.0.1:8004/find-all-greetings/ready\u003c/url\u003e\n                            \u003cmethod\u003eGET\u003c/method\u003e\n                            \u003cstatus\u003e200\u003c/status\u003e\n                        \u003c/http\u003e\n                        \u003ctime\u003e100000\u003c/time\u003e\n                    \u003c/wait\u003e\n                \u003c/run\u003e\n            \u003c/image\u003e\n        \u003c/images\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### run with fabric8\n\nbuild jib docker images and run everything using `fabric8` maven docker-compose\n\n```bash\n./mvnw clean package jib:dockerBuild\n./mvnw -f docker-compose -Pstart\nhttp :8004/find-all-hello\nhttp :8004/find-all-greetings\n./mvnw -f docker-compose -Pstop\n```\n\n## dkanejs docker-compose-maven-plugin\n\n### dkanejs configuration\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003ecom.dkanejs.maven.plugins\u003c/groupId\u003e\n    \u003cartifactId\u003edocker-compose-maven-plugin\u003c/artifactId\u003e\n    \u003cversion\u003e${docker-compose-maven-plugin.version}\u003c/version\u003e\n    \u003cconfiguration\u003e\n        \u003cdetail\u003etrue\u003c/detail\u003e\n        \u003cverbose\u003efalse\u003c/verbose\u003e\n        \u003cdetachedMode\u003etrue\u003c/detachedMode\u003e\n        \u003cignorePullFailures\u003etrue\u003c/ignorePullFailures\u003e\n        \u003cremoveImagesType\u003elocal\u003c/removeImagesType\u003e\n        \u003cremoveImages\u003etrue\u003c/removeImages\u003e\n        \u003cremoveOrphans\u003etrue\u003c/removeOrphans\u003e\n        \u003cremoveVolumes\u003etrue\u003c/removeVolumes\u003e\n        \u003ccomposeFile\u003e${project.basedir}/src/main/docker/docker-compose.yaml\u003c/composeFile\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### run using dkanejs docker-compose-maven-plugin\n\nbuild jib docker images and run everything using `dkanejs` docker-compose-maven-plugin\n\n```bash\n./mvnw clean package jib:dockerBuild\n./mvnw -f docker-compose -Pup\nhttp :8004/find-all-hello\nhttp :8004/find-all-greetings\n./mvnw -f docker-compose -Pdown\n```\n\n## k8s + skaffold\n\n### k8s\n\nprepared kubernetes resources can be found in [k8s](./k8s/) folder\n\n### skaffold\n\nwith k8s based on docker for mac / windows\n\n```bash\nbrew reinstall skaffold\nskaffold init --skip-build\nvi ./skaffold.yaml\n# ...\nskaffold dev --cache-artifacts=false\nhttp :30001/info\nhttp :30003/info\nhttp :30004/info\nhttp :30004/find-all-hello\nhttp :30004/find-all-greetings\n# ...\nskaffold delete\n```\n\n## k8s nginx ingress for Docker for Mac\n\n### nginx ingress default backend\n\nDefault backend for fronted application or main micro-services gateway,\nsee `k8s/ingress/ingress-docker-for-mac-nginx-default-backend.yaml` k8s resources file for details\n\n```bash\n# enable Kubernetes cluster in DOcker for Mac / Windows...\n# watch pods...\nkubectl get pods --all-namespaces -o wide -w \u0026\n# deploy cloud native micro-services apps and ingress\nkubectl apply -f k8s/\nkubectl apply -f k8s/ingress/ingress-docker-for-mac-nginx-default-backend.yaml\n# wait more...\nsleep 120s\n# test if everything is working\nhttp :/actuator/health\nhttp :/actuator/info\nhttp :/\nhttp :/info\nhttp :/find-all-hello\nhttp :/find-all-greetings\nhttp :/find-all-greetings/ololo-trololo\n# cleanup\nkubectl delete -f k8s/\nkubectl delete -f k8s/ingress/\n```\n\n### nginx ingress rewrite-target\n\nDefault backend with some rewrite targets,\nsee `k8s/ingress/ingress-docker-for-mac-nginx-rewrite-target.yaml` k8s resources file for details\n\n```bash\n# enable Kubernetes cluster in DOcker for Mac / Windows...\n# watch pods...\nkubectl get pods --all-namespaces -o wide -w \u0026\n# deploy cloud native micro-services apps and ingress\nkubectl apply -f k8s/\nkubectl apply -f k8s/ingress/ingress-docker-for-mac-nginx-rewrite-target.yaml\n# wait more...\nsleep 120s\n# test if everything is working\nhttp :/actuator/health\nhttp :/actuator/info\nhttp :/\nhttp :/info\nhttp :/find-all-hello\nhttp :/find-all-greetings\nhttp :/find-all-greetings/ololo-trololo\n# cleanup\nkubectl delete -f k8s/\nkubectl delete -f k8s/ingress/\n```\n\n## k8s traefik ingress for k3d k3s\n\n### traefik ingress default backend\n\nDefault backend for fronted application or main micro-services gateway,\nsee `k8s/ingress/ingress-traefik-default-backend.yaml` k8s resources file for details\n\n```bash\n# create k3s k8s cluster by using k3d tool (k3s in docker) with published port: 80\nk3d create --name k3s --api-port 6551 --publish 80:80 --workers 1\n# wait few moments\nsleep 5s\n# point kubectl to created k3s\nexport KUBECONFIG=\"$(k3d get-kubeconfig --name='k3s')\"\n# watch pods\nkubectl get pods --all-namespaces -o wide -w \u0026\n# deploy cloud native micro-services apps and ingress\nkubectl apply -f k8s/\nkubectl apply -f k8s/ingress/ingress-traefik-default-backend.yaml\n# wait more...\nsleep 120s\n# test if everything is working\nhttp :/actuator/health\nhttp :/actuator/info\nhttp :/\nhttp :/info\nhttp :/find-all-hello\nhttp :/find-all-greetings\nhttp :/find-all-greetings/ololo-trololo\n# cleanup\nkubectl delete -f k8s/\nkubectl delete -f k8s/ingress/\nk3d stop --name=k3s -a\ndocker rm -f -v `docker ps -a -q`\nrm -rf ~/.config/k3d/k3s\n```\n\n### traefik ingress PathPrefixStrip\n\nDefault backend with some rewrite targets,\nsee `k8s/ingress/ingress-traefik-path-prefix-strip.yaml` k8s resources file for details\n\n```bash\n# create k3s k8s cluster by using k3d tool (k3s in docker) with published port: 80\nk3d create --name k3s --api-port 6551 --publish 80:80 --workers 1\n# wait few moments\nsleep 5s\n# point kubectl to created k3s\nexport KUBECONFIG=\"$(k3d get-kubeconfig --name='k3s')\"\n# watch pods\nkubectl get pods --all-namespaces -o wide -w \u0026\n# deploy cloud native micro-services apps and ingress\nkubectl apply -f k8s/\nkubectl apply -f k8s/ingress/ingress-traefik-path-prefix-strip.yaml\n# wait more...\nsleep 120s\n# test if everything is working\nhttp :/info\nhttp :/greeting/info\nhttp :/hello/info\n# cleanup\nkubectl delete -f k8s/\nkubectl delete -f k8s/ingress/\nk3d stop --name=k3s -a\ndocker rm -f -v `docker ps -a -q`\nrm -rf ~/.config/k3d/k3s\n```\n\nCheck [k8s](./k8s/) folder and [.travis.yml](.travis.yml) file for details...\n\n## release and publish docker hub\n\n```bash\n./mvnw release:clean release:prepare release:perform --batch-mode ; ./mvnw package jib:build\n# ./mvnw release:rollback\n```\n\n## resources\n\n* [traefik-ingress rewrite](https://docs.traefik.io/v1.7/user-guide/kubernetes/#path-based-routing)\n* [GitHub: rancher/k3d](https://github.com/rancher/k3d)\n* [GitHub: rancher/k3s](https://github.com/rancher/k3s)\n* [k3s reference](https://rancher.com/docs/k3s/latest/en/)\n* [nginx-ingress rewrite](https://kubernetes.github.io/ingress-nginx/examples/rewrite/)\n* [ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)\n* [nginx-ingress: common](https://kubernetes.github.io/ingress-nginx/deploy/#prerequisite-generic-deployment-command)\n* [nginx-ingress: docker for mac / windows](https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac)\n* [nginx-ingress: bare-metal](https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal)\n* [k8s ingress controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)\n* [k8s ingress minikube](https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/)\n* [k8s service type: LoadBalancer](https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer)\n* [k8s service type: NodePort](https://kubernetes.io/docs/concepts/services-networking/service/#nodeport)\n* [Quarkus skaffold](https://medium.com/@dav.poletti/quarkus-development-mode-with-kubernetes-and-skaffold-ea17621e168)\n* [multi skaffold](https://github.com/GoogleContainerTools/skaffold/blob/master/examples/jib-multimodule/skaffold.yaml)\n* [Spring WebFlux WebFilter](https://www.baeldung.com/spring-webflux-filters#1-webfilter)\n* [spring-boot k8s](https://dzone.com/articles/developing-a-spring-boot-application-for-kubernete-4)\n* [spring k8s](https://dzone.com/articles/quick-guide-to-microservices-with-kubernetes-sprin)\n* [fabric8 docker-compose wait](https://github.com/fabric8io/docker-maven-plugin/issues/1118)\n* [Shell in jib](https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#where-is-bash)\n* [Using jib](https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-would-a-dockerfile-for-a-jib-built-image-look-like)\n* [Using skaffold](https://github.com/daggerok/boot-skaffold)\n* [Using maven-release-plugin](https://github.com/daggerok/es-cqrs)\n* [R2DBC H2](https://github.com/spring-projects-experimental/spring-boot-r2dbc#h2-embedded)\n* [R2DBC example](https://github.com/spring-projects-experimental/spring-boot-r2dbc/tree/master/spring-boot-example-h2)\n* [R2DBC Homepage](https://r2dbc.io)\n* [Spring Data R2DBC [Experimental]](https://docs.spring.io/spring-data/r2dbc/docs/1.0.x/reference/html/#reference)\n* [Spring Configuration Processor](https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/htmlsingle/#configuration-metadata-annotation-processor)\n* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/maven-plugin/)\n* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaggerok%2Fk8s-ingress-explained","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaggerok%2Fk8s-ingress-explained","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaggerok%2Fk8s-ingress-explained/lists"}