├── .github ├── ISSUE_TEMPLATE │ └── feature_template.md ├── dependabot.yml ├── golangci-lint.yaml └── workflows │ └── docs.yaml ├── .gitignore ├── CONTRIBUTING.md ├── LAYOUT.md ├── LICENSE ├── Makefile ├── OWNERS ├── OWNERS_ALIASES ├── README.md ├── RELEASE.md ├── SECURITY.md ├── SECURITY_CONTACTS ├── cmd └── ingate │ ├── main.go │ └── root │ └── root.go ├── docs ├── OWNERS ├── code-of-conduct.md ├── contributing │ ├── contributing.md │ └── ladder.md ├── faq.md └── index.md ├── go.mod ├── go.sum ├── hack ├── boilerplate │ ├── boilerplate.Dockerfile.txt │ ├── boilerplate.Makefile.txt │ ├── boilerplate.go.txt │ ├── boilerplate.py.txt │ ├── boilerplate.sh.txt │ └── boilerplate.yaml.txt └── verify-boilerplate.sh ├── images └── ingate-controller │ ├── Dockerfile.build │ └── Dockerfile.run ├── internal ├── cmd │ ├── version.go │ └── version │ │ └── version.go └── controller │ ├── gatewayapi │ ├── class │ │ └── gatewayclass.go │ └── config │ │ └── config.go │ └── ingress │ ├── class │ └── ingressclass.go │ └── config │ └── config.go ├── mkdocs.yml ├── tools ├── docs │ ├── Dockerfile │ └── requirements.txt ├── kind │ ├── config.yaml │ └── test.yaml ├── linter │ └── .golangci.yml └── scripts │ └── install_metallb.sh └── versions ├── BASE_IMAGE ├── GATEWAY_API ├── GOLANG ├── INGATE └── KUBERNETES_VERSIONS /.github/ISSUE_TEMPLATE/feature_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Proposal 3 | about: Suggest a feature to InGate 4 | title: 'CFP: ' 5 | labels: ["kind/feature", "kind/cfp"] 6 | assignees: '' 7 | --- 8 | 9 | ## InGate Feature Proposal 10 | 11 | Thank you for taking time to make a feature proposal for InGate! 12 | 13 | If you have usage questions, please start with the [slack channel](https://kubernetes.slack.com/archives/C08EX6HD25Bo) 14 | 15 | **What problem are you trying solve?** 16 | 17 | Please describe the problem 18 | 19 | **Please describe the feature** 20 | 21 | Include any specific requirements 22 | 23 | **Describe your proposed solution you have in mind** 24 | 25 | Please complete this section if you have ideas on how to implement the feature. We strongly recommend discussing your approach with InGate maintainers before spending lots of time on your work. We want to work with you to get your idea into InGate! 26 | 27 | 28 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: weekly 7 | -------------------------------------------------------------------------------- /.github/golangci-lint.yaml: -------------------------------------------------------------------------------- 1 | name: golangci-lint 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - '**/*.go' 7 | - '.github/workflows/golangci-lint.yml' 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | golangci: 14 | name: lint 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 19 | 20 | - name: Get go version 21 | run: echo "GOLANG_VERSION=$(cat GOLANG_VERSION)" >> $GITHUB_ENV 22 | 23 | - name: Set up Go 24 | id: go 25 | uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 26 | with: 27 | go-version: ${{ env.GOLANG_VERSION }} 28 | check-latest: true 29 | 30 | - name: golangci-lint 31 | uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1 32 | with: 33 | version: v1.62 34 | only-new-issues: true 35 | -------------------------------------------------------------------------------- /.github/workflows/docs.yaml: -------------------------------------------------------------------------------- 1 | name: Documentation 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - mkdocs.yml 9 | - docs/** 10 | 11 | jobs: 12 | deploy: 13 | name: Deploy 14 | runs-on: ubuntu-latest 15 | 16 | permissions: 17 | contents: write 18 | 19 | steps: 20 | - name: Checkout code 21 | uses: actions/checkout@v4.2.2 22 | 23 | - name: Deploy documentation 24 | uses: mhausenblas/mkdocs-deploy-gh-pages@1.26 25 | env: 26 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Downloaded in hack/verify-boilerplate.sh. 2 | hack/verify_boilerplate.py 3 | images/ingate-controller/bin/ 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Welcome to InGate. We are excited about the prospect of you joining our community of InGate [users](https://kubernetes.slack.com/archives/C08FBT2U8KB) and [developers](https://kubernetes.slack.com/archives/C08EX6HD25B)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: 4 | 5 | _As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ 6 | 7 | ## Getting Started 8 | 9 | We have full documentation on how to get started contributing here: 10 | 11 | - [Contributor License Agreement](https://git.k8s.io/community/CLA.md) - Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests 12 | - [Kubernetes Contributor Guide](https://k8s.dev/guide) - Main contributor documentation, or you can just jump directly to the [contributing page](https://k8s.dev/docs/guide/contributing/) 13 | - [Contributor Cheat Sheet](https://k8s.dev/cheatsheet) - Common resources for existing developers 14 | 15 | ## Mentorship 16 | 17 | - [Mentoring Initiatives](https://k8s.dev/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! 18 | 19 | ## Contact Information 20 | 21 | - [Slack channel](https://kubernetes.slack.com/archives/C08EX6HD25B) 22 | -------------------------------------------------------------------------------- /LAYOUT.md: -------------------------------------------------------------------------------- 1 | 2 | Code Layout for InGate project 3 | 4 | | Directory | Description | 5 | | ------------- | ------------- | 6 | | docs | InGate documentation site | 7 | | tools | tools used for development, make etc | 8 | | tooks/hack | Directory for bash scripts | 9 | | internal | InGate internal golang source | 10 | | charts | Helm chart for InGate deployment | 11 | | cmd | Command line for InGate | 12 | | versions | Directory for versions of software InGate uses | 13 | 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Copyright 2025 The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # Add the following 'help' target to your Makefile 16 | # And add help text after each target name starting with '\#\#' 17 | 18 | .DEFAULT_GOAL:=help 19 | 20 | .EXPORT_ALL_VARIABLES: 21 | 22 | ifndef VERBOSE 23 | .SILENT: 24 | endif 25 | 26 | # set default shell 27 | SHELL=/bin/bash -o pipefail -o errexit 28 | 29 | # Set Root Directory Path 30 | ifeq ($(origin ROOT_DIR),undefined) 31 | ROOT_DIR := $(abspath $(shell pwd -P)) 32 | endif 33 | 34 | # Golang root package 35 | PKG = github.com/kubernetes-sigs/ingate 36 | # Ingate version building 37 | INGATE_VERSION=$(shell cat versions/INGATE) 38 | # Golang version to build controller and container 39 | GOLANG=$(shell cat versions/GOLANG) 40 | 41 | # HOST_ARCH is the architecture that the developer is using to build it 42 | HOST_ARCH=$(shell which go >/dev/null 2>&1 && go env GOARCH) 43 | ARCH ?= $(HOST_ARCH) 44 | ifeq ($(ARCH),) 45 | $(error mandatory variable ARCH is empty, either set it when calling the command or make sure 'go env GOARCH' works) 46 | endif 47 | 48 | # Build information for the repo source 49 | REPO_INFO ?= $(shell git config --get remote.origin.url) 50 | 51 | # Build information for git commit 52 | COMMIT_SHA ?= git-$(shell git rev-parse --short HEAD) 53 | 54 | # Build information for build id in cloud build 55 | BUILD_ID ?= "UNSET" 56 | 57 | # REGISTRY is the image registry to use for build and push image targets. 58 | REGISTRY ?= gcr.io/k8s-staging/ingate 59 | # Name of the image 60 | INGATE_IMAGE_NAME ?= ingate-controller 61 | # IMAGE is the image URL for build and push image targets. 62 | IMAGE ?= $(REGISTRY)/$(IMAGE_NAME) 63 | BASE_IMAGE ?= $(shell cat versions/BASE_IMAGE) 64 | 65 | 66 | .PHONY: help 67 | help: ## help: Show this help info. 68 | @awk 'BEGIN {FS = ":.*##"; printf ""} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 69 | 70 | 71 | .PHONY: versions 72 | versions: ## List out versions of Software being used to develop InGate 73 | echo "GOLANG: ${GOLANG}" 74 | echo "INGATE: ${INGATE_VERSION}" 75 | echo "BASE_IMAGE: ${BASE_IMAGE}" 76 | echo "Commit SHA: ${COMMIT_SHA}" 77 | echo "HOST_ARCH: ${ARCH}" 78 | 79 | 80 | # All Make targets for docker build 81 | 82 | # Name of the docker buildx builder for InGate 83 | BUILDER ?= ingate 84 | 85 | # Supported Platforms for building multiarch binaries. 86 | PLATFORMS ?= linux/amd64,linux/arm,linux/arm64 87 | 88 | .PHONY: docker.build 89 | docker.build: ## Build a local docker container for InGate 90 | docker build \ 91 | --platform=$(PLATFORMS) \ 92 | --no-cache \ 93 | --build-arg TARGET_ARCH=$(ARCH) \ 94 | -t $(REGISTRY)/controller:$(INGATE_VERSION) \ 95 | -f images/ingate-controller/Dockerfile.run images/ingate-controller 96 | 97 | .PHONY: docker.builder 98 | docker.builder: ## Create buildx for multi-platform builds 99 | docker buildx create --name $(BUILDER) --bootstrap --use || : 100 | docker buildx inspect $(BUILDER) 101 | 102 | # Docker output, --push or --load 103 | OUTPUT ?= 104 | 105 | .PHONY: docker.buildx 106 | docker.buildx: docker.builder docker.clean ## Build Ingate Controller image for a particular arch. 107 | echo "Building docker $(REGISTRY)/controller:$(INGATE_VERSION) ($(ARCH))..." 108 | docker buildx build \ 109 | --builder $(BUILDER) \ 110 | --platform $(PLATFORMS) \ 111 | --no-cache \ 112 | --build-arg TARGET_ARCH=$(ARCH) \ 113 | -t $(REGISTRY)/controller:$(INGATE_VERSION) \ 114 | -f images/ingate-controller/Dockerfile.run images/ingate-controller \ 115 | $(OUTPUT) 116 | 117 | 118 | .PHONY: docker.push 119 | docker.push: OUTPUT = --push 120 | docker.push: docker.build ## Push docker container to a $REGISTRY 121 | 122 | .PHONY: docker.clean 123 | docker.clean: ## Removes local image 124 | echo "removing old image $(REGISTRY)/controller:$(INGATE_VERSION)" 125 | docker rmi -f $(REGISTRY)/controller:$(INGATE_VERSION) || true 126 | 127 | .PHONY: docker.registry 128 | docker.registry: ## Starts a local docker registry for testing 129 | docker stop registry && docker rm registry || true 130 | docker run -d --publish "0.0.0.0:6000:5000" --name registry registry:2.7 131 | 132 | # All Make targets for golang 133 | 134 | # Where to place the golang built binarys 135 | TARGETS_DIR = "./images/ingate-controller/bin/${ARCH}" 136 | 137 | # Where to get the version information 138 | VERSION_PACKAGE = github.com/kubernetes-sigs/ingate/internal/cmd/version 139 | 140 | GOOS := $(shell go env GOOS) 141 | ifeq ($(origin GOOS), undefined) 142 | GOOS := $(shell go env GOOS) 143 | endif 144 | 145 | .PHONY: go.build 146 | go.build: go.clean ## Go build for ingate controller 147 | docker run \ 148 | --volume "${PWD}":/go/src/$(PKG) \ 149 | -w /go/src/$(PKG) \ 150 | -e CGO_ENABLED=0 \ 151 | -e GOOS=$(GOOS) \ 152 | -e GOARCH=$(TARGETARCH) \ 153 | golang:1.24.1-alpine3.21 \ 154 | go build -trimpath -ldflags="-buildid= -w -s \ 155 | -X $(VERSION_PACKAGE).inGateVersion=$(INGATE_VERSION) \ 156 | -X $(VERSION_PACKAGE).gitCommitID=$(COMMIT_SHA)" \ 157 | -buildvcs=false \ 158 | -o $(TARGETS_DIR)/ingate $(PKG)/cmd/ingate 159 | 160 | .PHONY: go.clean 161 | go.clean: ## Clean go building output files 162 | rm -rf $(TARGETS_DIR) 163 | 164 | .PHONY: go.test.unit 165 | go.test.unit: ## Run go unit tests 166 | docker run -e CGO_ENABLED=1 golang:1.24.1-alpine3.21 go test -race ./... 167 | 168 | # All make targets for deploying a dev environment for InGate development 169 | 170 | # Version of kubernetes to deploy on kind cluster 171 | K8S_VERSION ?= $(shell cat versions/KUBERNETES_VERSIONS | head -n1) 172 | # Name of kind cluster to deploy 173 | KIND_CLUSTER_NAME ?= ingate-dev 174 | # Gateway API Version to deploy on kind cluster 175 | GW_VERSION ?= $(shell cat versions/GATEWAY_API) 176 | # Gateway API channel to deploy on kind cluster See https://gateway-api.sigs.k8s.io/concepts/versioning/?h=chann#release-channels for more details 177 | GW_CHANNEL ?= standard 178 | 179 | .PHONY: kind.all 180 | kind.all: kind.build go.build docker.build kind.load lb.install gateway.install ## Start a Development environment for InGate 181 | 182 | .PHONY: kind.build 183 | kind.build: kind.clean ## Build a kind cluster for testing InGate development 184 | kind create cluster --config tools/kind/config.yaml --name $(KIND_CLUSTER_NAME) --image "kindest/node:$(K8S_VERSION)" 185 | 186 | .PHONY: kind.clean 187 | kind.clean: ## Deletes InGate-dev kind cluster 188 | kind delete clusters $(KIND_CLUSTER_NAME) 189 | 190 | .PHONY: kind.load 191 | kind.load: ## Load InGate Image onto kind cluster 192 | kind load docker-image --name="$(KIND_CLUSTER_NAME)" "$(REGISTRY)"/controller:"$(INGATE_VERSION)" 193 | 194 | # Using the kubernetes sig tool https://github.com/kubernetes-sigs/cloud-provider-kind 195 | .PHONY: lb.install 196 | lb.install: lb.clean ## Install Load Balancer in kind cluster for Gateway deployments 197 | docker run --rm --network kind --name kindccm --detach -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:v0.6.0 198 | 199 | .PHONY: lb.clean 200 | lb.clean: ## Stops the Kind Cloud Container 201 | docker stop kindccm && docker rm kindccm || true 202 | 203 | # example https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/refs/heads/release-1.2/config/crd/standard/gateway.networking.k8s.io_gateways.yaml 204 | .PHONY: gateway.install 205 | gateway.install: ## Install Gateway API CRDs in cluster 206 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/$(GW_VERSION)/config/crd/$(GW_CHANNEL)/gateway.networking.k8s.io_gatewayclasses.yaml 207 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/$(GW_VERSION)/config/crd/$(GW_CHANNEL)/gateway.networking.k8s.io_gateways.yaml 208 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/$(GW_VERSION)/config/crd/$(GW_CHANNEL)/gateway.networking.k8s.io_httproutes.yaml 209 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/$(GW_VERSION)/config/crd/$(GW_CHANNEL)/gateway.networking.k8s.io_referencegrants.yaml 210 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/$(GW_VERSION)/config/crd/$(GW_CHANNEL)/gateway.networking.k8s.io_grpcroutes.yaml 211 | 212 | 213 | help: ## Display this help 214 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 215 | 216 | .PHONY: docs.build 217 | docs.build: ## Build and launch a local copy of the documentation website in http://localhost:8000 218 | @docker build --no-cache -t ingate-docs -f tools/docs/Dockerfile . 219 | @docker run --rm -it \ 220 | -p 8000:8000 \ 221 | -v ${PWD}:/docs \ 222 | --entrypoint /bin/bash \ 223 | ingate-docs \ 224 | -c "mkdocs serve --dev-addr=0.0.0.0:8000" 225 | -------------------------------------------------------------------------------- /OWNERS: -------------------------------------------------------------------------------- 1 | # See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners 2 | 3 | approvers: 4 | - sig-network-leads 5 | - ingate-maintainers 6 | 7 | reviewers: 8 | - ingate-reviewers 9 | -------------------------------------------------------------------------------- /OWNERS_ALIASES: -------------------------------------------------------------------------------- 1 | # See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners 2 | 3 | aliases: 4 | sig-network-leads: 5 | - aojea 6 | - danwinship 7 | - mikezappa87 8 | - shaneutt 9 | - thockin 10 | 11 | ingate-maintainers: 12 | - cpanato 13 | - Gacko 14 | - strongjz 15 | - tao12345666333 16 | 17 | ingate-reviewers: 18 | - cpanato 19 | - Gacko 20 | - strongjz 21 | - tao12345666333 22 | 23 | ingate-docs-maintainers: 24 | - longwuyuan 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # InGate 2 | 3 | ## Overview 4 | 5 | InGate is an Ingress and Gateway API Controller for Kubernetes. 6 | 7 | Learn more about [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress) and [Gateway API](https://kubernetes.io/docs/concepts/services-networking/gateway) on the Kubernetes documentation site. 8 | 9 | ## Get started 10 | 11 | ## Community, discussion, contribution, and support 12 | 13 | While we are in transition, we are still using the Ingress NGINX Slack channels and community meetings. 14 | 15 | - Read [`CONTRIBUTING.md`](CONTRIBUTING.md) for information about setting up your environment, the workflow that we expect, and instructions on the developer certificate of origin that we require. 16 | - Join our Kubernetes Slack channel for developer discussion: [#ingate-dev](https://kubernetes.slack.com/archives/C08EX6HD25B). 17 | - Submit GitHub issues for any feature enhancements, bugs, or documentation problems. 18 | - Open a [discussion](https://github.com/kubernetes-sigs/ingate/discussions) for ideas, announcements and other general topics folks would like to help direct the project. 19 | 20 | ### Code of conduct 21 | 22 | Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). 23 | -------------------------------------------------------------------------------- /RELEASE.md: -------------------------------------------------------------------------------- 1 | # Release Process 2 | 3 | Discussion on release process will be discussed in the community meeting. 4 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Security Announcements 4 | 5 | Join the [kubernetes-security-announce] group for security and vulnerability announcements. 6 | 7 | ## Reporting a Vulnerability 8 | 9 | Instructions for reporting a vulnerability can be found on the 10 | [Kubernetes Security and Disclosure Information] page. 11 | 12 | ## Supported Versions 13 | 14 | Information about supported Kubernetes versions can be found on the 15 | [Kubernetes version and version skew support policy] page on the Kubernetes website. 16 | 17 | [kubernetes-security-announce]: https://groups.google.com/forum/#!forum/kubernetes-security-announce 18 | [Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions 19 | [Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability 20 | -------------------------------------------------------------------------------- /SECURITY_CONTACTS: -------------------------------------------------------------------------------- 1 | # Defined below are the security contacts for this repo. 2 | # 3 | # They are the contact point for the Security Response Committee to reach out 4 | # to for triaging and handling of incoming issues. 5 | # 6 | # The below names agree to abide by the 7 | # [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) 8 | # and will be removed and replaced if they violate that agreement. 9 | # 10 | # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE 11 | # INSTRUCTIONS AT https://kubernetes.io/security/ 12 | 13 | Gacko 14 | strongjz 15 | -------------------------------------------------------------------------------- /cmd/ingate/main.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package main 18 | 19 | import ( 20 | "fmt" 21 | "os" 22 | 23 | "github.com/kubernetes-sigs/ingate/cmd/ingate/root" 24 | ) 25 | 26 | func main() { 27 | if err := root.GetRootCommand().Execute(); err != nil { 28 | fmt.Fprintln(os.Stderr, err) 29 | os.Exit(1) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /cmd/ingate/root/root.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package root 18 | 19 | import ( 20 | "github.com/kubernetes-sigs/ingate/internal/cmd" 21 | 22 | "github.com/spf13/cobra" 23 | ) 24 | 25 | func GetRootCommand() *cobra.Command { 26 | c := &cobra.Command{ 27 | Use: "ingate", 28 | Short: "InGate Gateway and Ingress Controller", 29 | Long: "InGate is a kubernetes controller for deploying and managing Gateway and Ingress resources", 30 | } 31 | 32 | c.AddCommand(cmd.GetVersionCommand()) 33 | return c 34 | } 35 | -------------------------------------------------------------------------------- /docs/OWNERS: -------------------------------------------------------------------------------- 1 | # See the OWNERS docs: https://www.kubernetes.dev/docs/guide/owners 2 | 3 | approvers: 4 | - ingate-docs-maintainers 5 | 6 | labels: 7 | - area/docs 8 | -------------------------------------------------------------------------------- /docs/code-of-conduct.md: -------------------------------------------------------------------------------- 1 | # Kubernetes Community Code of Conduct 2 | 3 | Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) 4 | -------------------------------------------------------------------------------- /docs/contributing/contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Guidelines 4 | 5 | - Discuss idea before starting a pull request 6 | - Open an Feature Request issue to propose your idea 7 | - Review with the Maintainers before starting work 8 | - Develop the feature 9 | - Open a pull request 10 | 11 | 12 | ## Feature Requests 13 | 14 | A feature request is considered completed when: 15 | 16 | - End to end test exist in CI and pass 17 | - Pull request accepted 18 | - Milestone defined for release version -------------------------------------------------------------------------------- /docs/contributing/ladder.md: -------------------------------------------------------------------------------- 1 | # Contributor Ladder 2 | 3 | Within the Kubernetes community, the concept of a contributor ladder has been 4 | developed to define how individuals can earn formal roles within the project. 5 | The Ingate contributor ladder largely follows the [roles defined by the 6 | broader Kubernetes 7 | community](https://github.com/kubernetes/community/blob/master/community-membership.md), 8 | though some aspects are unique to this community. 9 | 10 | ## Goals 11 | 12 | This doc will provide an initial step towards the following goals: 13 | 14 | * Ensure the long-term health of the Ingate project and community 15 | * Encourage new contributors to work towards formal roles and responsibilities 16 | * Clearly define the path towards leadership roles 17 | * Develop a strong leadership pipeline, so we have great candidates to fill 18 | project leadership roles 19 | 20 | ## Scope 21 | 22 | This doc covers the following repositories: 23 | 24 | * [kubernetes-sigs/ingate](https://github.com/kubernetes-sigs/ingate) 25 | 26 | There are opportunities to become an approver or 27 | reviewer for either the entire project or a subset of that project. For 28 | example, you could become a reviewer or approver focused on just docs or 29 | Helm. 30 | 31 | ## Contributor Ladder Steps 32 | 33 | The Ingate contributor ladder has the following steps: 34 | 35 | 1. Member 36 | 2. Reviewer 37 | 3. Approver 38 | 4. Maintainer 39 | 40 | Within Ingate, there are a variety of areas in which one can become a 41 | reviewer or approver, including: 42 | 43 | * Documentation 44 | * Helm 45 | 46 | ## General Guidelines 47 | 48 | ### Everyone is welcome 49 | 50 | We appreciate all contributions, especially non-code contributors such as docs 51 | updates and real-world examples. 52 | You don’t need a formal role in the project to make or review pull requests 53 | and help with issues or discussions. It is entirely optional to accept a formal 54 | role within the project. You must adhere to the 55 | [Code of Conduct](code-of-conduct.md) while 56 | contributing to the Ingate project. 57 | 58 | ### These roles require continued contributions 59 | 60 | Applying for one of the roles defined above should only be done if you intend to 61 | continue to contribute at a level that would merit that role. If for any reason 62 | If you cannot continue in one of the roles above, please resign. Members 63 | with an extended period away from the project with no activity will be removed 64 | from the Kubernetes GitHub Organizations and will be required to go through the 65 | org membership process again after familiarizing themselves with the current 66 | state of the project. 67 | 68 | ### Don’t merge without consensus 69 | 70 | If you have reason to believe that a change may be contentious, please wait for 71 | additional perspectives from others before merging any PRs. Even if you have 72 | access to merge a PR, it doesn’t mean you should. Although we can’t have PRs 73 | blocked indefinitely, we need to ensure everyone has had a chance to present 74 | their perspective. One of the best ways to resolve issues is to attend the community 75 | meeting and discuss it with maintainers. 76 | 77 | ### Start a discussion 78 | 79 | If you’re interested in working towards one of these roles, please reach out to 80 | an Ingate maintainer on Slack in the 81 | [ingate-dev](https://kubernetes.slack.com/archives/C08EX6HD25B) channel. 82 | 83 | ## Member, Reviewer, and Approver 84 | 85 | The first steps on the contributor ladder are already [clearly defined in the 86 | upstream Kubernetes 87 | Community](https://github.com/kubernetes/community/blob/master/community-membership.md#community-membership). 88 | Ingate follows those guidelines along with the rest of the Kubernetes 89 | community. 90 | 91 | ## Maintainers 92 | 93 | The final steps on the contributor ladder represent significant overall leadership 94 | roles within the project. The spaces available for these roles are 95 | limited (generally, 3-4 people in each role is ideal). We ensure that different 96 | companies are represented in these roles wherever possible. 97 | 98 | Ingate Maintainers are known as [Subproject 99 | Owners](https://github.com/kubernetes/community/blob/master/community-membership.md#subproject-owner) 100 | within the Kubernetes community. To become an Ingate Maintainer, the most 101 | important things we expect are: 102 | 103 | * Long-term, sustained contributions to Ingate for at least 6 months 104 | * Deep understanding of technical goals and direction of the project 105 | * Successfully authored and led significant enhancement proposals 106 | * Approver for at least 3 months 107 | * Ability to lead community meetings 108 | 109 | In addition to all the expectations described above, we expect maintainers to 110 | set the technical direction and goals for the project. This role is critical to 111 | the project's health; maintainers should mentor new approvers and 112 | reviewers and ensure healthy processes are in place for discussion 113 | and decision-making. Finally, maintainers are ultimately responsible for 114 | releasing new versions of the controller. 115 | -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | # FAQ 2 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # InGate 2 | 3 | Welcome to Ingate. We are excited about the prospect of you joining our community of [ingate-users](https://kubernetes.slack.com/archives/C08FBT2U8KB) and [developers](https://kubernetes.slack.com/archives/C08EX6HD25B)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: 4 | 5 | _As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ 6 | 7 | ## Getting Started 8 | 9 | The Kubernetes project has full documentation on how to get started contributing here: 10 | 11 | - [Contributor License Agreement](https://git.k8s.io/community/CLA.md) - Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests 12 | - [Kubernetes Contributor Guide](https://k8s.dev/guide) - Main contributor documentation, or you can just jump directly to the [contributing page](https://k8s.dev/docs/guide/contributing/) 13 | - [Contributor Cheat Sheet](https://k8s.dev/cheatsheet) - Common resources for existing developers 14 | 15 | ## Mentorship 16 | 17 | - [Mentoring Initiatives](https://k8s.dev/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! 18 | 19 | ## Contact Information 20 | 21 | - [#ingate-dev Slack channel](https://kubernetes.slack.com/archives/C08EX6HD25B) 22 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/kubernetes-sigs/ingate 2 | 3 | go 1.24.1 4 | 5 | require github.com/spf13/cobra v1.9.1 6 | 7 | require ( 8 | github.com/inconshreveable/mousetrap v1.1.0 // indirect 9 | github.com/spf13/pflag v1.0.6 // indirect 10 | ) 11 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 2 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 3 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 4 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 5 | github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= 6 | github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= 7 | github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= 8 | github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 9 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 10 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 11 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.Dockerfile.txt: -------------------------------------------------------------------------------- 1 | # Copyright YEAR The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.Makefile.txt: -------------------------------------------------------------------------------- 1 | # Copyright YEAR The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.go.txt: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright YEAR The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.py.txt: -------------------------------------------------------------------------------- 1 | # Copyright YEAR The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.sh.txt: -------------------------------------------------------------------------------- 1 | # Copyright YEAR The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | -------------------------------------------------------------------------------- /hack/boilerplate/boilerplate.yaml.txt: -------------------------------------------------------------------------------- 1 | # Copyright YEAR The Kubernetes Authors 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | -------------------------------------------------------------------------------- /hack/verify-boilerplate.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright 2025 The Kubernetes Authors. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | # Exit on error. 18 | set -o errexit -o nounset -o pipefail 19 | 20 | # Get root. 21 | root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" 22 | 23 | # Define script. 24 | script="${root}/hack/verify_boilerplate.py" 25 | 26 | # Check script. 27 | if [[ ! -f "${script}" ]] 28 | then 29 | # Define version and URL. 30 | version="v0.2.5" 31 | url="https://raw.githubusercontent.com/kubernetes/repo-infra/${version}/hack/verify_boilerplate.py" 32 | 33 | # Download script. 34 | curl --silent --show-error --fail "${url}" --location --output "${script}" 35 | 36 | # Make executable. 37 | chmod +x "${script}" 38 | fi 39 | 40 | # Run script. 41 | "${script}" --boilerplate-dir "${root}/hack/boilerplate" --rootdir "${root}" 42 | -------------------------------------------------------------------------------- /images/ingate-controller/Dockerfile.build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright 2025 The Kubernetes Authors. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | 18 | ARG TARGETARCH 19 | ARG VERSION_PACKAGE 20 | ARG INGATE_VERSION 21 | ARG COMMIT_SHA 22 | ARG PKG 23 | ARG TARGETS_DIR 24 | ARG GOOS 25 | 26 | FROM golang:1.24.1-alpine3.21 27 | 28 | WORKDIR /go/src/github.com/kubernetes-sigs/ingate/ 29 | 30 | COPY . . 31 | 32 | RUN CGO_ENABLED=0 GOOS=${GOOS} GOARCH=${TARGETARCH} go build -trimpath -ldflags="-buildid= -w -s \ 33 | -X ${VERSION_PACKAGE}.inGateVersion=${INGATE_VERSION} \ 34 | -X ${VERSION_PACKAGE}.gitCommitID=${COMMIT_SHA}" \ 35 | -buildvcs=false \ 36 | -o ${TARGETS_DIR}/ingate ./cmd/ingate -------------------------------------------------------------------------------- /images/ingate-controller/Dockerfile.run: -------------------------------------------------------------------------------- 1 | # Copyright 2025 The Kubernetes Authors. All rights reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | FROM gcr.io/distroless/base-debian12:latest 16 | ARG TARGET_ARCH 17 | COPY bin/${TARGET_ARCH}/ingate /opt/ingate 18 | ENTRYPOINT ["/opt/ingate"] 19 | CMD ["/opt/ingate"] -------------------------------------------------------------------------------- /internal/cmd/version.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package cmd 18 | 19 | import ( 20 | "github.com/kubernetes-sigs/ingate/internal/cmd/version" 21 | "github.com/spf13/cobra" 22 | ) 23 | 24 | func GetVersionCommand() *cobra.Command { 25 | 26 | cmd := &cobra.Command{ 27 | Use: "version", 28 | Aliases: []string{"versions", "v"}, 29 | Short: "Show versions", 30 | RunE: func(cmd *cobra.Command, args []string) error { 31 | return version.Print(cmd.OutOrStdout()) 32 | }, 33 | } 34 | 35 | return cmd 36 | } 37 | -------------------------------------------------------------------------------- /internal/cmd/version/version.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package version 18 | 19 | import ( 20 | "fmt" 21 | "io" 22 | "runtime" 23 | ) 24 | 25 | type Version struct { 26 | InGateVersion string `json:"ingateVersion"` 27 | GitCommitID string `json:"gitCommitID"` 28 | GolangVersion string `json:"golangVersion"` 29 | } 30 | 31 | func GetVersion() Version { 32 | return Version{ 33 | InGateVersion: inGateVersion, 34 | GitCommitID: gitCommitID, 35 | GolangVersion: runtime.Version(), 36 | } 37 | } 38 | 39 | var ( 40 | inGateVersion string 41 | gitCommitID string 42 | ) 43 | 44 | func Print(w io.Writer) error { 45 | ver := GetVersion() 46 | 47 | _, _ = fmt.Fprintf(w, "INGATE_VERSION: %s\n", ver.InGateVersion) 48 | _, _ = fmt.Fprintf(w, "GIT_COMMIT_ID: %s\n", ver.GitCommitID) 49 | _, _ = fmt.Fprintf(w, "GOLANG_VERSION: %s\n", ver.GolangVersion) 50 | 51 | return nil 52 | } 53 | -------------------------------------------------------------------------------- /internal/controller/gatewayapi/class/gatewayclass.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package gatewayclass 18 | -------------------------------------------------------------------------------- /internal/controller/gatewayapi/config/config.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package gatewayConfig 18 | -------------------------------------------------------------------------------- /internal/controller/ingress/class/ingressclass.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package ingressclass 18 | 19 | const ( 20 | // IngressKey picks a specific "class" for the Ingress. 21 | // The controller only processes Ingresses with this annotation either 22 | // unset, or set to either the configured value or the empty string. 23 | IngressKey = "kubernetes.io/ingress.class" 24 | 25 | // DefaultControllerName defines the default controller name for Ingress NGINX 26 | DefaultControllerName = "k8s.io/ingate" 27 | 28 | // DefaultAnnotationValue defines the default annotation value for the InGate controller 29 | DefaultAnnotationValue = "ingate" 30 | ) 31 | 32 | // Configuration defines the various aspects of IngressClass parsing 33 | // and how the controller should behave in each case 34 | type Configuration struct { 35 | // Controller defines the controller value this daemon watch to. 36 | // Defaults to "k8s.io/ingate" defined in flags 37 | Controller string 38 | // AnnotationValue defines the annotation value this Controller watch to, in case of the 39 | // ingressSpecName is not found but the annotation is. 40 | // The Annotation is deprecated and should not be used in future releases 41 | AnnotationValue string 42 | // WatchWithoutClass defines if Controller should watch to Ingress Objects that does 43 | // not contain an IngressClass configuration 44 | WatchWithoutClass bool 45 | // IgnoreIngressClass defines if Controller should ignore the IngressClass Object if no permissions are 46 | // granted on IngressClass 47 | IgnoreIngressClass bool 48 | // IngressClassByName defines if the Controller should watch for Ingress Classes by 49 | // .metadata.name together with .spec.Controller 50 | IngressClassByName bool 51 | } 52 | -------------------------------------------------------------------------------- /internal/controller/ingress/config/config.go: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2025 The Kubernetes Authors. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | package ingressConfig 18 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: InGate 2 | site_url: https://kubernetes-sigs.github.io/ingate 3 | 4 | repo_name: kubernetes-sigs/ingate 5 | repo_url: https://github.com/kubernetes-sigs/ingate 6 | 7 | theme: 8 | name: material 9 | 10 | palette: 11 | primary: indigo 12 | scheme: slate 13 | accent: light green 14 | 15 | include_sidebar: true 16 | 17 | nav: 18 | - Welcome: index.md 19 | - Contributing: 20 | - Getting Started: contributing/contributing.md 21 | - Contributor Ladder: contributing/ladder.md 22 | - FAQ: faq.md 23 | -------------------------------------------------------------------------------- /tools/docs/Dockerfile: -------------------------------------------------------------------------------- 1 | # Copyright 2025 The Kubernetes Authors. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | 16 | FROM python:3-alpine 17 | 18 | ARG USER=1001 19 | 20 | WORKDIR /docs 21 | COPY docs /docs 22 | COPY tools/docs/requirements.txt /docs 23 | 24 | RUN adduser -h /docs -D -u $USER mkdocs \ 25 | && apk add bash \ 26 | && apk add git 27 | 28 | RUN ls -la 29 | RUN ls -la /docs 30 | 31 | RUN pip install --upgrade pip 32 | RUN pip install -r /docs/requirements.txt -------------------------------------------------------------------------------- /tools/docs/requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs-material==9.6 2 | mkdocs-awesome-pages-plugin==2.9.2 3 | mkdocs-minify-plugin==0.7.1 4 | mkdocs-redirects==1.2.1 5 | -------------------------------------------------------------------------------- /tools/kind/config.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2025 The Kubernetes Authors 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | kind: Cluster 16 | apiVersion: kind.x-k8s.io/v1alpha4 17 | nodes: 18 | - role: control-plane 19 | labels: 20 | topology.kubernetes.io/zone: zone-1 21 | - role: worker 22 | labels: 23 | topology.kubernetes.io/zone: zone-1 24 | - role: worker 25 | labels: 26 | topology.kubernetes.io/zone: zone-2 27 | kubeadmConfigPatches: 28 | - | 29 | kind: ClusterConfiguration 30 | metadata: 31 | name: config 32 | controllerManager: 33 | extraArgs: 34 | namespace-sync-period: 10s 35 | concurrent-deployment-syncs: "30" 36 | -------------------------------------------------------------------------------- /tools/kind/test.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2025 The Kubernetes Authors 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | apiVersion: apps/v1 16 | kind: Deployment 17 | metadata: 18 | name: policy-local 19 | labels: 20 | app: MyLocalApp 21 | spec: 22 | replicas: 1 23 | selector: 24 | matchLabels: 25 | app: MyLocalApp 26 | template: 27 | metadata: 28 | labels: 29 | app: MyLocalApp 30 | spec: 31 | containers: 32 | - name: agnhost 33 | image: registry.k8s.io/e2e-test-images/agnhost:2.40 34 | args: 35 | - netexec 36 | - --http-port=8080 37 | - --udp-port=8080 38 | ports: 39 | - containerPort: 8080 40 | --- 41 | apiVersion: v1 42 | kind: Service 43 | metadata: 44 | name: lb-service-local 45 | spec: 46 | type: LoadBalancer 47 | externalTrafficPolicy: Local 48 | selector: 49 | app: MyLocalApp 50 | ports: 51 | - protocol: TCP 52 | port: 80 53 | targetPort: 8080 -------------------------------------------------------------------------------- /tools/linter/.golangci.yml: -------------------------------------------------------------------------------- 1 | run: 2 | timeout: 10m 3 | allow-parallel-runners: true 4 | 5 | # Maximum issues count per one linter. Set to 0 to disable. Default is 50. 6 | max-issues-per-linter: 0 7 | 8 | # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. 9 | max-same-issues: 0 10 | linters: 11 | disable-all: true 12 | enable: 13 | - asasalint 14 | - asciicheck 15 | - bidichk 16 | - bodyclose 17 | - contextcheck 18 | - decorder 19 | - dogsled 20 | - dupl 21 | - durationcheck 22 | - errcheck 23 | - errchkjson 24 | - errname 25 | - ginkgolinter 26 | - gocheckcompilerdirectives 27 | - goconst 28 | - gocritic 29 | - gocyclo 30 | - godox 31 | - gofmt 32 | - gofumpt 33 | - goheader 34 | - goimports 35 | - gomoddirectives 36 | - gomodguard 37 | - goprintffuncname 38 | - gosec 39 | - gosimple 40 | - govet 41 | - grouper 42 | - importas 43 | - ineffassign 44 | - loggercheck 45 | - makezero 46 | - misspell 47 | - musttag 48 | - nakedret 49 | - nolintlint 50 | - nosprintfhostport 51 | - prealloc 52 | - predeclared 53 | - promlinter 54 | - reassign 55 | - revive 56 | - rowserrcheck 57 | - sqlclosecheck 58 | - staticcheck 59 | - stylecheck 60 | - tenv 61 | - testableexamples 62 | - typecheck 63 | - unconvert 64 | - unparam 65 | - unused 66 | - usestdlibvars 67 | - whitespace 68 | # - containedctx 69 | # - cyclop 70 | # - dupword 71 | # - errorlint 72 | # - exhaustive 73 | # - exhaustruct 74 | # - exportloopref 75 | # - forbidigo 76 | # - forcetypeassert 77 | # - funlen 78 | # - gci 79 | # - gochecknoglobals 80 | # - gochecknoinits 81 | # - gocognit 82 | # - godot 83 | # - goerr113 84 | # - gomnd 85 | # - interfacebloat 86 | # - ireturn 87 | # - lll 88 | # - maintidx 89 | # - nestif 90 | # - nilerr 91 | # - nilnil 92 | # - nlreturn 93 | # - noctx 94 | # - nonamedreturns 95 | # - paralleltest 96 | # - tagliatelle 97 | # - testpackage 98 | # - thelper 99 | # - tparallel 100 | # - varnamelen 101 | # - wastedassign 102 | # - wrapcheck 103 | # - wsl 104 | linters-settings: 105 | gocyclo: 106 | min-complexity: 40 107 | godox: 108 | keywords: 109 | - BUG 110 | - FIXME 111 | - HACK 112 | errcheck: 113 | check-type-assertions: true 114 | check-blank: true 115 | gocritic: 116 | enabled-checks: 117 | # Diagnostic 118 | - appendAssign 119 | - argOrder 120 | - badCall 121 | - badCond 122 | - badLock 123 | - badRegexp 124 | - badSorting 125 | - builtinShadowDecl 126 | - caseOrder 127 | - codegenComment 128 | - commentedOutCode 129 | - deferInLoop 130 | - deprecatedComment 131 | - dupArg 132 | - dupBranchBody 133 | - dupCase 134 | - dupSubExpr 135 | - dynamicFmtString 136 | - emptyDecl 137 | - evalOrder 138 | - exitAfterDefer 139 | - externalErrorReassign 140 | - filepathJoin 141 | - flagDeref 142 | - flagName 143 | - mapKey 144 | - nilValReturn 145 | - offBy1 146 | - regexpPattern 147 | - returnAfterHttpError 148 | - sloppyReassign 149 | - sloppyTypeAssert 150 | - sortSlice 151 | - sprintfQuotedString 152 | - sqlQuery 153 | - syncMapLoadAndDelete 154 | - truncateCmp 155 | - unnecessaryDefer 156 | - weakCond 157 | 158 | # Performance 159 | - appendCombine 160 | - equalFold 161 | - hugeParam 162 | - indexAlloc 163 | - preferDecodeRune 164 | - preferFprint 165 | - preferStringWriter 166 | - preferWriteByte 167 | - rangeExprCopy 168 | - rangeValCopy 169 | - sliceClear 170 | - stringXbytes 171 | 172 | # Style 173 | - assignOp 174 | - boolExprSimplify 175 | - captLocal 176 | - commentFormatting 177 | - commentedOutImport 178 | - defaultCaseOrder 179 | - deferUnlambda 180 | - docStub 181 | - dupImport 182 | - elseif 183 | - emptyFallthrough 184 | - emptyStringTest 185 | - exposedSyncMutex 186 | - hexLiteral 187 | - httpNoBody 188 | - ifElseChain 189 | - methodExprCall 190 | - newDeref 191 | - octalLiteral 192 | - preferFilepathJoin 193 | - redundantSprint 194 | - regexpMust 195 | - regexpSimplify 196 | - ruleguard 197 | - singleCaseSwitch 198 | - sloppyLen 199 | - stringConcatSimplify 200 | - stringsCompare 201 | - switchTrue 202 | - timeExprSimplify 203 | - tooManyResultsChecker 204 | - typeAssertChain 205 | - typeDefFirst 206 | - typeSwitchVar 207 | - underef 208 | - unlabelStmt 209 | - unlambda 210 | - unslice 211 | - valSwap 212 | - whyNoLint 213 | - wrapperFunc 214 | - yodaStyleExpr 215 | 216 | # Opinionated 217 | - builtinShadow 218 | - importShadow 219 | - initClause 220 | - nestingReduce 221 | - paramTypeCombine 222 | - ptrToRefParam 223 | - typeUnparen 224 | - unnamedResult 225 | - unnecessaryBlock 226 | nolintlint: 227 | # Enable to ensure that nolint directives are all used. Default is true. 228 | allow-unused: false 229 | # Disable to ensure that nolint directives don't have a leading space. Default is true. 230 | # TODO(lint): Enforce machine-readable `nolint` directives 231 | allow-leading-space: true 232 | # Exclude following linters from requiring an explanation. Default is []. 233 | allow-no-explanation: [] 234 | # Enable to require an explanation of nonzero length after each nolint directive. Default is false. 235 | # TODO(lint): Enforce explanations for `nolint` directives 236 | require-explanation: false 237 | # Enable to require nolint directives to mention the specific linter being suppressed. Default is false. 238 | require-specific: true 239 | -------------------------------------------------------------------------------- /tools/scripts/install_metallb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright 2025 The Kubernetes Authors. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | # Exit on error. 18 | set -o errexit -o nounset -o pipefail 19 | 20 | # Get root. 21 | root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" -------------------------------------------------------------------------------- /versions/BASE_IMAGE: -------------------------------------------------------------------------------- 1 | gcr.io/distroless/base-debian12:latest -------------------------------------------------------------------------------- /versions/GATEWAY_API: -------------------------------------------------------------------------------- 1 | release-1.2 -------------------------------------------------------------------------------- /versions/GOLANG: -------------------------------------------------------------------------------- 1 | 1.24.1 -------------------------------------------------------------------------------- /versions/INGATE: -------------------------------------------------------------------------------- 1 | 0.0.0 -------------------------------------------------------------------------------- /versions/KUBERNETES_VERSIONS: -------------------------------------------------------------------------------- 1 | v1.31.2 2 | v1.30.6 3 | v1.29.10 --------------------------------------------------------------------------------