Add option to bootstrap kubeconfig for hollow-node

This commit is contained in:
Marcel Zięba 2022-01-13 14:59:57 +00:00
parent f49a15ae50
commit 27336259ba

View File

@ -17,6 +17,7 @@ limitations under the License.
package main package main
import ( import (
"context"
"errors" "errors"
goflag "flag" goflag "flag"
"fmt" "fmt"
@ -30,6 +31,7 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
@ -45,6 +47,7 @@ import (
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/cluster/ports" "k8s.io/kubernetes/pkg/cluster/ports"
cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing" cadvisortest "k8s.io/kubernetes/pkg/kubelet/cadvisor/testing"
"k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap"
"k8s.io/kubernetes/pkg/kubelet/cm" "k8s.io/kubernetes/pkg/kubelet/cm"
"k8s.io/kubernetes/pkg/kubelet/cri/remote" "k8s.io/kubernetes/pkg/kubelet/cri/remote"
fakeremote "k8s.io/kubernetes/pkg/kubelet/cri/remote/fake" fakeremote "k8s.io/kubernetes/pkg/kubelet/cri/remote/fake"
@ -55,21 +58,23 @@ import (
) )
type hollowNodeConfig struct { type hollowNodeConfig struct {
KubeconfigPath string KubeconfigPath string
KubeletPort int BootstrapKubeconfigPath string
KubeletReadOnlyPort int CertDirectory string
Morph string KubeletPort int
NodeName string KubeletReadOnlyPort int
ServerPort int Morph string
ContentType string NodeName string
UseRealProxier bool ServerPort int
ProxierSyncPeriod time.Duration ContentType string
ProxierMinSyncPeriod time.Duration UseRealProxier bool
NodeLabels map[string]string ProxierSyncPeriod time.Duration
RegisterWithTaints []v1.Taint ProxierMinSyncPeriod time.Duration
MaxPods int NodeLabels map[string]string
ExtendedResources map[string]string RegisterWithTaints []v1.Taint
UseHostImageService bool MaxPods int
ExtendedResources map[string]string
UseHostImageService bool
} }
const ( const (
@ -83,6 +88,8 @@ var knownMorphs = sets.NewString("kubelet", "proxy")
func (c *hollowNodeConfig) addFlags(fs *pflag.FlagSet) { func (c *hollowNodeConfig) addFlags(fs *pflag.FlagSet) {
fs.StringVar(&c.KubeconfigPath, "kubeconfig", "/kubeconfig/kubeconfig", "Path to kubeconfig file.") fs.StringVar(&c.KubeconfigPath, "kubeconfig", "/kubeconfig/kubeconfig", "Path to kubeconfig file.")
fs.StringVar(&c.BootstrapKubeconfigPath, "bootstrap-kubeconfig", "", "Path to bootstrap kubeconfig file.")
fs.StringVar(&c.CertDirectory, "cert-dir", "/etc/srv/", "Path to cert directory for bootstraping.")
fs.IntVar(&c.KubeletPort, "kubelet-port", ports.KubeletPort, "Port on which HollowKubelet should be listening.") fs.IntVar(&c.KubeletPort, "kubelet-port", ports.KubeletPort, "Port on which HollowKubelet should be listening.")
fs.IntVar(&c.KubeletReadOnlyPort, "kubelet-read-only-port", ports.KubeletReadOnlyPort, "Read-only port on which Kubelet is listening.") fs.IntVar(&c.KubeletReadOnlyPort, "kubelet-read-only-port", ports.KubeletReadOnlyPort, "Read-only port on which Kubelet is listening.")
fs.StringVar(&c.NodeName, "name", "fake-node", "Name of this Hollow Node.") fs.StringVar(&c.NodeName, "name", "fake-node", "Name of this Hollow Node.")
@ -116,6 +123,13 @@ func (c *hollowNodeConfig) createClientConfigFromFile() (*restclient.Config, err
return config, nil return config, nil
} }
func (c *hollowNodeConfig) bootstrapClientConfig() error {
if c.BootstrapKubeconfigPath != "" {
return bootstrap.LoadClientCert(context.TODO(), c.KubeconfigPath, c.BootstrapKubeconfigPath, c.CertDirectory, types.NodeName(c.NodeName))
}
return nil
}
func (c *hollowNodeConfig) createHollowKubeletOptions() *kubemark.HollowKubletOptions { func (c *hollowNodeConfig) createHollowKubeletOptions() *kubemark.HollowKubletOptions {
return &kubemark.HollowKubletOptions{ return &kubemark.HollowKubletOptions{
NodeName: c.NodeName, NodeName: c.NodeName,
@ -175,6 +189,10 @@ func run(cmd *cobra.Command, config *hollowNodeConfig) error {
} }
// create a client to communicate with API server. // create a client to communicate with API server.
err := config.bootstrapClientConfig()
if err != nil {
return fmt.Errorf("Failed to bootstrap, error: %w. Exiting", err)
}
clientConfig, err := config.createClientConfigFromFile() clientConfig, err := config.createClientConfigFromFile()
if err != nil { if err != nil {
return fmt.Errorf("Failed to create a ClientConfig, error: %w. Exiting", err) return fmt.Errorf("Failed to create a ClientConfig, error: %w. Exiting", err)