From b85c166e033e3272924d110314ca0f11bcb3c8ca Mon Sep 17 00:00:00 2001 From: Amanuel Engeda Date: Sun, 6 Aug 2023 23:25:35 -0700 Subject: [PATCH] Matrix --- Makefile | 5 +- cmd/controller/main.go | 16 +++++ go.mod | 5 ++ go.sum | 10 +++ hack/code/version_compatibility.go | 69 +++++++++++++++++++++ hack/compatibility-karpenter.yaml | 32 ++++++++++ hack/docs/compatibilitymetrix_gen_docs.go | 54 ++++++++++++++++ hack/docsgen.sh | 15 +++++ hack/toolchain.sh | 1 + website/content/en/preview/upgrade-guide.md | 18 ++++++ 10 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 hack/code/version_compatibility.go create mode 100644 hack/compatibility-karpenter.yaml create mode 100644 hack/docs/compatibilitymetrix_gen_docs.go create mode 100755 hack/docsgen.sh diff --git a/Makefile b/Makefile index 0eea2816ae43..693716ced1dd 100644 --- a/Makefile +++ b/Makefile @@ -153,10 +153,7 @@ delete: ## Delete the controller from your ~/.kube/config cluster helm uninstall karpenter --namespace karpenter docgen: ## Generate docs - go run hack/docs/metrics_gen_docs.go pkg/ $(KARPENTER_CORE_DIR)/pkg website/content/en/preview/concepts/metrics.md - go run hack/docs/instancetypes_gen_docs.go website/content/en/preview/concepts/instance-types.md - go run hack/docs/configuration_gen_docs.go website/content/en/preview/concepts/settings.md - cd charts/karpenter && helm-docs + $(WITH_GOFLAGS) ./hack/docsgen.sh codegen: ## Auto generate files based on AWS APIs response $(WITH_GOFLAGS) ./hack/codegen.sh diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 0146572b9f2c..b3306a38b702 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -15,7 +15,11 @@ limitations under the License. package main import ( + "github.com/bwagner5/kompat/pkg/kompat" "github.com/samber/lo" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "knative.dev/pkg/logging" "github.com/aws/karpenter/pkg/cloudprovider" "github.com/aws/karpenter/pkg/controllers" @@ -43,6 +47,18 @@ func main() { lo.Must0(op.AddHealthzCheck("cloud-provider", awsCloudProvider.LivenessProbe)) cloudProvider := metrics.Decorate(awsCloudProvider) + cm := &v1.ConfigMap{} + op.GetClient().Get(ctx, types.NamespacedName{Name: "karpenter-global-settings"}, cm) + + k8sVersion, err := op.AMIProvider.KubeServerVersion(ctx) + if err != nil { + logging.FromContext(ctx).Error(err) + } + err = kompat.IsCompatible("hack/compatibility-karpenter.yaml", cm.Labels["app.kubernetes.io/version"], k8sVersion) + if err != nil { + logging.FromContext(ctx).Error(err) + } + op. WithControllers(ctx, corecontrollers.NewControllers( ctx, diff --git a/go.mod b/go.mod index af17c310ebf2..34ef5650aae0 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/avast/retry-go v3.0.0+incompatible github.com/aws/aws-sdk-go v1.44.328 github.com/aws/karpenter-core v0.30.0 + github.com/bwagner5/kompat v0.0.7 github.com/imdario/mergo v0.3.16 github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/onsi/ginkgo/v2 v2.11.0 @@ -32,6 +33,7 @@ require ( require ( contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect + github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -69,10 +71,13 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.42.0 // indirect diff --git a/go.sum b/go.sum index 3baa07bbad21..41109bd7f112 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Pallinder/go-randomdata v1.2.0 h1:DZ41wBchNRb/0GfsePLiSwb0PHZmT67XY00lCDlaYPg= github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= @@ -66,6 +68,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/bwagner5/kompat v0.0.7 h1:43CcqT8AzF4ICAEc8ki63phtygm2iUUjvTQ6TGaUE9M= +github.com/bwagner5/kompat v0.0.7/go.mod h1:WswcKnNuBpwuY21Kn+P5zo462Y7vJIp5nwo4AjnBvYw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= @@ -245,9 +249,13 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -261,6 +269,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= diff --git a/hack/code/version_compatibility.go b/hack/code/version_compatibility.go new file mode 100644 index 000000000000..92334aa8bca2 --- /dev/null +++ b/hack/code/version_compatibility.go @@ -0,0 +1,69 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "log" + "net/http" + "os" + "strings" + + "github.com/PuerkitoBio/goquery" + "github.com/samber/lo" +) + +var uri = "https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html" +var outputFileName = "hack/compatibility-karpenter.yaml" + +func main() { + if len(os.Args) != 2 { + log.Fatalf("Usage: %s karpenter version", os.Args[0]) + } + if os.Args[1] == "no tag" { + log.Printf("No version") + os.Exit(1) + } + response := lo.Must(http.Get(uri)) + defer response.Body.Close() + + doc := lo.Must(goquery.NewDocumentFromReader(response.Body)) + supportedEKSversions := doc.Find("ul").Eq(0).Find("li").Find("p").Find("code").Nodes + + // flag for the kompat tool for number of k8s version needed + fmt.Print(len(supportedEKSversions)) + minK8sVersion := supportedEKSversions[len(supportedEKSversions)-1].FirstChild.Data + maxK8sVersion := supportedEKSversions[0].FirstChild.Data + + version := strings.TrimSuffix(strings.TrimPrefix(os.Args[1], "v"), "0") + "x" + appendVersion := fmt.Sprintf( + ` + - appVersion: %s + minK8sVersion: %s + maxK8sVersion: %s`, version, minK8sVersion, maxK8sVersion) + + yamlFile, err := os.ReadFile(outputFileName) + if err != nil { + log.Printf("Can't read %s file: %v", os.Args[1], err) + os.Exit(2) + } + + log.Println("writing output to", outputFileName) + f, err := os.Create(outputFileName) + if err != nil { + log.Fatalf("unable to open %s to write generated output: %v", outputFileName, err) + } + f.WriteString(string(yamlFile) + appendVersion) +} diff --git a/hack/compatibility-karpenter.yaml b/hack/compatibility-karpenter.yaml new file mode 100644 index 000000000000..fedbba2be9e5 --- /dev/null +++ b/hack/compatibility-karpenter.yaml @@ -0,0 +1,32 @@ +name: "karpenter" +compatibility: + - appVersion: 0.21.x + minK8sVersion: 1.21 + maxK8sVersion: 1.24 + - appVersion: 0.22.x + minK8sVersion: 1.21 + maxK8sVersion: 1.24 + - appVersion: 0.23.x + minK8sVersion: 1.21 + maxK8sVersion: 1.24 + - appVersion: 0.24.x + minK8sVersion: 1.21 + maxK8sVersion: 1.24 + - appVersion: 0.25.x + minK8sVersion: 1.21 + maxK8sVersion: 1.25 + - appVersion: 0.26.x + minK8sVersion: 1.21 + maxK8sVersion: 1.25 + - appVersion: 0.27.x + minK8sVersion: 1.21 + maxK8sVersion: 1.25 + - appVersion: 0.28.x + minK8sVersion: 1.23 + maxK8sVersion: 1.27 + - appVersion: 0.29.x + minK8sVersion: 1.23 + maxK8sVersion: 1.27 + - appVersion: 0.30.x + minK8sVersion: 1.23 + maxK8sVersion: 1.27 \ No newline at end of file diff --git a/hack/docs/compatibilitymetrix_gen_docs.go b/hack/docs/compatibilitymetrix_gen_docs.go new file mode 100644 index 000000000000..cf7642e07b0d --- /dev/null +++ b/hack/docs/compatibilitymetrix_gen_docs.go @@ -0,0 +1,54 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "log" + "os" + "strings" +) + +func main() { + if len(os.Args) != 3 { + log.Fatalf("Usage: %s path/to/markdown.md", os.Args[0]) + } + outputFileName := os.Args[1] + mdFile, err := os.ReadFile(outputFileName) + if err != nil { + log.Printf("Can't read %s file: %v", os.Args[1], err) + os.Exit(2) + } + + genStart := "[comment]: <> (the content below is generated from hack/docs/compataiblitymetrix_gen_docs.go)" + genEnd := "[comment]: <> (end docs generated content from hack/docs/compataiblitymetrix_gen_docs.go)" + startDocSections := strings.Split(string(mdFile), genStart) + if len(startDocSections) != 2 { + log.Fatalf("expected one generated comment block start but got %d", len(startDocSections)-1) + } + endDocSections := strings.Split(string(mdFile), genEnd) + if len(endDocSections) != 2 { + log.Fatalf("expected one generated comment block end but got %d", len(endDocSections)-1) + } + topDoc := fmt.Sprintf("%s%s\n\n", startDocSections[0], genStart) + bottomDoc := fmt.Sprintf("\n%s%s", genEnd, endDocSections[1]) + + log.Println("writing output to", outputFileName) + f, err := os.Create(outputFileName) + if err != nil { + log.Fatalf("unable to open %s to write generated output: %v", outputFileName, err) + } + f.WriteString(topDoc + os.Args[2] + "\n" + bottomDoc) +} diff --git a/hack/docsgen.sh b/hack/docsgen.sh new file mode 100755 index 000000000000..6249922c928c --- /dev/null +++ b/hack/docsgen.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +compatibilitymetrix() { + supportedVersion=$(go run hack/code/version_compatibility.go "$(git describe --exact-match --tags || echo "no tag")") + matrixs="$(kompat hack/compatibility-karpenter.yaml -n $supportedVersion)" + go run hack/docs/compatibilitymetrix_gen_docs.go website/content/en/preview/upgrade-guide.md "$matrixs" +} + + +compatibilitymetrix +go run hack/docs/metrics_gen_docs.go pkg/ $(KARPENTER_CORE_DIR)/pkg website/content/en/preview/concepts/metrics.md +go run hack/docs/instancetypes_gen_docs.go website/content/en/preview/concepts/instance-types.md +go run hack/docs/configuration_gen_docs.go website/content/en/preview/concepts/settings.md +cd charts/karpenter && helm-docs \ No newline at end of file diff --git a/hack/toolchain.sh b/hack/toolchain.sh index 6eef1ec96b12..8482ac3e48dc 100755 --- a/hack/toolchain.sh +++ b/hack/toolchain.sh @@ -21,6 +21,7 @@ tools() { go install -tags extended github.com/gohugoio/hugo@v0.110.0 go install golang.org/x/vuln/cmd/govulncheck@latest go install github.com/onsi/ginkgo/v2/ginkgo@latest + go install github.com/bwagner5/kompat/cmd/kompat@latest if ! echo "$PATH" | grep -q "${GOPATH:-undefined}/bin\|$HOME/go/bin"; then echo "Go workspace's \"bin\" directory is not in PATH. Run 'export PATH=\"\$PATH:\${GOPATH:-\$HOME/go}/bin\"'." diff --git a/website/content/en/preview/upgrade-guide.md b/website/content/en/preview/upgrade-guide.md index 1843ac8b525b..be43698e536c 100644 --- a/website/content/en/preview/upgrade-guide.md +++ b/website/content/en/preview/upgrade-guide.md @@ -11,6 +11,24 @@ Use your existing upgrade mechanisms to upgrade your core add-ons in Kubernetes To make upgrading easier we aim to minimize introduction of breaking changes with the followings: +## Compatibility Matrix + +[comment]: <> (the content below is generated from hack/docs/compataiblitymetrix_gen_docs.go) + +| KUBERNETES | 1.23 | 1.24 | 1.25 | 1.26 | 1.27 | +|------------|---------|---------|---------|---------|---------| +| karpenter | 0.21.x+ | 0.21.x+ | 0.25.x+ | 0.28.x+ | 0.28.x+ | + +[comment]: <> (end docs generated content from hack/docs/compataiblitymetrix_gen_docs.go) + +{{% alert title="Note" color="warning" %}} +Karpenter currently does not support the following [new `topologySpreadConstraints` keys](https://kubernetes.io/blog/2023/04/17/fine-grained-pod-topology-spread-features-beta/), promoted to beta in Kubernetes 1.27: +- `matchLabelKeys` +- `nodeAffinityPolicy` +- `nodeTaintsPolicy` + +For more information on Karpenter's support for these keys, view [this tracking issue](https://github.com/aws/karpenter-core/issues/430). +{{% /alert %}} ## Compatibility issues To make upgrading easier, we aim to minimize the introduction of breaking changes with the followings components: