mirror of https://github.com/k3s-io/k3s
Use helper to set consistent rest.Config rate limits and timeouts
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
(cherry picked from commit 71918e0d69
)
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
pull/11460/head
parent
3c064d17db
commit
fba0f092d4
|
@ -26,12 +26,12 @@ import (
|
||||||
"github.com/coreos/go-iptables/iptables"
|
"github.com/coreos/go-iptables/iptables"
|
||||||
"github.com/k3s-io/k3s/pkg/daemons/config"
|
"github.com/k3s-io/k3s/pkg/daemons/config"
|
||||||
"github.com/k3s-io/k3s/pkg/metrics"
|
"github.com/k3s-io/k3s/pkg/metrics"
|
||||||
|
"github.com/k3s-io/k3s/pkg/util"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
v1core "k8s.io/api/core/v1"
|
v1core "k8s.io/api/core/v1"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -57,7 +57,7 @@ func Run(ctx context.Context, nodeConfig *config.Node) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", nodeConfig.AgentConfig.KubeConfigK3sController)
|
restConfig, err := util.GetRESTConfig(nodeConfig.AgentConfig.KubeConfigK3sController)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,6 @@ import (
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
toolswatch "k8s.io/client-go/tools/watch"
|
toolswatch "k8s.io/client-go/tools/watch"
|
||||||
"k8s.io/kubernetes/pkg/cluster/ports"
|
"k8s.io/kubernetes/pkg/cluster/ports"
|
||||||
)
|
)
|
||||||
|
@ -70,7 +69,7 @@ func Setup(ctx context.Context, config *daemonconfig.Node, proxy proxy.Proxy) er
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeRestConfig, err := clientcmd.BuildConfigFromFlags("", config.AgentConfig.KubeConfigKubelet)
|
nodeRestConfig, err := util.GetRESTConfig(config.AgentConfig.KubeConfigKubelet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
"k8s.io/apimachinery/pkg/util/duration"
|
"k8s.io/apimachinery/pkg/util/duration"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
bootstrapapi "k8s.io/cluster-bootstrap/token/api"
|
bootstrapapi "k8s.io/cluster-bootstrap/token/api"
|
||||||
bootstraputil "k8s.io/cluster-bootstrap/token/util"
|
bootstraputil "k8s.io/cluster-bootstrap/token/util"
|
||||||
"k8s.io/utils/ptr"
|
"k8s.io/utils/ptr"
|
||||||
|
@ -48,7 +47,7 @@ func create(app *cli.Context, cfg *cmds.Token) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", cfg.Kubeconfig)
|
restConfig, err := util.GetRESTConfig(cfg.Kubeconfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
utilnet "k8s.io/apimachinery/pkg/util/net"
|
utilnet "k8s.io/apimachinery/pkg/util/net"
|
||||||
"k8s.io/apiserver/pkg/authentication/authenticator"
|
"k8s.io/apiserver/pkg/authentication/authenticator"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
utilsnet "k8s.io/utils/net"
|
utilsnet "k8s.io/utils/net"
|
||||||
)
|
)
|
||||||
|
@ -369,6 +370,7 @@ type ControlRuntime struct {
|
||||||
ClientETCDCert string
|
ClientETCDCert string
|
||||||
ClientETCDKey string
|
ClientETCDKey string
|
||||||
|
|
||||||
|
K8s kubernetes.Interface
|
||||||
K3s *k3s.Factory
|
K3s *k3s.Factory
|
||||||
Core *core.Factory
|
Core *core.Factory
|
||||||
Event record.EventRecorder
|
Event record.EventRecorder
|
||||||
|
|
|
@ -28,7 +28,6 @@ import (
|
||||||
"k8s.io/apiserver/pkg/authentication/authenticator"
|
"k8s.io/apiserver/pkg/authentication/authenticator"
|
||||||
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
toolswatch "k8s.io/client-go/tools/watch"
|
toolswatch "k8s.io/client-go/tools/watch"
|
||||||
cloudprovider "k8s.io/cloud-provider"
|
cloudprovider "k8s.io/cloud-provider"
|
||||||
cloudproviderapi "k8s.io/cloud-provider/api"
|
cloudproviderapi "k8s.io/cloud-provider/api"
|
||||||
|
@ -269,7 +268,7 @@ func (e *Embedded) Docker(ctx context.Context, cfg *daemonconfig.Node) error {
|
||||||
// waitForUntaintedNode watches nodes, waiting to find one not tainted as
|
// waitForUntaintedNode watches nodes, waiting to find one not tainted as
|
||||||
// uninitialized by the external cloud provider.
|
// uninitialized by the external cloud provider.
|
||||||
func waitForUntaintedNode(ctx context.Context, kubeConfig string) error {
|
func waitForUntaintedNode(ctx context.Context, kubeConfig string) error {
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", kubeConfig)
|
restConfig, err := util.GetRESTConfig(kubeConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ import (
|
||||||
"github.com/k3s-io/k3s/pkg/version"
|
"github.com/k3s-io/k3s/pkg/version"
|
||||||
"github.com/prometheus/common/expfmt"
|
"github.com/prometheus/common/expfmt"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
|
|
||||||
"github.com/k3s-io/k3s/pkg/generated/clientset/versioned/scheme"
|
"github.com/k3s-io/k3s/pkg/generated/clientset/versioned/scheme"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
@ -237,7 +236,7 @@ func GetEncryptionConfigMetrics(runtime *config.ControlRuntime, initialMetrics b
|
||||||
var unixUpdateTime int64
|
var unixUpdateTime int64
|
||||||
var reloadSuccessCounter int64
|
var reloadSuccessCounter int64
|
||||||
var lastFailure string
|
var lastFailure string
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", runtime.KubeConfigSupervisor)
|
restConfig, err := util.GetRESTConfig(runtime.KubeConfigSupervisor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, err
|
return 0, 0, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -43,7 +42,7 @@ func NewContext(ctx context.Context, config *Config, forServer bool) (*Context,
|
||||||
if forServer {
|
if forServer {
|
||||||
cfg = config.ControlConfig.Runtime.KubeConfigSupervisor
|
cfg = config.ControlConfig.Runtime.KubeConfigSupervisor
|
||||||
}
|
}
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", cfg)
|
restConfig, err := util.GetRESTConfig(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
"k8s.io/apiserver/pkg/endpoints/request"
|
"k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
bootstrapapi "k8s.io/cluster-bootstrap/token/api"
|
bootstrapapi "k8s.io/cluster-bootstrap/token/api"
|
||||||
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
"k8s.io/kubernetes/pkg/auth/nodeidentifier"
|
||||||
)
|
)
|
||||||
|
@ -305,16 +306,17 @@ func fileHandler(fileName ...string) http.Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiserversHandler(server *config.Control) http.Handler {
|
func apiserversHandler(server *config.Control) http.Handler {
|
||||||
var endpointsClient coreclient.EndpointsClient
|
var endpointsClient typedcorev1.EndpointsInterface
|
||||||
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
|
||||||
|
ctx := req.Context()
|
||||||
var endpoints []string
|
var endpoints []string
|
||||||
if endpointsClient == nil {
|
if endpointsClient == nil {
|
||||||
if server.Runtime.Core != nil {
|
if server.Runtime.Core != nil {
|
||||||
endpointsClient = server.Runtime.Core.Core().V1().Endpoints()
|
endpointsClient = server.Runtime.K8s.CoreV1().Endpoints(metav1.NamespaceDefault)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if endpointsClient != nil {
|
if endpointsClient != nil {
|
||||||
if endpoint, _ := endpointsClient.Get("default", "kubernetes", metav1.GetOptions{}); endpoint != nil {
|
if endpoint, _ := endpointsClient.Get(ctx, "kubernetes", metav1.GetOptions{}); endpoint != nil {
|
||||||
endpoints = util.GetAddresses(endpoint)
|
endpoints = util.GetAddresses(endpoint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,6 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1"
|
apiserverconfigv1 "k8s.io/apiserver/pkg/apis/config/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
"k8s.io/client-go/tools/pager"
|
"k8s.io/client-go/tools/pager"
|
||||||
"k8s.io/client-go/util/retry"
|
"k8s.io/client-go/util/retry"
|
||||||
"k8s.io/utils/ptr"
|
"k8s.io/utils/ptr"
|
||||||
|
@ -395,18 +393,7 @@ func reencryptAndRemoveKey(ctx context.Context, server *config.Control, skip boo
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateSecrets(ctx context.Context, server *config.Control, nodeName string) error {
|
func updateSecrets(ctx context.Context, server *config.Control, nodeName string) error {
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", server.Runtime.KubeConfigSupervisor)
|
k8s := server.Runtime.K8s
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// For secrets we need a much higher QPS than default
|
|
||||||
restConfig.QPS = secretsencrypt.SecretQPS
|
|
||||||
restConfig.Burst = secretsencrypt.SecretBurst
|
|
||||||
k8s, err := kubernetes.NewForConfig(restConfig)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeRef := &corev1.ObjectReference{
|
nodeRef := &corev1.ObjectReference{
|
||||||
Kind: "Node",
|
Kind: "Node",
|
||||||
Name: nodeName,
|
Name: nodeName,
|
||||||
|
|
|
@ -36,7 +36,6 @@ import (
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func ResolveDataDir(dataDir string) (string, error) {
|
func ResolveDataDir(dataDir string) (string, error) {
|
||||||
|
@ -114,6 +113,7 @@ func runControllers(ctx context.Context, config *Config) error {
|
||||||
controlConfig.Runtime.NodePasswdFile); err != nil {
|
controlConfig.Runtime.NodePasswdFile); err != nil {
|
||||||
logrus.Warn(errors.Wrap(err, "error migrating node-password file"))
|
logrus.Warn(errors.Wrap(err, "error migrating node-password file"))
|
||||||
}
|
}
|
||||||
|
controlConfig.Runtime.K8s = sc.K8s
|
||||||
controlConfig.Runtime.K3s = sc.K3s
|
controlConfig.Runtime.K3s = sc.K3s
|
||||||
controlConfig.Runtime.Event = sc.Event
|
controlConfig.Runtime.Event = sc.Event
|
||||||
controlConfig.Runtime.Core = sc.Core
|
controlConfig.Runtime.Core = sc.Core
|
||||||
|
@ -209,7 +209,7 @@ func coreControllers(ctx context.Context, sc *Context, config *Config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.ControlConfig.DisableHelmController {
|
if !config.ControlConfig.DisableHelmController {
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", config.ControlConfig.Runtime.KubeConfigSupervisor)
|
restConfig, err := util.GetRESTConfig(config.ControlConfig.Runtime.KubeConfigSupervisor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@ func stageFiles(ctx context.Context, sc *Context, controlConfig *config.Control)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", controlConfig.Runtime.KubeConfigSupervisor)
|
restConfig, err := util.GetRESTConfig(controlConfig.Runtime.KubeConfigSupervisor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import (
|
||||||
authorizationv1client "k8s.io/client-go/kubernetes/typed/authorization/v1"
|
authorizationv1client "k8s.io/client-go/kubernetes/typed/authorization/v1"
|
||||||
coregetter "k8s.io/client-go/kubernetes/typed/core/v1"
|
coregetter "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -58,7 +57,7 @@ func GetAddresses(endpoint *v1.Endpoints) []string {
|
||||||
// readyz endpoint instead of the deprecated healthz endpoint, and supports context.
|
// readyz endpoint instead of the deprecated healthz endpoint, and supports context.
|
||||||
func WaitForAPIServerReady(ctx context.Context, kubeconfigPath string, timeout time.Duration) error {
|
func WaitForAPIServerReady(ctx context.Context, kubeconfigPath string, timeout time.Duration) error {
|
||||||
var lastErr error
|
var lastErr error
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
|
restConfig, err := GetRESTConfig(kubeconfigPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -112,7 +111,7 @@ type genericAccessReviewRequest func(context.Context) (*authorizationv1.SubjectA
|
||||||
// the access would be allowed.
|
// the access would be allowed.
|
||||||
func WaitForRBACReady(ctx context.Context, kubeconfigPath string, timeout time.Duration, ra authorizationv1.ResourceAttributes, user string, groups ...string) error {
|
func WaitForRBACReady(ctx context.Context, kubeconfigPath string, timeout time.Duration, ra authorizationv1.ResourceAttributes, user string, groups ...string) error {
|
||||||
var lastErr error
|
var lastErr error
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
|
restConfig, err := GetRESTConfig(kubeconfigPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,15 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/k3s-io/k3s/pkg/datadir"
|
"github.com/k3s-io/k3s/pkg/datadir"
|
||||||
"github.com/k3s-io/k3s/pkg/version"
|
"github.com/k3s-io/k3s/pkg/version"
|
||||||
|
"github.com/rancher/wrangler/pkg/ratelimit"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/validation"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/validation"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
|
"k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -28,7 +31,7 @@ func GetKubeConfigPath(file string) string {
|
||||||
|
|
||||||
// GetClientSet creates a Kubernetes client from the kubeconfig at the provided path.
|
// GetClientSet creates a Kubernetes client from the kubeconfig at the provided path.
|
||||||
func GetClientSet(file string) (clientset.Interface, error) {
|
func GetClientSet(file string) (clientset.Interface, error) {
|
||||||
restConfig, err := clientcmd.BuildConfigFromFlags("", file)
|
restConfig, err := GetRESTConfig(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -36,6 +39,18 @@ func GetClientSet(file string) (clientset.Interface, error) {
|
||||||
return clientset.NewForConfig(restConfig)
|
return clientset.NewForConfig(restConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRESTConfig returns a REST config with default timeouts and ratelimitsi cribbed from wrangler defaults.
|
||||||
|
// ref: https://github.com/rancher/wrangler/blob/v3.0.0/pkg/clients/clients.go#L184-L190
|
||||||
|
func GetRESTConfig(file string) (*rest.Config, error) {
|
||||||
|
restConfig, err := clientcmd.BuildConfigFromFlags("", file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
restConfig.Timeout = 15 * time.Minute
|
||||||
|
restConfig.RateLimiter = ratelimit.None
|
||||||
|
return restConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetUserAgent builds a complete UserAgent string for a given controller, including the node name if possible.
|
// GetUserAgent builds a complete UserAgent string for a given controller, including the node name if possible.
|
||||||
func GetUserAgent(controllerName string) string {
|
func GetUserAgent(controllerName string) string {
|
||||||
nodeName := os.Getenv("NODE_NAME")
|
nodeName := os.Getenv("NODE_NAME")
|
||||||
|
|
Loading…
Reference in New Issue