From 607ccbd49dbb3534ffbba32ec8421cab7ed8fc17 Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Wed, 8 Feb 2023 14:04:08 -0800 Subject: [PATCH] [release-1.24] Allow ServiceLB to honor `ExternalTrafficPolicy=Local` (#6908) * Bump wrangler version for EndpointSlice support Signed-off-by: Brad Davidson (cherry picked from commit 94d1a87509e3dcc4b4561e6f616f18e8b4ae89bb) * Honor Service ExternalTrafficPolicy Signed-off-by: Brad Davidson (cherry picked from commit 369b81b45e28303b35f4ffc6a6c40e9d320eb578) * go generate Signed-off-by: Brad Davidson (cherry picked from commit 1c6fde9a52d55740d82eab0b9b106b2e5d1efefe) --- go.mod | 14 +- go.sum | 29 +-- manifests/ccm.yaml | 8 + pkg/cloudprovider/cloudprovider.go | 9 +- pkg/cloudprovider/servicelb.go | 219 +++++++++++------- pkg/daemons/control/server.go | 6 +- pkg/deploy/zz_generated_bindata.go | 2 +- .../controllers/k3s.cattle.io/factory.go | 5 + 8 files changed, 178 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index 67902f1dba..ff8e18966b 100644 --- a/go.mod +++ b/go.mod @@ -101,15 +101,15 @@ require ( github.com/otiai10/copy v1.7.0 github.com/pkg/errors v0.9.1 github.com/rancher/dynamiclistener v0.3.5 - github.com/rancher/lasso v0.0.0-20210616224652-fc3ebd901c08 + github.com/rancher/lasso v0.0.0-20221227210133-6ea88ca2fbcc github.com/rancher/remotedialer v0.2.6-0.20220624190122-ea57207bf2b8 github.com/rancher/wharfie v0.5.1 - github.com/rancher/wrangler v1.0.0 + github.com/rancher/wrangler v1.0.1-0.20230112175341-ce552e665720 github.com/robfig/cron/v3 v3.0.1 github.com/rootless-containers/rootlesskit v1.0.1 github.com/sirupsen/logrus v1.9.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.8.1 github.com/urfave/cli v1.22.9 github.com/vishvananda/netlink v1.2.1-beta.2 github.com/yl2chen/cidranger v1.0.2 @@ -325,7 +325,7 @@ require ( github.com/spf13/cobra v1.6.1 // indirect github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/stretchr/objx v0.4.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect github.com/tchap/go-patricia v2.3.0+incompatible // indirect github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect @@ -380,15 +380,15 @@ require ( gopkg.in/warnings.v0 v0.1.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.2.2 // indirect - k8s.io/apiextensions-apiserver v0.24.0 // indirect + k8s.io/apiextensions-apiserver v0.25.4 // indirect k8s.io/cli-runtime v0.22.2 // indirect k8s.io/cluster-bootstrap v0.0.0 // indirect - k8s.io/code-generator v0.24.0 // indirect + k8s.io/code-generator v0.25.4 // indirect k8s.io/controller-manager v0.24.10 // indirect k8s.io/csi-translation-lib v0.0.0 // indirect k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-aggregator v0.24.0 // indirect + k8s.io/kube-aggregator v0.25.4 // indirect k8s.io/kube-controller-manager v0.0.0 // indirect k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect k8s.io/kube-proxy v0.0.0 // indirect diff --git a/go.sum b/go.sum index c98faaf48d..4fdb6b0147 100644 --- a/go.sum +++ b/go.sum @@ -314,7 +314,6 @@ github.com/erikdubbelboer/gspt v0.0.0-20190125194910-e68493906b83/go.mod h1:v6o7 github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -362,11 +361,9 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= @@ -575,7 +572,6 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -889,7 +885,6 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= @@ -975,14 +970,14 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/rancher/dynamiclistener v0.3.5 h1:5TaIHvkDGmZKvc96Huur16zfTKOiLhDtK4S+WV0JA6A= github.com/rancher/dynamiclistener v0.3.5/go.mod h1:dW/YF6/m2+uEyJ5VtEcd9THxda599HP6N9dSXk81+k0= -github.com/rancher/lasso v0.0.0-20210616224652-fc3ebd901c08 h1:NxR8Fh0eE7/5/5Zvlog9B5NVjWKqBSb1WYMUF7/IE5c= -github.com/rancher/lasso v0.0.0-20210616224652-fc3ebd901c08/go.mod h1:9qZd/S8DqWzfKtjKGgSoHqGEByYmUE3qRaBaaAHwfEM= +github.com/rancher/lasso v0.0.0-20221227210133-6ea88ca2fbcc h1:29VHrInLV4qSevvcvhBj5UhQWkPShxrxv4AahYg2Scw= +github.com/rancher/lasso v0.0.0-20221227210133-6ea88ca2fbcc/go.mod h1:dEfC9eFQigj95lv/JQ8K5e7+qQCacWs1aIA6nLxKzT8= github.com/rancher/remotedialer v0.2.6-0.20220624190122-ea57207bf2b8 h1:leqh0chjBsXhKWebxxFd5QPcoQLu51EpaHo04ce0o+8= github.com/rancher/remotedialer v0.2.6-0.20220624190122-ea57207bf2b8/go.mod h1:BwwztuvViX2JrLLUwDlsYt5DiyUwHLlzynRwkZLAY0Q= github.com/rancher/wharfie v0.5.1 h1:TUqZyNj6BaGe2+tqhwAGwZouuwx02mvAMMjNuyejc5I= github.com/rancher/wharfie v0.5.1/go.mod h1:5AHZRFBAOWYPDNCwj/y5Dpj+MMwXLoitPwxjYAIbcxQ= -github.com/rancher/wrangler v1.0.0 h1:K+GHMhkpgcGIfYgOX9RKdEEiM8o3WjFpI2U0ljxy+bg= -github.com/rancher/wrangler v1.0.0/go.mod h1:TR0R07P5oU6T2bO+6eOX0jcFvKy+zoDd6u+PZ2mHJKg= +github.com/rancher/wrangler v1.0.1-0.20230112175341-ce552e665720 h1:2LOrj1wDsHTp8hr6rD4HyocIXbqjVyACfZOWdSh3YRg= +github.com/rancher/wrangler v1.0.1-0.20230112175341-ce552e665720/go.mod h1:lQorqAAIMkNWteece1GiuwZTmMqkaVTXL5qjiiPVDxQ= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= @@ -1056,7 +1051,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spyzhov/ajson v0.4.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= @@ -1065,8 +1059,9 @@ github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwb github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1074,8 +1069,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1254,7 +1250,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= @@ -1320,7 +1315,6 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -1388,7 +1382,6 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1402,7 +1395,6 @@ golang.zx2c4.com/wireguard v0.0.0-20211129173154-2dd424e2d808 h1:rdIdofxHfxUJ3rQ golang.zx2c4.com/wireguard v0.0.0-20211129173154-2dd424e2d808/go.mod h1:TjUWrnD5ATh7bFvmm/ALEJZQ4ivKbETb6pmyj1vUoNI= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671 h1:tJAYx7pB6b5bNqi7XatStqFT2zFAxhXcGDq1R6FqqjU= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671/go.mod h1:Q2XNgour4QSkFj0BWCkVlW0HWJwQgNMsMahpSlI0Eno= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.6.2 h1:4r+yNT0+8SWcOkXP+63H2zQbN+USnC73cjGUxnDF94Q= @@ -1529,8 +1521,6 @@ k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClC k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/system-validators v1.8.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -1547,8 +1537,6 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 h1:+xBL5uTc+BkPBwmMi3vYfUJjq+N3K+H6PXeETwf5cPI= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo= -sigs.k8s.io/cli-utils v0.27.0/go.mod h1:8ll2fyx+bzjbwmwUnKBQU+2LDbMDsxy44DiDZ+drALg= -sigs.k8s.io/controller-runtime v0.10.1/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= @@ -1557,7 +1545,6 @@ sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yN sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= sigs.k8s.io/kustomize/kustomize/v4 v4.5.4 h1:rzGrL+DA4k8bT6SMz7/U+2z3iiZf1t2RaYJWx8OeTmE= sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.12.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= sigs.k8s.io/kustomize/kyaml v0.13.6 h1:eF+wsn4J7GOAXlvajv6OknSunxpcOBQQqsnPxObtkGs= sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/manifests/ccm.yaml b/manifests/ccm.yaml index f66a68ce1c..d72b7fded9 100644 --- a/manifests/ccm.yaml +++ b/manifests/ccm.yaml @@ -67,6 +67,14 @@ rules: - daemonsets verbs: - "*" +- apiGroups: + - "discovery.k8s.io" + resources: + - endpointslices + verbs: + - get + - list + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding diff --git a/pkg/cloudprovider/cloudprovider.go b/pkg/cloudprovider/cloudprovider.go index 1263a1c448..9b5fa53465 100644 --- a/pkg/cloudprovider/cloudprovider.go +++ b/pkg/cloudprovider/cloudprovider.go @@ -13,6 +13,8 @@ import ( appsclient "github.com/rancher/wrangler/pkg/generated/controllers/apps/v1" "github.com/rancher/wrangler/pkg/generated/controllers/core" coreclient "github.com/rancher/wrangler/pkg/generated/controllers/core/v1" + "github.com/rancher/wrangler/pkg/generated/controllers/discovery" + discoveryclient "github.com/rancher/wrangler/pkg/generated/controllers/discovery/v1" "github.com/rancher/wrangler/pkg/generic" "github.com/rancher/wrangler/pkg/start" "github.com/sirupsen/logrus" @@ -41,6 +43,7 @@ type k3s struct { processor apply.Apply daemonsetCache appsclient.DaemonSetCache + endpointsCache discoveryclient.EndpointSliceCache nodeCache coreclient.NodeCache podCache coreclient.PodCache workqueue workqueue.RateLimitingInterface @@ -89,6 +92,7 @@ func (k *k3s) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, st lbCoreFactory := core.NewFactoryFromConfigWithOptionsOrDie(config, &generic.FactoryOptions{Namespace: k.LBNamespace}) lbAppsFactory := apps.NewFactoryFromConfigWithOptionsOrDie(config, &generic.FactoryOptions{Namespace: k.LBNamespace}) + lbDiscFactory := discovery.NewFactoryFromConfigOrDie(config) processor, err := apply.NewForConfig(config) if err != nil { @@ -96,14 +100,15 @@ func (k *k3s) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, st } k.processor = processor.WithDynamicLookup().WithCacheTypes(lbAppsFactory.Apps().V1().DaemonSet()) k.daemonsetCache = lbAppsFactory.Apps().V1().DaemonSet().Cache() + k.endpointsCache = lbDiscFactory.Discovery().V1().EndpointSlice().Cache() k.podCache = lbCoreFactory.Core().V1().Pod().Cache() k.workqueue = workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) - if err := k.Register(ctx, coreFactory.Core().V1().Node(), lbCoreFactory.Core().V1().Pod()); err != nil { + if err := k.Register(ctx, coreFactory.Core().V1().Node(), lbCoreFactory.Core().V1().Pod(), lbDiscFactory.Discovery().V1().EndpointSlice()); err != nil { logrus.Fatalf("Failed to register %s handlers: %v", controllerName, err) } - if err := start.All(ctx, 1, coreFactory, lbCoreFactory, lbAppsFactory); err != nil { + if err := start.All(ctx, 1, coreFactory, lbCoreFactory, lbAppsFactory, lbDiscFactory); err != nil { logrus.Fatalf("Failed to start %s controllers: %v", controllerName, err) } } else { diff --git a/pkg/cloudprovider/servicelb.go b/pkg/cloudprovider/servicelb.go index dfc70bcae5..89478f2069 100644 --- a/pkg/cloudprovider/servicelb.go +++ b/pkg/cloudprovider/servicelb.go @@ -12,11 +12,13 @@ import ( "github.com/k3s-io/k3s/pkg/version" "github.com/rancher/wrangler/pkg/condition" coreclient "github.com/rancher/wrangler/pkg/generated/controllers/core/v1" + discoveryclient "github.com/rancher/wrangler/pkg/generated/controllers/discovery/v1" "github.com/rancher/wrangler/pkg/merr" "github.com/rancher/wrangler/pkg/objectset" "github.com/sirupsen/logrus" apps "k8s.io/api/apps/v1" core "k8s.io/api/core/v1" + discovery "k8s.io/api/discovery/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -48,9 +50,11 @@ const ( func (k *k3s) Register(ctx context.Context, nodes coreclient.NodeController, pods coreclient.PodController, + endpointslices discoveryclient.EndpointSliceController, ) error { nodes.OnChange(ctx, controllerName, k.onChangeNode) pods.OnChange(ctx, controllerName, k.onChangePod) + endpointslices.OnChange(ctx, controllerName, k.onChangeEndpointSlice) if err := k.createServiceLBNamespace(ctx); err != nil { return err @@ -135,6 +139,22 @@ func (k *k3s) onChangeNode(key string, node *core.Node) (*core.Node, error) { return node, nil } +// onChangeEndpointSlice handles changes to EndpointSlices. This is used to ensure that LoadBalancer +// addresses only list Nodes with ready Pods, when their ExternalTrafficPolicy is set to Local. +func (k *k3s) onChangeEndpointSlice(key string, eps *discovery.EndpointSlice) (*discovery.EndpointSlice, error) { + if eps == nil { + return nil, nil + } + + serviceName, ok := eps.Labels[discovery.LabelServiceName] + if !ok { + return eps, nil + } + + k.workqueue.Add(eps.Namespace + "/" + serviceName) + return eps, nil +} + // runWorker dequeues Service changes from the work queue // We run a lightweight work queue to handle service updates. We don't need the full overhead // of a wrangler service controller and shared informer cache, but we do want to run changes @@ -219,16 +239,37 @@ func (k *k3s) getDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { // getStatus returns a LoadBalancerStatus listing ingress IPs for all ready pods // matching the selected service. func (k *k3s) getStatus(svc *core.Service) (*core.LoadBalancerStatus, error) { - pods, err := k.podCache.List(k.LBNamespace, labels.SelectorFromSet(map[string]string{ + var readyNodes map[string]bool + + if servicehelper.RequestsOnlyLocalTraffic(svc) { + readyNodes = map[string]bool{} + eps, err := k.endpointsCache.List(svc.Namespace, labels.SelectorFromSet(labels.Set{ + discovery.LabelServiceName: svc.Name, + })) + if err != nil { + return nil, err + } + + for _, ep := range eps { + for _, endpoint := range ep.Endpoints { + isPod := endpoint.TargetRef != nil && endpoint.TargetRef.Kind == "Pod" + isReady := endpoint.Conditions.Ready != nil && *endpoint.Conditions.Ready + if isPod && isReady && endpoint.NodeName != nil { + readyNodes[*endpoint.NodeName] = true + } + } + } + } + + pods, err := k.podCache.List(k.LBNamespace, labels.SelectorFromSet(labels.Set{ svcNameLabel: svc.Name, svcNamespaceLabel: svc.Namespace, })) - if err != nil { return nil, err } - expectedIPs, err := k.podIPs(pods, svc) + expectedIPs, err := k.podIPs(pods, svc, readyNodes) if err != nil { return nil, err } @@ -267,7 +308,7 @@ func (k *k3s) patchStatus(svc *core.Service, previousStatus, newStatus *core.Loa // podIPs returns a list of IPs for Nodes hosting ServiceLB Pods. // If at least one node has External IPs available, only external IPs are returned. // If no nodes have External IPs set, the Internal IPs of all nodes running pods are returned. -func (k *k3s) podIPs(pods []*core.Pod, svc *core.Service) ([]string, error) { +func (k *k3s) podIPs(pods []*core.Pod, svc *core.Service, readyNodes map[string]bool) ([]string, error) { // Go doesn't have sets so we stuff things into a map of bools and then get lists of keys // to determine the unique set of IPs in use by pods. extIPs := map[string]bool{} @@ -280,6 +321,9 @@ func (k *k3s) podIPs(pods []*core.Pod, svc *core.Service) ([]string, error) { if !Ready.IsTrue(pod) { continue } + if readyNodes != nil && !readyNodes[pod.Spec.NodeName] { + continue + } node, err := k.nodeCache.Get(pod.Spec.NodeName) if apierrors.IsNotFound(err) { @@ -405,54 +449,12 @@ func (k *k3s) deleteDaemonSet(ctx context.Context, svc *core.Service) error { func (k *k3s) newDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { name := generateName(svc) oneInt := intstr.FromInt(1) - + localTraffic := servicehelper.RequestsOnlyLocalTraffic(svc) sourceRanges, err := servicehelper.GetLoadBalancerSourceRanges(svc) if err != nil { return nil, err } - ds := &apps.DaemonSet{ - ObjectMeta: meta.ObjectMeta{ - Name: name, - Namespace: k.LBNamespace, - Labels: map[string]string{ - nodeSelectorLabel: "false", - svcNameLabel: svc.Name, - svcNamespaceLabel: svc.Namespace, - }, - }, - TypeMeta: meta.TypeMeta{ - Kind: "DaemonSet", - APIVersion: "apps/v1", - }, - Spec: apps.DaemonSetSpec{ - Selector: &meta.LabelSelector{ - MatchLabels: map[string]string{ - "app": name, - }, - }, - Template: core.PodTemplateSpec{ - ObjectMeta: meta.ObjectMeta{ - Labels: map[string]string{ - "app": name, - svcNameLabel: svc.Name, - svcNamespaceLabel: svc.Namespace, - }, - }, - Spec: core.PodSpec{ - ServiceAccountName: "svclb", - AutomountServiceAccountToken: utilpointer.Bool(false), - }, - }, - UpdateStrategy: apps.DaemonSetUpdateStrategy{ - Type: apps.RollingUpdateDaemonSetStrategyType, - RollingUpdate: &apps.RollingUpdateDaemonSet{ - MaxUnavailable: &oneInt, - }, - }, - }, - } - var sysctls []core.Sysctl for _, ipFamily := range svc.Spec.IPFamilies { switch ipFamily { @@ -463,7 +465,66 @@ func (k *k3s) newDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { } } - ds.Spec.Template.Spec.SecurityContext = &core.PodSecurityContext{Sysctls: sysctls} + ds := &apps.DaemonSet{ + ObjectMeta: meta.ObjectMeta{ + Name: name, + Namespace: k.LBNamespace, + Labels: labels.Set{ + nodeSelectorLabel: "false", + svcNameLabel: svc.Name, + svcNamespaceLabel: svc.Namespace, + }, + }, + TypeMeta: meta.TypeMeta{ + Kind: "DaemonSet", + APIVersion: "apps/v1", + }, + Spec: apps.DaemonSetSpec{ + Selector: &meta.LabelSelector{ + MatchLabels: labels.Set{ + "app": name, + }, + }, + Template: core.PodTemplateSpec{ + ObjectMeta: meta.ObjectMeta{ + Labels: labels.Set{ + "app": name, + svcNameLabel: svc.Name, + svcNamespaceLabel: svc.Namespace, + }, + }, + Spec: core.PodSpec{ + ServiceAccountName: "svclb", + AutomountServiceAccountToken: utilpointer.Bool(false), + SecurityContext: &core.PodSecurityContext{ + Sysctls: sysctls, + }, + Tolerations: []core.Toleration{ + { + Key: "node-role.kubernetes.io/master", + Operator: "Exists", + Effect: "NoSchedule", + }, + { + Key: "node-role.kubernetes.io/control-plane", + Operator: "Exists", + Effect: "NoSchedule", + }, + { + Key: "CriticalAddonsOnly", + Operator: "Exists", + }, + }, + }, + }, + UpdateStrategy: apps.DaemonSetUpdateStrategy{ + Type: apps.RollingUpdateDaemonSetStrategyType, + RollingUpdate: &apps.RollingUpdateDaemonSet{ + MaxUnavailable: &oneInt, + }, + }, + }, + } for _, port := range svc.Spec.Ports { portName := fmt.Sprintf("lb-%s-%d", strings.ToLower(string(port.Protocol)), port.Port) @@ -492,14 +553,6 @@ func (k *k3s) newDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { Name: "DEST_PROTO", Value: string(port.Protocol), }, - { - Name: "DEST_PORT", - Value: strconv.Itoa(int(port.Port)), - }, - { - Name: "DEST_IPS", - Value: strings.Join(svc.Spec.ClusterIPs, " "), - }, }, SecurityContext: &core.SecurityContext{ Capabilities: &core.Capabilities{ @@ -510,32 +563,37 @@ func (k *k3s) newDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { }, } + if localTraffic { + container.Env = append(container.Env, + core.EnvVar{ + Name: "DEST_PORT", + Value: strconv.Itoa(int(port.NodePort)), + }, + core.EnvVar{ + Name: "DEST_IPS", + ValueFrom: &core.EnvVarSource{ + FieldRef: &core.ObjectFieldSelector{ + FieldPath: "status.hostIP", + }, + }, + }, + ) + } else { + container.Env = append(container.Env, + core.EnvVar{ + Name: "DEST_PORT", + Value: strconv.Itoa(int(port.Port)), + }, + core.EnvVar{ + Name: "DEST_IPS", + Value: strings.Join(svc.Spec.ClusterIPs, " "), + }, + ) + } + ds.Spec.Template.Spec.Containers = append(ds.Spec.Template.Spec.Containers, container) } - // Add toleration to noderole.kubernetes.io/master=*:NoSchedule - masterToleration := core.Toleration{ - Key: "node-role.kubernetes.io/master", - Operator: "Exists", - Effect: "NoSchedule", - } - ds.Spec.Template.Spec.Tolerations = append(ds.Spec.Template.Spec.Tolerations, masterToleration) - - // Add toleration to noderole.kubernetes.io/control-plane=*:NoSchedule - controlPlaneToleration := core.Toleration{ - Key: "node-role.kubernetes.io/control-plane", - Operator: "Exists", - Effect: "NoSchedule", - } - ds.Spec.Template.Spec.Tolerations = append(ds.Spec.Template.Spec.Tolerations, controlPlaneToleration) - - // Add toleration to CriticalAddonsOnly - criticalAddonsOnlyToleration := core.Toleration{ - Key: "CriticalAddonsOnly", - Operator: "Exists", - } - ds.Spec.Template.Spec.Tolerations = append(ds.Spec.Template.Spec.Tolerations, criticalAddonsOnlyToleration) - // Add node selector only if label "svccontroller.k3s.cattle.io/enablelb" exists on the nodes enableNodeSelector, err := k.nodeHasDaemonSetLabel() if err != nil { @@ -551,6 +609,7 @@ func (k *k3s) newDaemonSet(svc *core.Service) (*apps.DaemonSet, error) { } ds.Labels[nodeSelectorLabel] = "true" } + return ds, nil } @@ -563,7 +622,7 @@ func (k *k3s) updateDaemonSets() error { return err } - nodeSelector := labels.SelectorFromSet(map[string]string{nodeSelectorLabel: fmt.Sprintf("%t", !enableNodeSelector)}) + nodeSelector := labels.SelectorFromSet(labels.Set{nodeSelectorLabel: fmt.Sprintf("%t", !enableNodeSelector)}) daemonsets, err := k.daemonsetCache.List(k.LBNamespace, nodeSelector) if err != nil { return err diff --git a/pkg/daemons/control/server.go b/pkg/daemons/control/server.go index 97872a48c6..0104cfa02c 100644 --- a/pkg/daemons/control/server.go +++ b/pkg/daemons/control/server.go @@ -371,9 +371,9 @@ func cloudControllerManager(ctx context.Context, cfg *config.Control) error { func checkForCloudControllerPrivileges(ctx context.Context, runtime *config.ControlRuntime, timeout time.Duration) error { return util.WaitForRBACReady(ctx, runtime.KubeConfigAdmin, timeout, authorizationv1.ResourceAttributes{ Namespace: metav1.NamespaceSystem, - Verb: "*", - Resource: "daemonsets", - Group: "apps", + Verb: "watch", + Resource: "endpointslices", + Group: "discovery.k8s.io", }, version.Program+"-cloud-controller-manager") } diff --git a/pkg/deploy/zz_generated_bindata.go b/pkg/deploy/zz_generated_bindata.go index b6b7cf550f..caed2e52a9 100644 --- a/pkg/deploy/zz_generated_bindata.go +++ b/pkg/deploy/zz_generated_bindata.go @@ -91,7 +91,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _ccmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x94\x4f\x8f\x13\x31\x0c\xc5\xef\xf9\x14\x51\x8f\x48\xe9\x0a\x71\x41\x73\x84\x03\xf7\x95\xe0\xee\x26\x8f\x6e\x68\x26\x8e\x62\xa7\xfc\xf9\xf4\x68\x66\xba\x62\xe8\xa8\x55\xa7\x80\xd8\x9b\x65\xc5\x3f\x3f\x3f\xcb\xa1\x12\x3f\xa1\x4a\xe4\xdc\xd9\xba\x23\xbf\xa5\xa6\x4f\x5c\xe3\x0f\xd2\xc8\x79\x7b\x78\x2b\xdb\xc8\x0f\xc7\xd7\xe6\x10\x73\xe8\xec\xfb\xd4\x44\x51\x1f\x39\xc1\xf4\x50\x0a\xa4\xd4\x19\x6b\x33\xf5\xe8\xec\xe1\x8d\x38\x9f\xb8\x05\xe7\x39\x6b\xe5\x94\x50\x5d\x4f\x99\xf6\xa8\xa6\xb6\x04\xe9\x8c\xb3\x54\xe2\x87\xca\xad\xc8\x50\xe8\xac\x67\xae\x21\xe6\x79\x3f\x63\x6d\x85\x70\xab\x1e\xa7\x47\x09\x24\x10\x63\xed\x11\x75\x77\xca\xed\xa1\x13\xa0\x82\x14\x63\xd8\x4a\x18\xc2\x45\x8f\xcd\x66\x89\xc4\x11\x59\xcf\x90\x33\x54\x21\xf5\x4f\xab\xa1\x99\xc3\xb9\xcc\xcd\xab\xcd\x8a\xda\x07\x51\xd2\x26\x63\x42\x50\x8f\xd1\xcf\x73\x33\xec\xa4\xef\x26\xf0\x33\x67\xaa\xe3\x70\xc1\xc7\x14\x65\x0a\xbe\xde\x85\x5e\x68\x5b\xeb\xdd\x89\x45\xde\x73\xbb\xb4\x99\xdb\x8c\xa4\x1e\x52\x68\x21\x6b\xb6\xdd\x61\xe6\x05\x8b\x4a\x91\x25\x2d\x10\x7a\xce\x82\x73\x45\xe3\x5e\x9d\x33\xf7\x5f\xd0\xbb\x98\x43\xcc\xfb\xd5\x87\xc4\x09\x8f\xf8\x3c\xbc\x7e\x1e\xe0\x4a\x67\x63\xed\xf2\x74\x6f\xea\x23\x6d\xf7\x05\x5e\xc7\x9b\x9d\x10\x1f\x05\xf5\xb6\x5a\xfb\x6b\x09\x9d\x3d\xb4\x1d\x9c\x7c\x17\x45\xff\x5f\x1c\x73\x03\xdf\x05\x24\xec\x49\xf9\xaf\x1a\x38\x4d\xd5\x9d\x35\x78\x29\xce\xfd\xa1\x65\xc8\x1a\xfd\x48\x76\x15\x14\xae\x89\xbb\xd3\xd2\xdf\xbc\xc4\x37\x45\x1e\x66\x73\x54\xe2\xf0\x19\x5c\x94\xf1\x4f\xfc\xfd\x19\x00\x00\xff\xff\x2f\x06\x3f\x61\x0a\x07\x00\x00") +var _ccmYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x94\x41\x8f\x13\x31\x0c\x85\xef\xf3\x2b\xa2\x1e\x91\xd2\x15\xe2\x82\xe6\x08\x07\xee\x2b\xc1\xdd\x4d\x1e\xdd\xd0\x4c\x1c\xd9\x4e\x61\xf9\xf5\x68\x3a\x5d\x31\x74\xb6\xab\xb6\x80\xe0\x16\x59\xf1\xe7\xe7\xe7\xc4\x54\xd3\x27\x88\x26\x2e\xbd\x93\x0d\x85\x35\x35\x7b\x60\x49\xdf\xc9\x12\x97\xf5\xee\xad\xae\x13\xdf\xed\x5f\x77\xbb\x54\x62\xef\xde\xe7\xa6\x06\xb9\xe7\x8c\x6e\x80\x51\x24\xa3\xbe\x73\xae\xd0\x80\xde\xed\xde\xa8\x0f\x99\x5b\xf4\x81\x8b\x09\xe7\x0c\xf1\x03\x15\xda\x42\x3a\x69\x19\xda\x77\xde\x51\x4d\x1f\x84\x5b\xd5\x31\xd1\xbb\xc0\x2c\x31\x95\x79\xbd\xce\x39\x81\x72\x93\x80\xe3\xa5\x0c\x52\x68\xe7\xdc\x1e\xb2\x39\xc6\xb6\xb0\x09\x20\x20\xc3\xe1\xd8\x6a\x1c\x8f\x8b\x1a\xab\xd5\x12\x89\x3d\x8a\x9d\x20\x67\xa8\x4a\x16\x1e\xae\x86\x16\x8e\xa7\x32\x57\xaf\x56\x57\xe4\xde\xa9\x91\x35\x3d\x04\x14\xb2\x4f\x61\x1e\x9b\x61\x27\x7d\x17\x81\x9f\x38\x53\x1e\xc7\x33\x3e\xe6\xa4\xd3\xe1\xeb\x4d\xe8\x85\xb6\x6b\xbd\x3b\xb2\x28\x04\x6e\xe7\x26\x73\x99\x91\x34\x40\x2b\x2d\x64\xcd\xa6\x3b\xf6\xbc\x60\x51\xad\xba\xa4\x45\xc2\xc0\x45\x71\xaa\xe8\xf9\xb9\xc6\xa4\x81\xf7\x90\xc7\xe3\x53\x7e\xee\xe1\x95\x58\x39\x15\xd3\xbc\x74\xee\xdc\x2c\xbc\xef\x6e\xff\xa9\xef\x52\x89\xa9\x6c\xaf\xfe\xb0\x9c\x71\x8f\xcf\xe3\xed\xa7\x2e\x5f\xa8\xdc\x39\xb7\x5c\x11\x17\xd5\xd1\xb6\xf9\x82\x60\x87\xdd\x30\x21\x3e\x2a\xe4\xb2\x5c\xf7\x73\xd8\xbd\xdb\xb5\x0d\xbc\x3e\xaa\x61\xf8\x27\x8e\xf9\x91\xef\x23\x32\xb6\x64\xfc\x47\x0d\x9c\xba\xea\x4f\x0a\xfc\x2f\xce\xfd\xa6\x65\x28\x96\xc2\x81\xec\x05\x14\x5f\x12\x77\xa3\xa5\xbf\x78\x89\x6f\x86\x32\xf6\xe6\xa9\xa6\x71\xe9\x9c\x95\xf1\x57\xfc\xfd\x11\x00\x00\xff\xff\x4d\x03\x00\xa3\x72\x07\x00\x00") func ccmYamlBytes() ([]byte, error) { return bindataRead( diff --git a/pkg/generated/controllers/k3s.cattle.io/factory.go b/pkg/generated/controllers/k3s.cattle.io/factory.go index f5c93e2351..48e7051db6 100644 --- a/pkg/generated/controllers/k3s.cattle.io/factory.go +++ b/pkg/generated/controllers/k3s.cattle.io/factory.go @@ -19,6 +19,7 @@ limitations under the License. package k3s import ( + "github.com/rancher/lasso/pkg/controller" "github.com/rancher/wrangler/pkg/generic" "k8s.io/client-go/rest" ) @@ -65,3 +66,7 @@ func NewFactoryFromConfigWithOptionsOrDie(config *rest.Config, opts *FactoryOpti func (c *Factory) K3s() Interface { return New(c.ControllerFactory()) } + +func (c *Factory) WithAgent(userAgent string) Interface { + return New(controller.NewSharedControllerFactoryWithAgent(userAgent, c.ControllerFactory())) +}