{"id":13509834,"url":"https://github.com/inlets/inlets-operator","last_synced_at":"2026-02-24T17:08:44.878Z","repository":{"id":35468778,"uuid":"208065018","full_name":"inlets/inlets-operator","owner":"inlets","description":"Get public TCP LoadBalancers for local Kubernetes clusters","archived":false,"fork":false,"pushed_at":"2025-11-20T09:52:26.000Z","size":22822,"stargazers_count":1407,"open_issues_count":7,"forks_count":99,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-11-20T10:22:24.404Z","etag":null,"topics":["cloud-native","devops","encrypted","hacktoberfest","k3d","kind","kubernetes","load-balancer","loadbalancer","local-cluster","minikube","nat-traversal","private-cloud","tcp","tunnel"],"latest_commit_sha":null,"homepage":"https://docs.inlets.dev/reference/inlets-operator","language":"Go","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/inlets.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"alexellis"}},"created_at":"2019-09-12T14:02:57.000Z","updated_at":"2025-11-20T09:49:33.000Z","dependencies_parsed_at":"2023-07-13T21:19:52.976Z","dependency_job_id":"30fe9cf3-e0b9-4286-9408-6385da7b2a7b","html_url":"https://github.com/inlets/inlets-operator","commit_stats":{"total_commits":348,"total_committers":24,"mean_commits":14.5,"dds":"0.16091954022988508","last_synced_commit":"dc84d35196e515bd3223856f0ff28d1218f2fd5d"},"previous_names":["alexellis/inlets-operator"],"tags_count":88,"template":false,"template_full_name":null,"purl":"pkg:github/inlets/inlets-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inlets%2Finlets-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inlets%2Finlets-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inlets%2Finlets-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inlets%2Finlets-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inlets","download_url":"https://codeload.github.com/inlets/inlets-operator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inlets%2Finlets-operator/sbom","scorecard":{"id":489013,"data":{"date":"2025-08-11","repo":{"name":"github.com/inlets/inlets-operator","commit":"638b04c60fb91dd71aecf6d7122844b25974e94f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'pull-requests' permission set to 'read': .github/workflows/publish.yaml:16","Info: jobLevel 'repository-projects' permission set to 'read': .github/workflows/publish.yaml:17","Info: jobLevel 'statuses' permission set to 'read': .github/workflows/publish.yaml:18","Info: jobLevel 'actions' permission set to 'read': .github/workflows/publish.yaml:11","Warn: jobLevel 'checks' permission set to 'write': .github/workflows/publish.yaml:12","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yaml:13","Info: jobLevel 'issues' permission set to 'read': .github/workflows/publish.yaml:14","Warn: no topLevel permission defined: .github/workflows/build.yaml:1","Warn: no topLevel permission defined: .github/workflows/publish.yaml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/build.yaml:12"],"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/build.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yaml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/build.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/build.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/build.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/publish.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/publish.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/publish.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/publish.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish.yaml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/inlets/inlets-operator/publish.yaml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:2","Warn: containerImage not pinned by hash: Dockerfile:44: pin your Docker image by updating gcr.io/distroless/static:nonroot to gcr.io/distroless/static:nonroot@sha256:cdf4daaf154e3e27cfffc799c16f343a384228f38646928a1513d925f473cb46","Warn: goCommand not pinned by hash: vendor/github.com/json-iterator/go/build.sh:10","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of   1 goCommand 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/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0635","Warn: Project is vulnerable to: GO-2022-0646","Warn: Project is vulnerable to: GO-2025-3553 / GHSA-mh63-6h87-95cp","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T18:34:22.542Z","repository_id":35468778,"created_at":"2025-08-19T18:34:22.542Z","updated_at":"2025-08-19T18:34:22.542Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29337022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T16:00:30.228Z","status":"ssl_error","status_checked_at":"2026-02-11T16:00:25.398Z","response_time":97,"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-native","devops","encrypted","hacktoberfest","k3d","kind","kubernetes","load-balancer","loadbalancer","local-cluster","minikube","nat-traversal","private-cloud","tcp","tunnel"],"created_at":"2024-08-01T02:01:13.989Z","updated_at":"2026-02-24T17:08:44.870Z","avatar_url":"https://github.com/inlets.png","language":"Go","funding_links":["https://github.com/sponsors/alexellis"],"categories":["Go","Apps","NetWork","Networking for bare-metal cloud","Containers","kubernetes","Load Balancing \u0026 Ingress"],"sub_categories":["Container","Inactive projects"],"readme":"# inlets-operator\n\n[![build](https://github.com/inlets/inlets-operator/actions/workflows/build.yaml/badge.svg)](https://github.com/inlets/inlets-operator/actions/workflows/build.yaml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Go Report Card](https://goreportcard.com/badge/github.com/inlets/inlets-operator)](https://goreportcard.com/report/github.com/inlets/inlets-operator) [![Documentation](https://godoc.org/github.com/inlets/inlets-operator?status.svg)](http://godoc.org/github.com/inlets/inlets-operator)\n\nGet public TCP LoadBalancers for local Kubernetes clusters\n\nWhen using a managed [Kubernetes](https://kubernetes.io/) engine, you can expose a Service as a \"LoadBalancer\" and your cloud provider will provision a TCP cloud load balancer for you, and start routing traffic to the selected service inside your cluster. In other words, you get ingress to an otherwise internal service.\n\nThe inlets-operator brings that same experience to your local Kubernetes cluster by provisioning a VM on the public cloud and running an [inlets server](https://inlets.dev/) process there.\n\nWithin the cluster, it runs the [inlets client](https://inlets.dev/) as a Deployment, and once the two are connected, it updates the original service with the IP, just like a managed Kubernetes engine.\n\nDeleting the service or annotating it will cause the cloud VM to be deleted.\n\nSee also:\n\n* [Installation for different cloud providers](https://docs.inlets.dev/reference/inlets-operator/)\n* [Expose an Ingress Controller or Istio](#expose-an-ingress-controller-or-istio-ingress-gateway)\n* [Helm chart](/chart/inlets-operator/)\n* [Conceptual overview](#conceptual-overview)\n\n## Change any LoadBalancer from `\u003cpending\u003e` to a real IP\n\nOnce the inlets-operator is installed, any Service of type LoadBalancer will get an IP address, unless you exclude it with an annotation.\n\n```bash\nkubectl run nginx-1 --image=nginx --port=80 --restart=Always\nkubectl expose pod/nginx-1 --port=80 --type=LoadBalancer\n\n$ kubectl get services -w\nNAME               TYPE        CLUSTER-IP        EXTERNAL-IP       PORT(S)   AGE\nservice/nginx-1    ClusterIP   192.168.226.216   \u003cpending\u003e         80/TCP    78s\nservice/nginx-1    ClusterIP   192.168.226.216   104.248.163.242   80/TCP    78s\n```\n\nYou'll also find a Tunnel Custom Resource created for you:\n\n```bash\n$ kubectl get tunnels\n\nNAMESPACE   NAME             SERVICE   HOSTSTATUS     HOSTIP         HOSTID\ndefault     nginx-1-tunnel   nginx-1   provisioning                  342453649\ndefault     nginx-1-tunnel   nginx-1   active         178.62.64.13   342453649\n```\n\nWe recommend exposing an Ingress Controller or Istio Ingress Gateway, see also: [Expose an Ingress Controller](#expose-an-ingress-controller-or-istio-ingress-gateway)\n\n## Plays well with other LoadBalancers\n\nWant to create tunnels for all LoadBalancer services, but ignore one or two?\n\nWant to disable the inlets-operator for a particular Service? Add the annotation `operator.inlets.dev/manage` with a value of `0`.\n\n```bash\nkubectl annotate service nginx-1 operator.inlets.dev/manage=0\n```\n\nWant to ignore all services, then only create Tunnels for annotated ones?\n\nInstall the chart with `annotatedOnly: true`, then run:\n\n```bash\nkubectl annotate service nginx-1 operator.inlets.dev/manage=1\n```\n\n## Using IPVS for your Kubernetes networking?\n\nFor IPVS, you need to declare a Tunnel Custom Resource instead of using the LoadBalancer field.\n\n```yaml\napiVersion: operator.inlets.dev/v1alpha1\nkind: Tunnel\nmetadata:\n  name: nginx-1-tunnel\n  namespace: default\nspec:\n  serviceRef:\n    name: nginx-1\n    namespace: default\nstatus: {}\n```\n\nYou can pre-define the auth token for the tunnel if you need to:\n\n```yaml\nspec:\n  authTokenRef:\n    name: nginx-1-tunnel-token\n    namespace: default\n```\n\n## Who is this for?\n\nYour cluster could be running anywhere: on your laptop, in an on-premises datacenter, within a VM, or on your Raspberry Pi. Ingress and LoadBalancers are a core-building block of Kubernetes clusters, so Ingress is especially important if you:\n\n* run a private-cloud or a homelab\n* self-host applications and APIs\n* test and share work with colleagues or clients\n* want to build a realistic environment\n* integrate with webhooks and third-party APIs\n\nThere is no need to open a firewall port, set-up port-forwarding rules, configure dynamic DNS or any of the usual hacks. You will get a public IP and it will \"just work\" for any TCP traffic you may have.\n\n## How does it compare to other solutions?\n\n* There are no rate limits on connections or bandwidth limits\n* You can use your own DNS\n* You can use any IngressController or an Istio Ingress Gateway\n* You can take your IP address with you - wherever you go\n\nAny Service of type `LoadBalancer` can be exposed within a few seconds.\n\nSince exit-servers are created in your preferred cloud (around a dozen are supported already), you'll only have to pay for the cost of the VM, and where possible, the cheapest plan has already been selected for you. For example with Hetzner ([coming soon](https://github.com/inlets/inlets-operator/issues/115)) that's about 3 EUR / mo, and with DigitalOcean it comes in at around 5 USD - both of these VPSes come with generous bandwidth allowances, global regions and fast network access.\n\n## Conceptual overview\n\nIn this animation by [Ivan Velichko](https://iximiuz.com/en/posts/kubernetes-operator-pattern), you see the operator in action.\n\nIt detects a new Service of type LoadBalancer, provisions a VM in the cloud, and then updates the Service with the IP address of the VM.\n\n[![Demo GIF](https://iximiuz.com/kubernetes-operator-pattern/kube-operator-example-opt.gif)](https://iximiuz.com/en/posts/kubernetes-operator-pattern)\n\nThere's also a [video walk-through of exposing an Ingress Controller](https://www.youtube.com/watch?v=4wFSdNW-p4Q)\n\n## Installation\n\nRead the [installation instructions for different cloud providers](https://docs.inlets.dev/reference/inlets-operator/)\n\nThe image for this operator is multi-arch and supports both `x86_64` and `arm64`.\n\nSee also: [Helm chart](/chart/inlets-operator/)\n\n### Expose an Ingress Controller or Istio Ingress Gateway\n\nUnlike other solutions, this:\n\n* Integrates directly into Kubernetes\n* Gives you a TCP LoadBalancer, and updates its IP in `kubectl get svc`\n* Allows you to use any custom DNS you want\n* Works with LetsEncrypt\n\nConfiguring ingress:\n\n* [Expose Ingress Nginx or another IngressController](https://docs.inlets.dev/tutorial/kubernetes-ingress/)\n* [Expose an Istio Ingress Gateway](https://docs.inlets.dev/tutorial/istio-gateway/)\n* [Expose Traefik with K3s to the Internet](https://inlets.dev/blog/2021/12/06/expose-traefik.html)\n\n### Other use-cases\n\n* [Node.js microservice with Let's Encrypt](https://docs.inlets.dev/#/get-started/quickstart-ingresscontroller-cert-manager?id=expose-your-ingresscontroller-and-get-tls-from-letsencrypt)\n* [OpenFaaS with Let's Encrypt](https://inlets.dev/blog/2020/10/15/openfaas-public-endpoints.html)\n* [Docker Registry with Let's Encrypt](https://blog.alexellis.io/get-a-tls-enabled-docker-registry-in-5-minutes/)\n\n# Provider Pricing\n\nThe host [provisioning code](https://github.com/inlets/cloud-provision) used by the inlets-operator is shared with [inletsctl](https://github.com/inlets/inletsctl).\n\nTypically the code uses the smallest, and cheapest VM/instance type available which has a public and stable IPv4 address allocated to it.\n\nSupported providers include i.e. AWS EC2, GCE, DigitalOcean, Hetzner Cloud, Vultr, Linode, etc.\n\nYou can find provider-specific instructions here: [inlets-operator reference documentation](https://docs.inlets.dev/reference/inlets-operator/)\n\n\nContributions to add VM providers are welcome. Generally speaking \"serverless/container\" platforms do not suit the needs of inlets tunnel servers.\n\nInlets HTTP tunnel servers can also be run inside Kubernetes as Pods, exposed via Ingress.\n\n## Video walk-through\n\nIn this video walk-through Alex will guide you through creating a Kubernetes cluster on your laptop with KinD, then he'll install ingress-nginx (an IngressController), followed by cert-manager and then after the inlets-operator creates a LoadBalancer on the cloud, you'll see a TLS certificate obtained by LetsEncrypt.\n\n[![Video demo](https://img.youtube.com/vi/4wFSdNW-p4Q/hqdefault.jpg)](https://www.youtube.com/watch?v=4wFSdNW-p4Q)\n\nTutorial: [Tutorial: Expose a local IngressController with the inlets-operator](https://docs.inlets.dev/tutorial/kubernetes-ingress/)\n\n## Contributing\n\nContributions are welcome, see the [CONTRIBUTING.md](CONTRIBUTING.md) guide.\n\n## Also in this space\n\n- [inlets](https://inlets.dev) - L7 HTTP / L4 TCP tunnel which can tunnel any TCP traffic. One of the ways to deploy it is via the inlets-operator.\n- [MetalLB](https://github.com/metallb/metallb) - a LoadBalancer for private Kubernetes clusters, cannot expose services publicly\n- [kube-vip](https://kube-vip.io/) - a Kubernetes LoadBalancer similar to MetalLB, cannot expose services publicly\n- [Cloudflare Tunnel aka \"Argo\"](https://www.cloudflare.com/en-gb/products/tunnel/) - product from Cloudflare for Cloudflare customers and domains - K8s integration available through Cloudflare DNS and ingress controller. Not for use with existing Ingress Controllers, unable to provide LoadBalancer\n- [ngrok](https://ngrok.com) - a SasS tunnel service tool, restarts every 7 hours, limits connections per minute, SaaS-only, no K8s integration available, TCP tunnels can only use high/unconventional ports, can't be used with Ingress Controllers\n- [Wireguard](https://www.wireguard.com/) - a modern VPN for connecting whole hosts and networks. Does not expose HTTP or TCP ports publicly.\n- [Tailscale](https://tailscale.com/) - a managed SaaS VPN that is built upon Wireguard.\n\n## Author / vendor\n\ninlets and the inlets-operator are brought to you by [OpenFaaS Ltd](https://www.openfaas.com).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finlets%2Finlets-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finlets%2Finlets-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finlets%2Finlets-operator/lists"}