Add new resource for Kubernetes API proxy (#279)

This adds a new resource which deploys a Kubernetes API server proxy
that can be used to access the API server without tokens through
Netbird.

Part of #274 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added ClusterProxy custom resource for cluster API proxying
capabilities

* **Documentation**
  * Added ClusterProxy API reference documentation with schema details

* **Examples**
* Added example ClusterProxy configuration and RBAC setup for cluster
proxy targets

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/netbirdio/kubernetes-operator/pull/279?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Philip Laine
2026-06-01 11:41:48 +02:00
committed by GitHub
parent a3546e4804
commit 5dd73dcc80
19 changed files with 1177 additions and 31 deletions
+14 -7
View File
@@ -60,7 +60,7 @@ func main() {
var (
runtimeNamespace string
managementURL string
clientImage string
netbirdClientImage string
clusterName string
namespacedNetworks bool
clusterDNS string
@@ -71,7 +71,7 @@ func main() {
)
flag.StringVar(&runtimeNamespace, "runtime-namespace", "", "Namespace the controller is running in")
flag.StringVar(&managementURL, "netbird-management-url", "https://api.netbird.io", "Management service URL")
flag.StringVar(&clientImage, "netbird-client-image", "", "Image for netbird client container")
flag.StringVar(&netbirdClientImage, "netbird-client-image", "", "Image for netbird client container")
flag.StringVar(
&clusterName,
"cluster-name",
@@ -139,8 +139,8 @@ func main() {
setupLog.Error(err, "unable to get runtime namespace")
os.Exit(1)
}
if clientImage == "" {
clientImage = version.ClientImage()
if netbirdClientImage == "" {
netbirdClientImage = version.NetbirdClientImage
}
defaultLabelsMap := make(map[string]string)
@@ -210,7 +210,7 @@ func main() {
}
if enableWebhooks {
if err = nbwebhookv1.SetupPodWebhookWithManager(mgr, managementURL, clientImage); err != nil {
if err = nbwebhookv1.SetupPodWebhookWithManager(mgr, managementURL, netbirdClientImage); err != nil {
setupLog.Error(err, "unable to create webhook", "webhook", "Pod")
os.Exit(1)
}
@@ -226,7 +226,7 @@ func main() {
if err = (&controller.NBRoutingPeerReconciler{
Client: mgr.GetClient(),
Netbird: nbClient,
ClientImage: clientImage,
ClientImage: netbirdClientImage,
ClusterName: clusterName,
ManagementURL: managementURL,
NamespacedNetworks: namespacedNetworks,
@@ -299,7 +299,7 @@ func main() {
if err := (&controller.NetworkRouterReconciler{
Client: mgr.GetClient(),
Netbird: nbClient,
ClientImage: clientImage,
ClientImage: netbirdClientImage,
ManagementURL: managementURL,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Failed to create controller", "controller", "NetworkRouter")
@@ -312,6 +312,13 @@ func main() {
setupLog.Error(err, "Failed to create controller", "controller", "NetworkResource")
os.Exit(1)
}
if err := (&controller.ClusterProxyReconciler{
Client: mgr.GetClient(),
ApiKey: netbirdAPIKey,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Failed to create controller", "controller", "ClusterProxy")
os.Exit(1)
}
if gatewayAPIEnabled {
if err = (&controller.GatewayClassReconciler{