diff --git a/cmd/controller.go b/cmd/controller.go index 6c43635beb31..e49829a7b461 100644 --- a/cmd/controller.go +++ b/cmd/controller.go @@ -182,10 +182,11 @@ func startController(token string) error { adminClientFactory := kubernetes.NewAdminClientFactory(k0sVars) componentManager.Add(&controller.APIServer{ - ClusterConfig: clusterConfig, - K0sVars: k0sVars, - LogLevel: logging["kube-apiserver"], - Storage: storageBackend, + ClusterConfig: clusterConfig, + K0sVars: k0sVars, + LogLevel: logging["kube-apiserver"], + Storage: storageBackend, + EnableKonnectivity: !singleNode, }) if clusterConfig.Spec.API.ExternalAddress != "" { diff --git a/go.mod b/go.mod index 4cac098d6c70..19dd4b009da4 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/vishvananda/netlink v1.1.0 // indirect github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect github.com/weaveworks/footloose v0.0.0-20200609124411-8f3df89ea188 - go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5 + go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 golang.org/x/sync v0.0.0-20200930132711-30421366ff76 golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752 // indirect @@ -54,11 +54,12 @@ require ( gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect helm.sh/helm/v3 v3.4.0 honnef.co/go/tools v0.0.1-2020.1.6 // indirect - k8s.io/api v0.20.2 - k8s.io/apimachinery v0.20.2 + k8s.io/api v0.20.5 + k8s.io/apimachinery v0.20.5 k8s.io/cli-runtime v0.20.2 - k8s.io/client-go v0.20.2 k8s.io/cri-api v0.20.4 + k8s.io/client-go v0.20.5 + k8s.io/kube-aggregator v0.20.5 k8s.io/kubectl v0.20.2 k8s.io/mount-utils v0.20.4 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 diff --git a/go.sum b/go.sum index 1cc79d7d68a3..97f0b58a2aaa 100644 --- a/go.sum +++ b/go.sum @@ -1243,23 +1243,33 @@ honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzE k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= k8s.io/api v0.20.2 h1:y/HR22XDZY3pniu9hIFDLpUCPq2w5eQ6aV/VFQ7uJMw= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= +k8s.io/api v0.20.5 h1:zsMTffV0Le2EiI0aKvlTHEnXGxk1HiqGRhJcCPiI7JI= +k8s.io/api v0.20.5/go.mod h1:FQjAceXnVaWDeov2YUWhOb6Yt+5UjErkp6UO3nczO1Y= k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA= k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.5 h1:wO/FxMVRn223rAKxnBbwCyuN96bS9MFTIvP0e/V7cps= +k8s.io/apimachinery v0.20.5/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= +k8s.io/apiserver v0.20.5/go.mod h1:AY3lKhcJ2Tm81XvvcBzk2VnKINSoN+qczYsdo2YEvIc= k8s.io/cli-runtime v0.19.2/go.mod h1:CMynmJM4Yf02TlkbhKxoSzi4Zf518PukJ5xep/NaNeY= k8s.io/cli-runtime v0.20.2 h1:W0/FHdbApnl9oB7xdG643c/Zaf7TZT+43I+zKxwqvhU= k8s.io/cli-runtime v0.20.2/go.mod h1:FjH6uIZZZP3XmwrXWeeYCbgxcrD6YXxoAykBaWH0VdM= k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= k8s.io/client-go v0.20.2 h1:uuf+iIAbfnCSw8IGAv/Rg0giM+2bOzHLOsbbrwrdhNQ= k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= +k8s.io/client-go v0.20.5 h1:dJGtYUvFrFGjQ+GjXEIby0gZWdlAOc0xJBJqY3VyDxA= +k8s.io/client-go v0.20.5/go.mod h1:Ee5OOMMYvlH8FCZhDsacjMlCBwetbGZETwo1OA+e6Zw= k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/code-generator v0.20.2/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= +k8s.io/code-generator v0.20.5/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= k8s.io/component-base v0.20.2 h1:LMmu5I0pLtwjpp5009KLuMGFqSc2S2isGw8t1hpYKLE= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= +k8s.io/component-base v0.20.5 h1:8BZQKLJGhWrxtB7kIOEejKDtAKr1HOYvB0PZNeTyLS0= +k8s.io/component-base v0.20.5/go.mod h1:l0isoBLGyQKwRoTWbPHR6jNDd3/VqQD43cNlsjddGng= k8s.io/component-helpers v0.20.2 h1:UM92JwXHAd2fN/LoJtm0zayIEypCYHxNBKaGhNRT7YE= k8s.io/component-helpers v0.20.2/go.mod h1:qeM6iAWGqIr+WE8n2QW2OK9XkpZkPNTxAoEv9jl40/I= k8s.io/cri-api v0.20.4 h1:AwwzhJMfaxiw8NnEJAUQI+FWlX1mAp9tHODTVxnkEQg= @@ -1273,6 +1283,8 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-aggregator v0.20.5 h1:tusb7NBtlZkdkwTFO4gd+em60iI5sH1T/ijL9Li0ObU= +k8s.io/kube-aggregator v0.20.5/go.mod h1:0S88kjWs/0UzOMOko6fjy4nwu1OTRrxlpa7rsx0PErA= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= @@ -1292,6 +1304,7 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 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.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/inttest/basic/basic_test.go b/inttest/basic/basic_test.go index 35d0bde957a6..c329dca6bc7d 100644 --- a/inttest/basic/basic_test.go +++ b/inttest/basic/basic_test.go @@ -26,6 +26,8 @@ import ( capi "k8s.io/api/certificates/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" ) type BasicSuite struct { @@ -69,6 +71,23 @@ func (s *BasicSuite) TestK0sGetsUp() { s.Require().NoError(s.verifyKubeletAddressFlag("worker0")) s.Require().NoError(s.verifyKubeletAddressFlag("worker1")) + + s.Require().NoError(common.WaitForMetricsReady(s.getKubeConfig("controller0"))) +} + +func (s *BasicSuite) getKubeConfig(node string) *restclient.Config { + machine, err := s.MachineForName(node) + s.Require().NoError(err) + ssh, err := s.SSH(node) + s.Require().NoError(err) + kubeConf, err := ssh.ExecWithOutput("cat /var/lib/k0s/custom-data-dir/pki/admin.conf") + s.Require().NoError(err) + cfg, err := clientcmd.RESTConfigFromKubeConfig([]byte(kubeConf)) + s.Require().NoError(err) + hostPort, err := machine.HostPort(6443) + s.Require().NoError(err) + cfg.Host = fmt.Sprintf("localhost:%d", hostPort) + return cfg } func (s *BasicSuite) checkCertPerms(node string) error { diff --git a/inttest/common/util.go b/inttest/common/util.go index 96f72da5e9a1..32251e8033a1 100644 --- a/inttest/common/util.go +++ b/inttest/common/util.go @@ -7,6 +7,8 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset" ) // WaitForCalicoReady waits to see all calico pods healthy @@ -20,3 +22,25 @@ func WaitForCalicoReady(kc *kubernetes.Clientset) error { return ds.Status.NumberReady == ds.Status.DesiredNumberScheduled, nil }) } + +func WaitForMetricsReady(c *rest.Config) error { + apiServiceClientset, err := clientset.NewForConfig(c) + if err != nil { + return err + } + + return wait.PollImmediate(100*time.Millisecond, 5*time.Minute, func() (done bool, err error) { + apiService, err := apiServiceClientset.ApiregistrationV1().APIServices().Get(context.TODO(), "v1beta1.metrics.k8s.io", v1.GetOptions{}) + if err != nil { + return false, nil + } + + for _, c := range apiService.Status.Conditions { + if c.Type == "Available" && c.Status == "True" { + return true, nil + } + } + + return false, nil + }) +}