Skip to content

Commit ef97f2a

Browse files
authored
feat: add azure iptables monitor binary and makefile changes (#3779)
* add iptables monitor binary and makefile changes * address feedback * add option to send node events if enabled * remove dependency on node patching rbac now requires: - apiGroups: ["cilium.io"] resources: ["ciliumnodes"] verbs: ["patch"] we also must pass NODE_UID as an environment variable to send events * remove passing node uid in since not possible with downward api * update naming and readme for ciliumnodes * address feedback (noop)
1 parent bdd4477 commit ef97f2a

File tree

7 files changed

+944
-20
lines changed

7 files changed

+944
-20
lines changed

Makefile

Lines changed: 88 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ endif
3232
# Interrogate the git repo and set some variables
3333
REPO_ROOT ?= $(shell git rev-parse --show-toplevel)
3434
REVISION ?= $(shell git rev-parse --short HEAD)
35-
ACN_VERSION ?= $(shell git describe --exclude "azure-ip-masq-merger*" --exclude "azure-ipam*" --exclude "dropgz*" --exclude "zapai*" --exclude "ipv6-hp-bpf*" --tags --always)
35+
ACN_VERSION ?= $(shell git describe --exclude "azure-iptables-monitor*" --exclude "azure-ip-masq-merger*" --exclude "azure-ipam*" --exclude "dropgz*" --exclude "zapai*" --exclude "ipv6-hp-bpf*" --tags --always)
3636
IPV6_HP_BPF_VERSION ?= $(notdir $(shell git describe --match "ipv6-hp-bpf*" --tags --always))
3737
AZURE_IPAM_VERSION ?= $(notdir $(shell git describe --match "azure-ipam*" --tags --always))
3838
AZURE_IP_MASQ_MERGER_VERSION ?= $(notdir $(shell git describe --match "azure-ip-masq-merger*" --tags --always))
39+
AZURE_IPTABLES_MONITOR_VERSION ?= $(notdir $(shell git describe --match "azure-iptables-monitor*" --tags --always))
3940
CNI_VERSION ?= $(ACN_VERSION)
4041
CNS_VERSION ?= $(ACN_VERSION)
4142
NPM_VERSION ?= $(ACN_VERSION)
@@ -44,6 +45,7 @@ ZAPAI_VERSION ?= $(notdir $(shell git describe --match "zapai*" --tags --al
4445
# Build directories.
4546
AZURE_IPAM_DIR = $(REPO_ROOT)/azure-ipam
4647
AZURE_IP_MASQ_MERGER_DIR = $(REPO_ROOT)/azure-ip-masq-merger
48+
AZURE_IPTABLES_MONITOR_DIR = $(REPO_ROOT)/azure-iptables-monitor
4749
IPV6_HP_BPF_DIR = $(REPO_ROOT)/bpf-prog/ipv6-hp-bpf
4850

4951
CNI_NET_DIR = $(REPO_ROOT)/cni/network/plugin
@@ -58,6 +60,7 @@ OUTPUT_DIR = $(REPO_ROOT)/output
5860
BUILD_DIR = $(OUTPUT_DIR)/$(GOOS)_$(GOARCH)
5961
AZURE_IPAM_BUILD_DIR = $(BUILD_DIR)/azure-ipam
6062
AZURE_IP_MASQ_MERGER_BUILD_DIR = $(BUILD_DIR)/azure-ip-masq-merger
63+
AZURE_IPTABLES_MONITOR_BUILD_DIR = $(BUILD_DIR)/azure-iptables-monitor
6164
IPV6_HP_BPF_BUILD_DIR = $(BUILD_DIR)/bpf-prog/ipv6-hp-bpf
6265
IMAGE_DIR = $(OUTPUT_DIR)/images
6366

@@ -106,6 +109,7 @@ CNS_ARCHIVE_NAME = azure-cns-$(GOOS)-$(GOARCH)-$(CNS_VERSION).$(ARCHIVE_EXT)
106109
NPM_ARCHIVE_NAME = azure-npm-$(GOOS)-$(GOARCH)-$(NPM_VERSION).$(ARCHIVE_EXT)
107110
AZURE_IPAM_ARCHIVE_NAME = azure-ipam-$(GOOS)-$(GOARCH)-$(AZURE_IPAM_VERSION).$(ARCHIVE_EXT)
108111
AZURE_IP_MASQ_MERGER_ARCHIVE_NAME = azure-ip-masq-merger-$(GOOS)-$(GOARCH)-$(AZURE_IP_MASQ_MERGER_VERSION).$(ARCHIVE_EXT)
112+
AZURE_IPTABLES_MONITOR_ARCHIVE_NAME = azure-iptables-monitor-$(GOOS)-$(GOARCH)-$(AZURE_IPTABLES_MONITOR_VERSION).$(ARCHIVE_EXT)
109113
IPV6_HP_BPF_ARCHIVE_NAME = ipv6-hp-bpf-$(GOOS)-$(GOARCH)-$(IPV6_HP_BPF_VERSION).$(ARCHIVE_EXT)
110114

111115
# Image info file names.
@@ -123,8 +127,8 @@ all-binaries-platforms: ## Make all platform binaries
123127

124128
# OS specific binaries/images
125129
ifeq ($(GOOS),linux)
126-
all-binaries: acncli azure-cni-plugin azure-cns azure-npm azure-ipam azure-ip-masq-merger ipv6-hp-bpf
127-
all-images: npm-image cns-image cni-manager-image azure-ip-masq-merger-image ipv6-hp-bpf-image
130+
all-binaries: acncli azure-cni-plugin azure-cns azure-npm azure-ipam azure-ip-masq-merger azure-iptables-monitor ipv6-hp-bpf
131+
all-images: npm-image cns-image cni-manager-image azure-ip-masq-merger-image azure-iptables-monitor-image ipv6-hp-bpf-image
128132
else
129133
all-binaries: azure-cni-plugin azure-cns azure-npm
130134
all-images:
@@ -139,6 +143,7 @@ azure-npm: azure-npm-binary npm-archive
139143
azure-ipam: azure-ipam-binary azure-ipam-archive
140144
ipv6-hp-bpf: ipv6-hp-bpf-binary ipv6-hp-bpf-archive
141145
azure-ip-masq-merger: azure-ip-masq-merger-binary azure-ip-masq-merger-archive
146+
azure-iptables-monitor: azure-iptables-monitor-binary azure-iptables-monitor-archive
142147

143148

144149
##@ Versioning
@@ -157,6 +162,9 @@ azure-ipam-version: ## prints the azure-ipam version
157162
azure-ip-masq-merger-version: ## prints the azure-ip-masq-merger version
158163
@echo $(AZURE_IP_MASQ_MERGER_VERSION)
159164

165+
azure-iptables-monitor-version: ## prints the azure-iptables-monitor version
166+
@echo $(AZURE_IPTABLES_MONITOR_VERSION)
167+
160168
ipv6-hp-bpf-version: ## prints the ipv6-hp-bpf version
161169
@echo $(IPV6_HP_BPF_VERSION)
162170

@@ -230,6 +238,10 @@ azure-npm-binary:
230238
azure-ip-masq-merger-binary:
231239
cd $(AZURE_IP_MASQ_MERGER_DIR) && CGO_ENABLED=0 go build -v -o $(AZURE_IP_MASQ_MERGER_BUILD_DIR)/azure-ip-masq-merger$(EXE_EXT) -ldflags "-X main.version=$(AZURE_IP_MASQ_MERGER_VERSION)" -gcflags="-dwarflocationlists=true"
232240

241+
# Build the azure-iptables-monitor binary.
242+
azure-iptables-monitor-binary:
243+
cd $(AZURE_IPTABLES_MONITOR_DIR) && CGO_ENABLED=0 go build -v -o $(AZURE_IPTABLES_MONITOR_BUILD_DIR)/azure-iptables-monitor$(EXE_EXT) -ldflags "-X main.version=$(AZURE_IPTABLES_MONITOR_VERSION)" -gcflags="-dwarflocationlists=true"
244+
233245
##@ Containers
234246

235247
## Common variables for all containers.
@@ -268,25 +280,27 @@ CONTAINER_TRANSPORT = docker
268280
endif
269281

270282
## Image name definitions.
271-
ACNCLI_IMAGE = acncli
272-
AZURE_IPAM_IMAGE = azure-ipam
273-
IPV6_HP_BPF_IMAGE = ipv6-hp-bpf
274-
CNI_IMAGE = azure-cni
275-
CNS_IMAGE = azure-cns
276-
NPM_IMAGE = azure-npm
277-
AZURE_IP_MASQ_MERGER_IMAGE = azure-ip-masq-merger
283+
ACNCLI_IMAGE = acncli
284+
AZURE_IPAM_IMAGE = azure-ipam
285+
IPV6_HP_BPF_IMAGE = ipv6-hp-bpf
286+
CNI_IMAGE = azure-cni
287+
CNS_IMAGE = azure-cns
288+
NPM_IMAGE = azure-npm
289+
AZURE_IP_MASQ_MERGER_IMAGE = azure-ip-masq-merger
290+
AZURE_IPTABLES_MONITOR_IMAGE = azure-iptables-monitor
278291

279292
## Image platform tags.
280-
ACNCLI_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(ACN_VERSION)
281-
AZURE_IPAM_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IPAM_VERSION)
282-
AZURE_IPAM_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IPAM_VERSION)-$(OS_SKU_WIN)
283-
IPV6_HP_BPF_IMAGE_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(IPV6_HP_BPF_VERSION)
284-
CNI_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNI_VERSION)
285-
CNI_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNI_VERSION)-$(OS_SKU_WIN)
286-
CNS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNS_VERSION)
287-
CNS_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNS_VERSION)-$(OS_SKU_WIN)
288-
NPM_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(NPM_VERSION)
293+
ACNCLI_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(ACN_VERSION)
294+
AZURE_IPAM_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IPAM_VERSION)
295+
AZURE_IPAM_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IPAM_VERSION)-$(OS_SKU_WIN)
296+
IPV6_HP_BPF_IMAGE_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(IPV6_HP_BPF_VERSION)
297+
CNI_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNI_VERSION)
298+
CNI_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNI_VERSION)-$(OS_SKU_WIN)
299+
CNS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNS_VERSION)
300+
CNS_WINDOWS_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(CNS_VERSION)-$(OS_SKU_WIN)
301+
NPM_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(NPM_VERSION)
289302
AZURE_IP_MASQ_MERGER_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IP_MASQ_MERGER_VERSION)
303+
AZURE_IPTABLES_MONITOR_PLATFORM_TAG ?= $(subst /,-,$(PLATFORM))-$(AZURE_IPTABLES_MONITOR_VERSION)
290304

291305

292306
qemu-user-static: ## Set up the host to run qemu multiplatform container builds.
@@ -424,6 +438,32 @@ azure-ip-masq-merger-image-pull: ## pull azure-ip-masq-merger container image.
424438
IMAGE=$(AZURE_IP_MASQ_MERGER_IMAGE) \
425439
TAG=$(AZURE_IP_MASQ_MERGER_PLATFORM_TAG)
426440

441+
# azure-iptables-monitor
442+
azure-iptables-monitor-image-name: # util target to print the azure-iptables-monitor image name.
443+
@echo $(AZURE_IPTABLES_MONITOR_IMAGE)
444+
445+
azure-iptables-monitor-image-name-and-tag: # util target to print the azure-iptables-monitor image name and tag.
446+
@echo $(IMAGE_REGISTRY)/$(AZURE_IPTABLES_MONITOR_IMAGE):$(AZURE_IPTABLES_MONITOR_PLATFORM_TAG)
447+
448+
azure-iptables-monitor-image: ## build azure-iptables-monitor container image.
449+
$(MAKE) container \
450+
DOCKERFILE=azure-iptables-monitor/Dockerfile \
451+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
452+
PLATFORM=$(PLATFORM) \
453+
TAG=$(AZURE_IPTABLES_MONITOR_PLATFORM_TAG) \
454+
TARGET=$(OS) \
455+
OS=$(OS) \
456+
ARCH=$(ARCH)
457+
458+
azure-iptables-monitor-image-push: ## push azure-iptables-monitor container image.
459+
$(MAKE) container-push \
460+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
461+
TAG=$(AZURE_IPTABLES_MONITOR_PLATFORM_TAG)
462+
463+
azure-iptables-monitor-image-pull: ## pull azure-iptables-monitor container image.
464+
$(MAKE) container-pull \
465+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
466+
TAG=$(AZURE_IPTABLES_MONITOR_PLATFORM_TAG)
427467

428468
# ipv6-hp-bpf
429469

@@ -617,6 +657,22 @@ azure-ip-masq-merger-skopeo-archive: ## export tar archive of azure-ip-masq-merg
617657
IMAGE=$(AZURE_IP_MASQ_MERGER_IMAGE) \
618658
TAG=$(AZURE_IP_MASQ_MERGER_VERSION)
619659

660+
azure-iptables-monitor-manifest-build: ## build azure-iptables-monitor multiplat container manifest.
661+
$(MAKE) manifest-build \
662+
PLATFORMS="$(PLATFORMS)" \
663+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
664+
TAG=$(AZURE_IPTABLES_MONITOR_VERSION)
665+
666+
azure-iptables-monitor-manifest-push: ## push azure-iptables-monitor multiplat container manifest
667+
$(MAKE) manifest-push \
668+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
669+
TAG=$(AZURE_IPTABLES_MONITOR_VERSION)
670+
671+
azure-iptables-monitor-skopeo-archive: ## export tar archive of azure-iptables-monitor multiplat container manifest.
672+
$(MAKE) manifest-skopeo-archive \
673+
IMAGE=$(AZURE_IPTABLES_MONITOR_IMAGE) \
674+
TAG=$(AZURE_IPTABLES_MONITOR_VERSION)
675+
620676
ipv6-hp-bpf-manifest-build: ## build ipv6-hp-bpf multiplat container manifest.
621677
$(MAKE) manifest-build \
622678
PLATFORMS="$(PLATFORMS)" \
@@ -775,6 +831,14 @@ ifeq ($(GOOS),linux)
775831
cd $(AZURE_IP_MASQ_MERGER_BUILD_DIR) && $(ARCHIVE_CMD) $(AZURE_IP_MASQ_MERGER_ARCHIVE_NAME) azure-ip-masq-merger$(EXE_EXT)
776832
endif
777833

834+
# Create a azure-iptables-monitor archive for the target platform.
835+
.PHONY: azure-iptables-monitor-archive
836+
azure-iptables-monitor-archive: azure-iptables-monitor-binary
837+
ifeq ($(GOOS),linux)
838+
$(MKDIR) $(AZURE_IPTABLES_MONITOR_BUILD_DIR)
839+
cd $(AZURE_IPTABLES_MONITOR_BUILD_DIR) && $(ARCHIVE_CMD) $(AZURE_IPTABLES_MONITOR_ARCHIVE_NAME) azure-iptables-monitor$(EXE_EXT)
840+
endif
841+
778842
# Create a ipv6-hp-bpf archive for the target platform.
779843
.PHONY: ipv6-hp-bpf-archive
780844
ipv6-hp-bpf-archive: ipv6-hp-bpf-binary
@@ -811,6 +875,7 @@ workspace: ## Set up the Go workspace.
811875
go work use .
812876
go work use ./azure-ipam
813877
go work use ./azure-ip-masq-merger
878+
go work use ./azure-iptables-monitor
814879
go work use ./build/tools
815880
go work use ./dropgz
816881
go work use ./zapai
@@ -823,7 +888,7 @@ RESTART_CASE ?= false
823888
# CNI type is a key to direct the types of state validation done on a cluster.
824889
CNI_TYPE ?= cilium
825890

826-
test-all: test-azure-ipam test-azure-ip-masq-merger test-main ## run all unit tests.
891+
test-all: test-azure-ipam test-azure-ip-masq-merger test-azure-iptables-monitor test-main ## run all unit tests.
827892

828893
test-main:
829894
go test -mod=readonly -buildvcs=false -tags "unit" --skip 'TestE2E*' -race -covermode atomic -coverprofile=coverage-main.out $(COVER_PKG)/...
@@ -863,6 +928,9 @@ test-azure-ipam: ## run the unit test for azure-ipam
863928
test-azure-ip-masq-merger: ## run the unit test for azure-ip-masq-merger
864929
cd $(AZURE_IP_MASQ_MERGER_DIR) && go test -race -covermode atomic -coverprofile=../coverage-azure-ip-masq-merger.out && go tool cover -func=../coverage-azure-ip-masq-merger.out
865930

931+
test-azure-iptables-monitor: ## run the unit test for azure-iptables-monitor
932+
cd $(AZURE_IPTABLES_MONITOR_DIR) && go test -race -covermode atomic -coverprofile=../coverage-azure-iptables-monitor.out && go tool cover -func=../coverage-azure-iptables-monitor.out
933+
866934
kind:
867935
kind create cluster --config ./test/kind/kind.yaml
868936

azure-iptables-monitor/Dockerfile

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
ARG ARCH
2+
3+
# mcr.microsoft.com/azurelinux/base/core:3.0
4+
FROM mcr.microsoft.com/azurelinux/base/core@sha256:9948138108a3d69f1dae62104599ac03132225c3b7a5ac57b85a214629c8567d AS mariner-core
5+
6+
# mcr.microsoft.com/azurelinux/distroless/minimal:3.0
7+
FROM mcr.microsoft.com/azurelinux/distroless/minimal@sha256:0801b80a0927309572b9adc99bd1813bc680473175f6e8175cd4124d95dbd50c AS mariner-distroless
8+
9+
# skopeo inspect docker://mcr.microsoft.com/oss/go/microsoft/golang:1.23.2-azurelinux3.0 --format "{{.Name}}@{{.Digest}}"
10+
FROM --platform=linux/${ARCH} mcr.microsoft.com/oss/go/microsoft/golang@sha256:f1f0cbd464ae4cd9d41176d47f1f9fe16a6965425871f817587314e3a04576ec AS go
11+
12+
13+
FROM go AS azure-iptables-monitor
14+
ARG OS
15+
ARG VERSION
16+
WORKDIR /azure-iptables-monitor
17+
COPY ./azure-iptables-monitor .
18+
RUN GOOS=$OS CGO_ENABLED=0 go build -a -o /go/bin/iptables-monitor -trimpath -ldflags "-X main.version="$VERSION"" -gcflags="-dwarflocationlists=true" .
19+
20+
FROM mariner-core AS iptables
21+
RUN tdnf install -y iptables
22+
23+
FROM mariner-distroless AS linux
24+
COPY --from=iptables /usr/sbin/*tables* /usr/sbin/
25+
COPY --from=iptables /usr/lib /usr/lib
26+
COPY --from=azure-iptables-monitor /go/bin/iptables-monitor azure-iptables-monitor
27+
28+
ENTRYPOINT ["/azure-iptables-monitor"]

azure-iptables-monitor/README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# azure-iptables-monitor
2+
3+
`azure-iptables-monitor` is a utility for monitoring iptables rules on Kubernetes nodes and labeling a ciliumnode resource based on whether the corresponding node contains user-defined iptables rules.
4+
5+
## Description
6+
7+
The goal of this program is to periodically scan iptables rules across all tables (nat, mangle, filter, raw, security) and determine if any rules exist that don't match expected patterns. When unexpected rules are found, the ciliumnode resource is labeled to indicate the presence of user-defined iptables rules.
8+
9+
## Usage
10+
11+
Follow the steps below to build and run the program:
12+
13+
1. Build the binary using `make`:
14+
```bash
15+
make azure-iptables-monitor
16+
```
17+
or make an image:
18+
```bash
19+
make azure-iptables-monitor-image
20+
```
21+
22+
2. Deploy or copy the binary to your node(s).
23+
24+
3. Prepare your allowed pattern files in the input directory. Each file should be named after an iptables table (`nat`, `mangle`, `filter`, `raw`, `security`) or `global` and contain regex patterns that match expected iptables rules. You may want to mount a configmap for this purpose.
25+
26+
4. Start the program with:
27+
```bash
28+
./azure-iptables-monitor --input=/etc/config/ --interval=300
29+
```
30+
- The `--input` flag specifies the directory containing allowed regex pattern files. Default: `/etc/config/`
31+
- The `--interval` flag specifies how often to check iptables rules in seconds. Default: `300`
32+
- The `--events` flag enables Kubernetes event creation for rule violations. Default: `false`
33+
- The program must be in a k8s environment and `NODE_NAME` must be a set environment variable with the current node.
34+
35+
5. The program will set the `user-iptables-rules` label to `true` on the specified ciliumnode resource if unexpected rules are found, or `false` if all rules match expected patterns. Proper RBAC is required for patching (patch for ciliumnodes, create for events, get for nodes).
36+
37+
38+
## Pattern File Format
39+
40+
Each pattern file should contain one regex pattern per line:
41+
```
42+
^-A INPUT -i lo -j ACCEPT$
43+
^-A FORWARD -j DOCKER.*
44+
^-A POSTROUTING -s 10\.0\.0\.0/8 -j MASQUERADE$
45+
```
46+
47+
- `global`: Patterns that can match rules in any iptables table
48+
- `nat`, `mangle`, `filter`, `raw`, `security`: Patterns specific to each iptables table
49+
- Empty lines are ignored
50+
- Each line should be a valid Go regex pattern
51+
52+
## Debugging
53+
54+
Logs are output to standard error. Increase verbosity with the `-v` flag:
55+
```bash
56+
./azure-iptables-monitor -v 3
57+
```
58+
59+
## Development
60+
61+
To run tests at the repository level:
62+
```bash
63+
make test-azure-iptables-monitor
64+
```

azure-iptables-monitor/go.mod

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
module github.com/Azure/azure-container-networking/azure-iptables-monitor
2+
3+
go 1.23.0
4+
5+
require (
6+
github.com/coreos/go-iptables v0.8.0
7+
github.com/stretchr/testify v1.9.0
8+
k8s.io/apimachinery v0.31.3
9+
k8s.io/client-go v0.31.3
10+
k8s.io/component-base v0.31.3
11+
k8s.io/klog/v2 v2.130.1
12+
)
13+
14+
require (
15+
github.com/beorn7/perks v1.0.1 // indirect
16+
github.com/blang/semver/v4 v4.0.0 // indirect
17+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
18+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
19+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
20+
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
21+
github.com/go-logr/logr v1.4.2 // indirect
22+
github.com/go-openapi/jsonpointer v0.19.6 // indirect
23+
github.com/go-openapi/jsonreference v0.20.2 // indirect
24+
github.com/go-openapi/swag v0.22.4 // indirect
25+
github.com/gogo/protobuf v1.3.2 // indirect
26+
github.com/golang/protobuf v1.5.4 // indirect
27+
github.com/google/gnostic-models v0.6.8 // indirect
28+
github.com/google/go-cmp v0.6.0 // indirect
29+
github.com/google/gofuzz v1.2.0 // indirect
30+
github.com/google/uuid v1.6.0 // indirect
31+
github.com/inconshreveable/mousetrap v1.1.0 // indirect
32+
github.com/josharian/intern v1.0.0 // indirect
33+
github.com/json-iterator/go v1.1.12 // indirect
34+
github.com/mailru/easyjson v0.7.7 // indirect
35+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
36+
github.com/modern-go/reflect2 v1.0.2 // indirect
37+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
38+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
39+
github.com/prometheus/client_golang v1.19.1 // indirect
40+
github.com/prometheus/client_model v0.6.1 // indirect
41+
github.com/prometheus/common v0.55.0 // indirect
42+
github.com/prometheus/procfs v0.15.1 // indirect
43+
github.com/spf13/cobra v1.8.1 // indirect
44+
github.com/spf13/pflag v1.0.5 // indirect
45+
github.com/x448/float16 v0.8.4 // indirect
46+
golang.org/x/net v0.38.0 // indirect
47+
golang.org/x/oauth2 v0.21.0 // indirect
48+
golang.org/x/sys v0.31.0 // indirect
49+
golang.org/x/term v0.30.0 // indirect
50+
golang.org/x/text v0.23.0 // indirect
51+
golang.org/x/time v0.3.0 // indirect
52+
google.golang.org/protobuf v1.34.2 // indirect
53+
gopkg.in/inf.v0 v0.9.1 // indirect
54+
gopkg.in/yaml.v2 v2.4.0 // indirect
55+
gopkg.in/yaml.v3 v3.0.1 // indirect
56+
k8s.io/api v0.31.3 // indirect
57+
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
58+
k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect
59+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
60+
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
61+
sigs.k8s.io/yaml v1.4.0 // indirect
62+
)

0 commit comments

Comments
 (0)