{"id":13441346,"url":"https://github.com/zalando/skipper","last_synced_at":"2026-04-13T19:01:08.880Z","repository":{"id":34825032,"uuid":"38812664","full_name":"zalando/skipper","owner":"zalando","description":"An HTTP router and reverse proxy for service composition, including use cases like Kubernetes Ingress","archived":false,"fork":false,"pushed_at":"2026-04-07T17:16:37.000Z","size":17996,"stargazers_count":3264,"open_issues_count":316,"forks_count":384,"subscribers_count":67,"default_branch":"master","last_synced_at":"2026-04-07T17:27:40.557Z","etag":null,"topics":["cloud","eskip","etcd","go","http-proxy","ingress-controller","kubernetes","kubernetes-controller","kubernetes-ingress","mosaic","proxy","router","skipper"],"latest_commit_sha":null,"homepage":"https://opensource.zalando.com/skipper/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zalando.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":"MAINTAINERS","copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2015-07-09T09:54:40.000Z","updated_at":"2026-04-07T17:16:16.000Z","dependencies_parsed_at":"2026-02-25T12:01:23.169Z","dependency_job_id":null,"html_url":"https://github.com/zalando/skipper","commit_stats":{"total_commits":1950,"total_committers":181,"mean_commits":"10.773480662983426","dds":0.7769230769230769,"last_synced_commit":"4711a818a8111dba779183250336b41180fc75ef"},"previous_names":[],"tags_count":2064,"template":false,"template_full_name":null,"purl":"pkg:github/zalando/skipper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zalando%2Fskipper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zalando%2Fskipper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zalando%2Fskipper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zalando%2Fskipper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zalando","download_url":"https://codeload.github.com/zalando/skipper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zalando%2Fskipper/sbom","scorecard":{"id":354906,"data":{"date":"2025-08-12T13:37:07Z","repo":{"name":"github.com/zalando/skipper","commit":"da2e1ed13e9cbc24704618ab2cdfeefa19637c35"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":8.3,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":3,"reason":"Found 5/14 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:27","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/codeql-analysis.yml:30","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/docs.yaml:16","Info: jobLevel 'contents' permission set to 'read': .github/workflows/gh-packages.yaml:21","Info: jobLevel 'actions' permission set to 'read': .github/workflows/gh-packages.yaml:22","Info: jobLevel 'contents' permission set to 'read': .github/workflows/master.yaml:13","Info: topLevel permissions set to 'read-all': .github/workflows/cflite_pr.yaml:6","Info: found token with 'none' permissions: .github/workflows/codeql-analysis.yml:1","Info: found token with 'none' permissions: .github/workflows/docs.yaml:1","Info: found token with 'none' permissions: .github/workflows/gh-packages.yaml:1","Info: found token with 'none' permissions: .github/workflows/master.yaml:1","Info: topLevel permissions set to 'read-all': .github/workflows/openssf-scorecard.yaml:18","Info: topLevel 'contents' permission set to 'read': .github/workflows/pr.yaml:4"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 14 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":8,"reason":"dependency not pinned by hash detected -- score normalized to 8","details":["Warn: containerImage not pinned by hash: packaging/Dockerfile:2","Warn: containerImage not pinned by hash: packaging/Dockerfile:3","Warn: pipCommand not pinned by hash: .github/workflows/docs.yaml:28","Info:  20 out of  20 GitHub-owned GitHubAction dependencies pinned","Info:  12 out of  12 third-party GitHubAction dependencies pinned","Info:   1 out of   1 goCommand dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned","Info:   5 out of   7 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3829"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":8,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 14 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: ClusterFuzzLite integration found","Info: OSSFuzz integration found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/gh-packages.yaml:14"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.22.87 not signed: https://api.github.com/repos/zalando/skipper/releases/239029806","Warn: release artifact v0.22.86 not signed: https://api.github.com/repos/zalando/skipper/releases/238958391","Warn: release artifact v0.22.85 not signed: https://api.github.com/repos/zalando/skipper/releases/238636357","Warn: release artifact v0.22.84 not signed: https://api.github.com/repos/zalando/skipper/releases/238546741","Warn: release artifact v0.22.83 not signed: https://api.github.com/repos/zalando/skipper/releases/237314361","Warn: release artifact v0.22.87 does not have provenance: https://api.github.com/repos/zalando/skipper/releases/239029806","Warn: release artifact v0.22.86 does not have provenance: https://api.github.com/repos/zalando/skipper/releases/238958391","Warn: release artifact v0.22.85 does not have provenance: https://api.github.com/repos/zalando/skipper/releases/238636357","Warn: release artifact v0.22.84 does not have provenance: https://api.github.com/repos/zalando/skipper/releases/238546741","Warn: release artifact v0.22.83 does not have provenance: https://api.github.com/repos/zalando/skipper/releases/237314361"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}},{"name":"Contributors","score":10,"reason":"project has 26 contributing companies or organizations","details":["Info: found contributions from: Softcatala, TicketSwap, apertium, atlassian, boardgamers, cncf, commercetools, deliveryhero, freenowtech, gradle, grafana, grafana labs, iasijs, imagespy, kubernetes, magefree, newpointer, open-telemetry, prometheus, scala-turkiye, ticketswap, zalando, zalando lounge, zalando se, zalando-incubator, zalando-stups"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}}]},"last_synced_at":"2025-08-18T09:17:30.523Z","repository_id":34825032,"created_at":"2025-08-18T09:17:30.523Z","updated_at":"2025-08-18T09:17:30.523Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31766482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T15:25:13.801Z","status":"ssl_error","status_checked_at":"2026-04-13T15:25:09.162Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","eskip","etcd","go","http-proxy","ingress-controller","kubernetes","kubernetes-controller","kubernetes-ingress","mosaic","proxy","router","skipper"],"created_at":"2024-07-31T03:01:32.888Z","updated_at":"2026-04-13T19:01:08.849Z","avatar_url":"https://github.com/zalando.png","language":"Go","readme":"[![Build Status](https://github.com/zalando/skipper/actions/workflows/master.yaml/badge.svg)](https://github.com/zalando/skipper/actions/workflows/master.yaml)\n[![Doc](https://img.shields.io/badge/user-documentation-darkblue.svg)](https://opensource.zalando.com/skipper)\n[![Go Reference](https://pkg.go.dev/badge/github.com/zalando/skipper.svg)](https://pkg.go.dev/github.com/zalando/skipper)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Go Report Card](https://goreportcard.com/badge/zalando/skipper)](https://goreportcard.com/report/zalando/skipper)\n[![Coverage Status](https://coveralls.io/repos/github/zalando/skipper/badge.svg?branch=master)](https://coveralls.io/github/zalando/skipper?branch=master)\n[![GitHub release](https://img.shields.io/github/release/zalando/skipper.svg)](https://github.com/zalando/skipper/releases)\n[![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/2461/badge)](https://bestpractices.coreinfrastructure.org/en/projects/2461)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/zalando/skipper/badge)](https://api.securityscorecards.dev/projects/github.com/zalando/skipper)\n[![Slack](https://img.shields.io/badge/Gopher%20Slack-%23skipper-green.svg)](https://invite.slack.golangbridge.org/)\n![CodeQL](https://github.com/zalando/skipper/actions/workflows/codeql-analysis.yml/badge.svg)\n\n\n\u003cp\u003e\u003cimg height=\"180\" alt=\"Skipper\" src=\"https://raw.githubusercontent.com/zalando/skipper/master/img/skipper-h180.png\"\u003e\u003c/p\u003e\n\n# Skipper\n\nSkipper is an HTTP router and reverse proxy for service composition. It's designed to handle \u003e300k HTTP route\ndefinitions with detailed lookup conditions, and flexible augmentation of the request flow with filters. It can be\nused out of the box or extended with custom lookup, filter logic and configuration sources.\n\n## Main features:\n\nAn overview of [deployments and data-clients](https://opensource.zalando.com/skipper/operation/deployment/)\nshows some use cases to run skipper.\n\nSkipper\n\n- identifies routes based on the requests' properties, such as path, method, host and headers\n- allows modification of the requests and responses with filters that are independently configured for each route\n- simultaneously streams incoming requests and backend responses\n- optionally acts as a final endpoint (shunt), e.g. as a static file server or a mock backend for diagnostics\n- updates routing rules without downtime, while supporting multiple types of data sources — including\n  [etcd](https://github.com/coreos/etcd), [Kubernetes Ingress](https://opensource.zalando.com/skipper/data-clients/kubernetes/), [static files](https://opensource.zalando.com/skipper/data-clients/eskip-file/), [route string](https://opensource.zalando.com/skipper/data-clients/route-string/) and\n  [custom configuration sources](https://opensource.zalando.com/skipper/tutorials/development/#dataclients)\n- can serve as a\n  [Kubernetes Ingress controller](https://zalando.github.io/skipper/data-clients/kubernetes/)\n  without reloads. You can use it in combination with a controller that will route public traffic to\n  your skipper fleet; [see AWS example](https://github.com/zalando-incubator/kube-ingress-aws-controller)\n- shipped with\n   - eskip: a descriptive configuration language designed for routing\n     rules\n   - routesrv: proxy to omit kube-apiserver overload leveraging Etag\n     header to reduce amount of CPU used in your skipper data plane\n   - webhook: Kubernetes validation webhook to make sure your\n     manifests are deployed safely\n\nSkipper provides a default executable command with a few built-in filters. However, its primary use case is to\nbe extended with custom filters, predicates or data sources. [Go here for additional documentation](https://pkg.go.dev/github.com/zalando/skipper).\n\nA few examples for extending Skipper:\n\n- Example proxy with custom filter https://github.com/szuecs/skipper-example-proxy\n- Image server https://github.com/zalando-stups/skrop\n- Plugins repository https://github.com/skipper-plugins/, [plugin docs](https://opensource.zalando.com/skipper/reference/plugins/)\n\n### Getting Started\n\n#### Prerequisites/Requirements\n\nIn order to build and run Skipper, only the latest version of Go needs to be installed. Skipper can use\nInnkeeper or Etcd as data sources for routes, or for the simplest cases, a local configuration file. See more\ndetails in the documentation: https://pkg.go.dev/github.com/zalando/skipper\n\n\n#### Installation\n\n##### From Binary\n\nDownload binary tgz from https://github.com/zalando/skipper/releases/latest\n\nExample, assumes that you have $GOBIN set to a directory that exists\nand is in your $PATH:\n\n```\n% curl -LO https://github.com/zalando/skipper/releases/download/v0.14.8/skipper-v0.14.8-linux-amd64.tar.gz\n% tar xzf skipper-v0.14.8-linux-amd64.tar.gz\n% mv skipper-v0.14.8-linux-amd64/* $GOBIN/\n% skipper -version\nSkipper version v0.14.8 (commit: 95057948, runtime: go1.19.1)\n```\n\n##### From Source\n\n\n```\n% git clone https://github.com/zalando/skipper.git\n% make\n% ./bin/skipper -version\nSkipper version v0.14.8 (commit: 95057948, runtime: go1.19.3)\n```\n\n#### Running\n\nCreate a file with a route:\n\n    echo 'hello: Path(\"/hello\") -\u003e \"https://www.example.org\"' \u003e example.eskip\n\nOptionally, verify the file's syntax:\n\n    eskip check example.eskip\n\nIf no errors are detected nothing is logged, else a descriptive error is logged.\n\nStart Skipper and make an HTTP request:\n\n    skipper -routes-file example.eskip \u0026\n    curl localhost:9090/hello\n\n##### Docker\n\nTo run the latest Docker container:\n\n    docker run registry.opensource.zalan.do/teapot/skipper:latest\n\nTo run `eskip` you first mount the `.eskip` file, into the container, and run the command\n\n    docker run \\\n      -v $(PWD)/doc-docker-intro.eskip:/doc-docker-intro.eskip \\\n      registry.opensource.zalan.do/teapot/skipper:latest eskip print doc-docker-intro.eskip\n\nTo run `skipper` you first mount the `.eskip` file, into the container, expose the ports and run the command\n\n    docker run -it \\\n        -v $(PWD)/doc-docker-intro.eskip:/doc-docker-intro.eskip \\\n        -p 9090:9090 \\\n        -p 9911:9911 \\\n        registry.opensource.zalan.do/teapot/skipper:latest skipper -routes-file doc-docker-intro.eskip\n\nSkipper will then be available on http://localhost:9090\n\n#### Authentication Proxy\n\nSkipper can be used as an authentication proxy, to check incoming\nrequests with Basic auth or an OAuth2 provider or an OpenID Connect\nprovider including audit logging. See the documentation at:\n[https://pkg.go.dev/github.com/zalando/skipper/filters/auth](https://pkg.go.dev/github.com/zalando/skipper/filters/auth).\n\n\n#### Working with the code\n\nGetting the code with the test dependencies (`-t` switch):\n\n    git clone https://github.com/zalando/skipper.git\n    cd skipper\n\nBuild and test all packages:\n\n    make deps\n    make install\n    make lint\n    make shortcheck\n\n\u003e On Mac the tests may fail because of low max open file limit. Please make sure you have correct limits setup\nby following [these instructions](https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c).\n\n##### Working from IntelliJ / GoLand\n\nTo run or debug skipper from _IntelliJ IDEA_ or _GoLand_, you need to create this configuration:\n\n| Parameter         | Value                                    |\n|-------------------|------------------------------------------|\n| Template          | Go Build                                 |\n| Run kind          | Directory                                |\n| Directory         | skipper source dir + `/cmd/skipper`      |\n| Working directory | skipper source dir (usually the default) |\n\n#### Kubernetes Ingress\n\nSkipper can be used to run as an Kubernetes Ingress controller.\n[Details with examples](https://opensource.zalando.com/skipper/data-clients/kubernetes)\nof [Skipper's capabilities](https://opensource.zalando.com/skipper/data-clients/kubernetes/#why-to-choose-skipper) and an\n[overview](https://opensource.zalando.com/skipper/operation/deployment/#kubernetes-ingress)\nyou will can be found in our [ingress-controller deployment docs](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/).\n\nFor AWS integration, we provide an ingress controller\nhttps://github.com/zalando-incubator/kube-ingress-aws-controller, that\nmanage ALBs or NLBs in front of your skipper deployment.\nA [production example for skipper](https://github.com/zalando-incubator/kubernetes-on-aws/blob/stable/cluster/manifests/skipper/)\nand a [production example for kube-ingress-aws-controller](https://github.com/zalando-incubator/kubernetes-on-aws/tree/dev/cluster/manifests/ingress-controller/),\ncan be found in our Kubernetes configuration https://github.com/zalando-incubator/kubernetes-on-aws.\n\n- [Comparison with other Ingress controllers](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/#comparison-with-other-ingress-controllers)\n- [Comparison with service-mesh](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/#comparison-with-service-mesh)\n\n### Documentation\n\n[Skipper's Documentation](https://opensource.zalando.com/skipper) and\n[Godoc developer documentation](https://pkg.go.dev/github.com/zalando/skipper),\nincludes information about [deployment use cases](https://opensource.zalando.com/skipper/operation/deployment/)\nand detailed information on these topics:\n\n- The [Routing](https://pkg.go.dev/github.com/zalando/skipper/routing) Mechanism\n- [Matching Requests](https://opensource.zalando.com/skipper/tutorials/basics/#route-matching)\n- [Filters](https://opensource.zalando.com/skipper/reference/filters/) - Augmenting Requests and Responses\n- [Predicates](https://opensource.zalando.com/skipper/reference/predicates/) - additional predicates to match a route\n- Service [Backends](https://opensource.zalando.com/skipper/reference/backends/)\n- Route Definitions fetched by dataclients:\n   - [route string](https://opensource.zalando.com/skipper/data-clients/route-string/)\n   - [eskip file](https://opensource.zalando.com/skipper/data-clients/eskip-file/)\n   - [remote eskip](https://opensource.zalando.com/skipper/data-clients/eskip-remote/)\n   - [etcd](https://opensource.zalando.com/skipper/data-clients/etcd/)\n   - [kubernetes](https://opensource.zalando.com/skipper/data-clients/kubernetes/)\n- [Circuit Breakers](https://pkg.go.dev/github.com/zalando/skipper/filters/circuit)\n- Extending It with Custom [Predicates](https://opensource.zalando.com/skipper/tutorials/development/#predicates), [Filters](https://opensource.zalando.com/skipper/tutorials/development/#filters), can be done by [building your own proxy](https://opensource.zalando.com/skipper/tutorials/built-your-own/), [Plugins](https://opensource.zalando.com/skipper/reference/plugins/) or [Lua Scripts](https://opensource.zalando.com/skipper/reference/scripts/)\n- [Proxy Package](https://pkg.go.dev/github.com/zalando/skipper/proxy)\n- [Logging](https://pkg.go.dev/github.com/zalando/skipper/logging) and [Metrics](https://pkg.go.dev/github.com/zalando/skipper/metrics)\n- [Operations guide](https://opensource.zalando.com/skipper/operation/operation/)\n- [Authentication and Authorization](https://opensource.zalando.com/skipper/reference/filters/#authentication-and-authorization)\n- [Load Shedders](https://opensource.zalando.com/skipper/reference/filters/#load-shedding)\n- [Rate Limiters](https://pkg.go.dev/github.com/zalando/skipper/filters/ratelimit)\n- [Opentracing tracers](https://pkg.go.dev/github.com/zalando/skipper/tracing/tracers) or extend [create your own](https://opensource.zalando.com/skipper/reference/plugins/#opentracing-plugins)\n\n#### 1 Minute Skipper introduction\n\nThe following example shows a skipper routes file in eskip format, that has 3 named routes: baidu, google and yandex.\n\n    % cat doc-1min-intro.eskip\n    baidu:\n            Path(\"/baidu\")\n            -\u003e setRequestHeader(\"Host\", \"www.baidu.com\")\n            -\u003e setPath(\"/s\")\n            -\u003e setQuery(\"wd\", \"godoc skipper\")\n            -\u003e \"http://www.baidu.com\";\n    google:\n            *\n            -\u003e setPath(\"/search\")\n            -\u003e setQuery(\"q\", \"godoc skipper\")\n            -\u003e \"https://www.google.com\";\n    yandex:\n            * \u0026\u0026 Cookie(\"yandex\", \"true\")\n            -\u003e setPath(\"/search/\")\n            -\u003e setQuery(\"text\", \"godoc skipper\")\n            -\u003e tee(\"http://127.0.0.1:12345/\")\n            -\u003e \"https://yandex.ru\";\n\nMatching the route:\n\n- baidu is using `Path()` matching to differentiate the HTTP requests to select the route.\n- google is the default matching with wildcard `*`\n- yandex is the default matching with wildcard `*` if you have a cookie `yandex=true`\n\nRequest Filters:\n\n- If baidu is selected, skipper sets the Host header, changes the path and sets a query string to the http request to the backend \"http://www.baidu.com\".\n- If google is selected, skipper changes the path and sets a query string to the http request to the backend \"https://www.google.com\".\n- If yandex is selected, skipper changes the path and sets a query string to the http request to the backend \"https://yandex.ru\". The modified request will be copied to \"http://127.0.0.1:12345/\"\n\nRun skipper with the routes file doc-1min-intro.eskip shown above\n\n    % skipper -routes-file doc-1min-intro.eskip\n\nTo test each route you can use curl:\n\n    % curl -v localhost:9090/baidu\n    % curl -v localhost:9090/\n    % curl -v --cookie \"yandex=true\" localhost:9090/\n\nTo see the shadow traffic request that is made by the `tee()` filter you can use nc:\n\n    [terminal1]% nc -l 12345\n    [terminal2]% curl -v --cookie \"yandex=true\" localhost:9090/\n\n#### 3 Minutes Skipper in Kubernetes introduction\n\nThis introduction was [moved to ingress controller documentation](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/#install-skipper-as-ingress-controller).\n\nFor More details, please check out our [Kubernetes ingress controller docs](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/), our [ingress usage](https://opensource.zalando.com/skipper/kubernetes/ingress-usage/) and how to handle [common backend problems in Kubernetes](https://opensource.zalando.com/skipper/kubernetes/ingress-backends/).\n\n### Packaging support\n\nSee https://github.com/zalando/skipper/blob/master/packaging/readme.md\n\nIn case you want to implement and link your own modules into your\nskipper, there is https://github.com/skipper-plugins organization to\nenable you to do so. In order to explain you the build process with\ncustom Go modules there is\nhttps://github.com/skipper-plugins/skipper-tracing-build, that was\nused to build skipper's [opentracing package](https://github.com/skipper-plugins/opentracing).\nWe moved the opentracing plugin source into the `tracing` package, so\nthere is no need to use plugins for this case.\n\nBecause Go plugins are not very well supported by Go itself we do not\nrecommend to use plugins, but you can extend skipper and\n[build your own proxy](https://opensource.zalando.com/skipper/tutorials/built-your-own/).\n\n## Community\n\nUser or developer questions can be asked in our [public Google Group](https://groups.google.com/forum/#!forum/skipper-router)\n\nWe have a slack channel #skipper in gophers.slack.com. Get an [invite](https://invite.slack.golangbridge.org).\nIf for some reason this link doesn't work, you can read the [information about the gophers communities](https://github.com/gobridge/about-us/blob/master/README.md#onlineoffline-communities).\n\nThe preferred communication channel is the slack channel, because the google group is a manual process to add members.\nFeel also free to [create an issue](https://github.com/zalando/skipper/issues/new/choose), if you dislike chat and post your questions there.\n\n### Proposals\n\nWe do our proposals open in [Skipper's Google drive](https://drive.google.com/drive/folders/0B9LwJMF9koB-ZEk4bEhZal9uOWM).\nIf you want to make a proposal feel free to create an\n[issue](https://github.com/zalando/skipper/issues) and if it is a\nbigger change we will invite you to a document, such that we can work together.\n\n### Users\n\nZalando used this project as shop frontend http router with 350000 routes.\nWe use it as Kubernetes ingress controller in more than 100 production clusters. With every day traffic between 500k and 7M RPS serving 15000 ingress and 3750 RouteGroups at less than ¢5/1M requests.\nWe also run several custom skipper instances that use skipper as library.\n\nSergio Ballesteros from [spotahome](https://www.spotahome.com/) said 2018:\n\u003e We also ran tests with several ingress controllers and skipper gave us the more reliable results. Currently we are running skipper since almost 2 years with like 20K Ingress rules.\n\u003e The fact that skipper is written in go let us understand the code, add features and fix bugs since all of our infra stack is golang.\n\n#### In the media\n\nBlog posts:\n\n- [opensource.com - Try this Kubernetes HTTP router and reverse proxy](https://opensource.com/article/20/4/http-kubernetes-skipper)\n- [opensource.com - An open source HTTP router to increase your network visibility](https://opensource.com/article/20/5/skipper)\n- [Building our own open source http routing\n  solution](https://jobs.zalando.com/tech/blog/building-our-own-open-source-http-routing-solution/):\n  Giving some context about why Skipper was created in the first place.\n- [Kubernetes in production @ ShopGun](https://itnext.io/kubernetes-in-production-shopgun-2c280f0c0923)\n- Hacker News [Skipper – An HTTP router and reverse proxy for service composition](https://news.ycombinator.com/item?id=18837936)\n\nConference/Meetups talks\n\n- [LISA 2018 - modern HTTP routing](https://www.usenix.org/conference/lisa18/presentation/szucs)\n\n## Version promise\n\nSkipper will update the minor version in case we have either:\n\n- a significant change\n- a Go version requirement change (`go` directive in go.mod change)\n- a dependency change that adds or removes a `replace` directive in\n  go.mod file (requires library users to add or remove the same\n  directive in their go.mod file)\n- a change that require attention to users, for example Kubernetes\n  RBAC changes required to deploy\n  https://github.com/zalando/skipper/releases/tag/v0.18.0\n- a feature removal like Kubernetes ingress v1beta1\n  https://github.com/zalando/skipper/releases/tag/v0.15.0\n- an API change of a function that is marked *experimental* [example](https://github.com/zalando/skipper/blob/e8c099f1740e3d85be0784d449b1177a48247813/io/read_stream.go#L209)\n\nWe expect that skipper library users will use\n`skipper.Run(skipper.Options{})` as main interface that we do not want\nto break. Besides the Kubernetes v1beta1 removal there was never a\nchange that removed an option. We also do not want to break generic\nuseful packages like `net`. Sometimes we mark library functions, that\nwe expect to be useful as *experimental*, because we want to try and\nlearn over time if this is a good API decision or if this limits us.\n\nThis promise we hold considering the main, filter, predicate,\ndataclient, eskip interfaces and generic packages. For other packages,\nwe have more weak promise with backwards compatibility as these are\nmore internal packages. We try to omit breaking changes also in\ninternal packages. If this would mean too much work or impossible\nto build new functionality as we would like, we will do a breaking\nchange considering strictly semantic versioning rules.\n\n### How to update\n\nEvery update that changes the minor version (the `m` in `v0.m.p`),\nshould be done by `+1` only. So `v0.N.x` to `v0.N+1.y` and you should\nread `v0.N+1.0` release page to see what can break and what you have\nto do in order to have no issues while updating.\n","funding_links":[],"categories":["HarmonyOS","Load balancing","Load Balancing \u0026 Ingress","Gateways","Go","Capabilities","Network","Repositories","NetWork"],"sub_categories":["Windows Manager","[Jenkins](#jenkins)","Vectors","API Gateways / Edge Services","LoadBalancers"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzalando%2Fskipper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzalando%2Fskipper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzalando%2Fskipper/lists"}