1
0
mirror of https://github.com/ubuntu/microk8s.git synced 2021-05-23 02:23:41 +03:00

Prepare for v1.21 (#2156)

This commit is contained in:
Konstantinos Tsakalozos
2021-04-09 07:44:22 +03:00
committed by GitHub
parent af19a2e0a7
commit 3d0cd4d4e9
5 changed files with 259167 additions and 260874 deletions

View File

@@ -1,6 +1,6 @@
# MicroK8s
![](https://img.shields.io/badge/Kubernetes-1.20-326de6.svg)
![](https://img.shields.io/badge/Kubernetes-1.21-326de6.svg)
<img src="/docs/images/certified_kubernetes_color-222x300.png" align="right" width="200px">

View File

@@ -1,27 +1,28 @@
From 7136e0646e50d26d40db49ae0f6606775d11a56a Mon Sep 17 00:00:00 2001
From: Konstantinos <kos.tsakalozos@canonical.com>
Date: Thu, 24 Sep 2020 21:06:03 +0300
Subject: [PATCH 1/2] kubelite, single binary k8s
From de618434d4a4168f11bec34c062700b3ad17d2ca Mon Sep 17 00:00:00 2001
From: Konstantinos Tsakalozos <kos.tsakalozos@canonical.com>
Date: Wed, 3 Mar 2021 18:19:37 +0200
Subject: [PATCH] Kubelite integration
---
cmd/kube-apiserver/app/server.go | 9 ++--
cmd/kubelet/app/server.go | 14 +++--
cmd/kubelet/app/server.go | 11 ++--
cmd/kubelite/app/daemons/daemon.go | 84 +++++++++++++++++++++++++++++
cmd/kubelite/app/options/options.go | 78 +++++++++++++++++++++++++++
cmd/kubelite/app/server.go | 75 ++++++++++++++++++++++++++
cmd/kubelite/app/options/options.go | 79 +++++++++++++++++++++++++++
cmd/kubelite/app/server.go | 79 +++++++++++++++++++++++++++
cmd/kubelite/kubelite.go | 28 ++++++++++
6 files changed, 280 insertions(+), 8 deletions(-)
pkg/volume/csi/csi_plugin.go | 10 ++--
7 files changed, 291 insertions(+), 9 deletions(-)
create mode 100644 cmd/kubelite/app/daemons/daemon.go
create mode 100644 cmd/kubelite/app/options/options.go
create mode 100644 cmd/kubelite/app/server.go
create mode 100644 cmd/kubelite/kubelite.go
diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go
index 100007bd0ad..1b1f0985e63 100644
index 9fb54ec9a64..ade92c7337b 100644
--- a/cmd/kube-apiserver/app/server.go
+++ b/cmd/kube-apiserver/app/server.go
@@ -91,7 +91,7 @@ const (
)
@@ -106,7 +106,7 @@ func checkNonZeroInsecurePort(fs *pflag.FlagSet) error {
}
// NewAPIServerCommand creates a *cobra.Command object with default parameters
-func NewAPIServerCommand() *cobra.Command {
@@ -29,7 +30,7 @@ index 100007bd0ad..1b1f0985e63 100644
s := options.NewServerRunOptions()
cmd := &cobra.Command{
Use: "kube-apiserver",
@@ -122,8 +122,11 @@ cluster's shared state through which all other components interact.`,
@@ -142,8 +142,11 @@ cluster's shared state through which all other components interact.`,
if errs := completedOptions.Validate(); len(errs) != 0 {
return utilerrors.NewAggregate(errs)
}
@@ -44,25 +45,9 @@ index 100007bd0ad..1b1f0985e63 100644
Args: func(cmd *cobra.Command, args []string) error {
for _, arg := range args {
diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go
index ff7e05feec1..569ada4ef04 100644
index 2dc10a512b3..40d01f347ce 100644
--- a/cmd/kubelet/app/server.go
+++ b/cmd/kubelet/app/server.go
@@ -22,6 +22,7 @@ import (
"crypto/tls"
"errors"
"fmt"
+ genericapiserver "k8s.io/apiserver/pkg/server"
"math"
"net"
"net/http"
@@ -46,7 +47,6 @@ import (
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/wait"
- genericapiserver "k8s.io/apiserver/pkg/server"
"k8s.io/apiserver/pkg/server/healthz"
utilfeature "k8s.io/apiserver/pkg/util/feature"
clientset "k8s.io/client-go/kubernetes"
@@ -110,7 +110,7 @@ const (
)
@@ -72,11 +57,10 @@ index ff7e05feec1..569ada4ef04 100644
cleanFlagSet := pflag.NewFlagSet(componentKubelet, pflag.ContinueOnError)
cleanFlagSet.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)
kubeletFlags := options.NewKubeletFlags()
@@ -260,12 +260,16 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API
// add the kubelet config controller to kubeletDeps
kubeletDeps.KubeletConfigController = kubeletConfigController
- // set up signal context here in order to be reused by kubelet and docker shim
@@ -277,7 +277,12 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API
klog.ErrorS(err, "kubelet running with insufficient permissions")
}
// set up signal context here in order to be reused by kubelet and docker shim
- ctx := genericapiserver.SetupSignalContext()
+ runctx := context.Background()
+ if len(ctx) == 0 {
@@ -85,13 +69,17 @@ index ff7e05feec1..569ada4ef04 100644
+ runctx = ctx[0]
+ }
// make the kubelet's config safe for logging
config := kubeletServer.KubeletConfiguration.DeepCopy()
@@ -288,7 +293,7 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API
klog.V(5).InfoS("KubeletConfiguration", "configuration", kubeletServer.KubeletConfiguration)
// run the kubelet
klog.V(5).Infof("KubeletConfiguration: %#v", kubeletServer.KubeletConfiguration)
- if err := Run(ctx, kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate); err != nil {
+ if err := Run(runctx, kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate); err != nil {
klog.Fatal(err)
klog.ErrorS(err, "Failed to run kubelet")
os.Exit(1)
}
},
diff --git a/cmd/kubelite/app/daemons/daemon.go b/cmd/kubelite/app/daemons/daemon.go
new file mode 100644
index 00000000000..dbef03cf07e
@@ -185,10 +173,10 @@ index 00000000000..dbef03cf07e
\ No newline at end of file
diff --git a/cmd/kubelite/app/options/options.go b/cmd/kubelite/app/options/options.go
new file mode 100644
index 00000000000..ca5e7b3d207
index 00000000000..80f1d8b09fc
--- /dev/null
+++ b/cmd/kubelite/app/options/options.go
@@ -0,0 +1,78 @@
@@ -0,0 +1,79 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
@@ -221,8 +209,8 @@ index 00000000000..ca5e7b3d207
+ ProxyArgsFile string
+ KubeletArgsFile string
+ APIServerArgsFile string
+
+ KubeconfigFile string
+ KubeconfigFile string
+ StartControlPlane bool
+}
+
+func NewOptions() (*Options){
@@ -233,6 +221,7 @@ index 00000000000..ca5e7b3d207
+ "/var/snap/microk8s/current/args/kubelet",
+ "/var/snap/microk8s/current/args/kube-apiserver",
+ "/var/snap/microk8s/current/credentials/client.config",
+ true,
+ }
+ return &o
+}
@@ -269,10 +258,10 @@ index 00000000000..ca5e7b3d207
+}
diff --git a/cmd/kubelite/app/server.go b/cmd/kubelite/app/server.go
new file mode 100644
index 00000000000..e70f19194a4
index 00000000000..e7452a09e3e
--- /dev/null
+++ b/cmd/kubelite/app/server.go
@@ -0,0 +1,75 @@
@@ -0,0 +1,79 @@
+/*
+Copyright © 2020 NAME HERE <EMAIL ADDRESS>
+
@@ -311,19 +300,22 @@ index 00000000000..e70f19194a4
+ // has an action associated with it:
+ Run: func(cmd *cobra.Command, args []string) {
+ ctx := genericapiserver.SetupSignalContext()
+ apiserverArgs := options.ReadArgsFromFile(opts.APIServerArgsFile)
+ go daemon.StartAPIServer(apiserverArgs, ctx.Done())
+ daemon.WaitForAPIServer(opts.KubeconfigFile, 360 * time.Second)
+
+ controllerArgs := options.ReadArgsFromFile(opts.ControllerManagerArgsFile)
+ go daemon.StartControllerManager(controllerArgs, ctx)
+ if opts.StartControlPlane {
+ apiserverArgs := options.ReadArgsFromFile(opts.APIServerArgsFile)
+ go daemon.StartAPIServer(apiserverArgs, ctx.Done())
+ daemon.WaitForAPIServer(opts.KubeconfigFile, 360 * time.Second)
+
+ controllerArgs := options.ReadArgsFromFile(opts.ControllerManagerArgsFile)
+ go daemon.StartControllerManager(controllerArgs, ctx)
+
+ schedulerArgs := options.ReadArgsFromFile(opts.SchedulerArgsFile)
+ go daemon.StartScheduler(schedulerArgs, ctx)
+ }
+
+ proxyArgs := options.ReadArgsFromFile(opts.ProxyArgsFile)
+ go daemon.StartProxy(proxyArgs)
+
+ schedulerArgs := options.ReadArgsFromFile(opts.SchedulerArgsFile)
+ go daemon.StartScheduler(schedulerArgs, ctx)
+
+ kubeletArgs := options.ReadArgsFromFile(opts.KubeletArgsFile)
+ daemon.StartKubelet(kubeletArgs, ctx)
+ },
@@ -347,6 +339,7 @@ index 00000000000..e70f19194a4
+ liteCmd.Flags().StringVar(&opts.KubeletArgsFile, "kubelet-args-file", opts.KubeletArgsFile, "file with the arguments for kubelet")
+ liteCmd.Flags().StringVar(&opts.APIServerArgsFile, "apiserver-args-file", opts.APIServerArgsFile, "file with the arguments for the API server")
+ liteCmd.Flags().StringVar(&opts.KubeconfigFile , "kubeconfig-file", opts.KubeconfigFile, "the kubeconfig file to use to healthcheck the API server")
+ liteCmd.Flags().BoolVar(&opts.StartControlPlane, "start-control-plane", opts.StartControlPlane, "start the control plane (API server, scheduler and controller manager)")
+}
diff --git a/cmd/kubelite/kubelite.go b/cmd/kubelite/kubelite.go
new file mode 100644
@@ -382,84 +375,38 @@ index 00000000000..667b24f68e6
+ app.Execute()
+ println("Stopping kubelite")
+}
--
2.25.1
From 7d9c9921a6c646cb254c3eb312babb56784af952 Mon Sep 17 00:00:00 2001
From: Konstantinos Tsakalozos <kos.tsakalozos@canonical.com>
Date: Wed, 17 Feb 2021 11:00:26 +0200
Subject: [PATCH 2/2] Option to not start the control plane on kubelite
---
cmd/kubelite/app/options/options.go | 5 +++--
cmd/kubelite/app/server.go | 20 ++++++++++++--------
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/cmd/kubelite/app/options/options.go b/cmd/kubelite/app/options/options.go
index ca5e7b3d207..80f1d8b09fc 100644
--- a/cmd/kubelite/app/options/options.go
+++ b/cmd/kubelite/app/options/options.go
@@ -30,8 +30,8 @@ type Options struct {
ProxyArgsFile string
KubeletArgsFile string
APIServerArgsFile string
-
- KubeconfigFile string
+ KubeconfigFile string
+ StartControlPlane bool
}
func NewOptions() (*Options){
@@ -42,6 +42,7 @@ func NewOptions() (*Options){
"/var/snap/microk8s/current/args/kubelet",
"/var/snap/microk8s/current/args/kube-apiserver",
"/var/snap/microk8s/current/credentials/client.config",
+ true,
diff --git a/pkg/volume/csi/csi_plugin.go b/pkg/volume/csi/csi_plugin.go
index 85c1c1f3db1..b90c82225f5 100644
--- a/pkg/volume/csi/csi_plugin.go
+++ b/pkg/volume/csi/csi_plugin.go
@@ -237,20 +237,24 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error {
}
return &o
}
diff --git a/cmd/kubelite/app/server.go b/cmd/kubelite/app/server.go
index e70f19194a4..e7452a09e3e 100644
--- a/cmd/kubelite/app/server.go
+++ b/cmd/kubelite/app/server.go
@@ -36,19 +36,22 @@ var liteCmd = &cobra.Command{
// has an action associated with it:
Run: func(cmd *cobra.Command, args []string) {
ctx := genericapiserver.SetupSignalContext()
- apiserverArgs := options.ReadArgsFromFile(opts.APIServerArgsFile)
- go daemon.StartAPIServer(apiserverArgs, ctx.Done())
- daemon.WaitForAPIServer(opts.KubeconfigFile, 360 * time.Second)
- controllerArgs := options.ReadArgsFromFile(opts.ControllerManagerArgsFile)
- go daemon.StartControllerManager(controllerArgs, ctx)
+ if opts.StartControlPlane {
+ apiserverArgs := options.ReadArgsFromFile(opts.APIServerArgsFile)
+ go daemon.StartAPIServer(apiserverArgs, ctx.Done())
+ daemon.WaitForAPIServer(opts.KubeconfigFile, 360 * time.Second)
// Initializing the label management channels
- nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
+ localNim := nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
// This function prevents Kubelet from posting Ready status until CSINode
// is both installed and initialized
- if err := initializeCSINode(host); err != nil {
+ if err := initializeCSINode(host, localNim); err != nil {
return errors.New(log("failed to initialize CSINode: %v", err))
}
}
+ if _, ok := host.(volume.KubeletVolumeHost); ok {
+ nim = localNim
+ }
+
+ controllerArgs := options.ReadArgsFromFile(opts.ControllerManagerArgsFile)
+ go daemon.StartControllerManager(controllerArgs, ctx)
+
+ schedulerArgs := options.ReadArgsFromFile(opts.SchedulerArgsFile)
+ go daemon.StartScheduler(schedulerArgs, ctx)
+ }
proxyArgs := options.ReadArgsFromFile(opts.ProxyArgsFile)
go daemon.StartProxy(proxyArgs)
- schedulerArgs := options.ReadArgsFromFile(opts.SchedulerArgsFile)
- go daemon.StartScheduler(schedulerArgs, ctx)
-
kubeletArgs := options.ReadArgsFromFile(opts.KubeletArgsFile)
daemon.StartKubelet(kubeletArgs, ctx)
},
@@ -72,4 +75,5 @@ func init() {
liteCmd.Flags().StringVar(&opts.KubeletArgsFile, "kubelet-args-file", opts.KubeletArgsFile, "file with the arguments for kubelet")
liteCmd.Flags().StringVar(&opts.APIServerArgsFile, "apiserver-args-file", opts.APIServerArgsFile, "file with the arguments for the API server")
liteCmd.Flags().StringVar(&opts.KubeconfigFile , "kubeconfig-file", opts.KubeconfigFile, "the kubeconfig file to use to healthcheck the API server")
+ liteCmd.Flags().BoolVar(&opts.StartControlPlane, "start-control-plane", opts.StartControlPlane, "start the control plane (API server, scheduler and controller manager)")
return nil
}
-func initializeCSINode(host volume.VolumeHost) error {
+func initializeCSINode(host volume.VolumeHost, nim nodeinfomanager.Interface) error {
kvh, ok := host.(volume.KubeletVolumeHost)
if !ok {
klog.V(4).Info("Cast from VolumeHost to KubeletVolumeHost failed. Skipping CSINode initialization, not running on kubelet")
--
2.25.1

View File

@@ -1,4 +1,4 @@
From 476871f1ba435f8baa898624d2f889ca04bd6b92 Mon Sep 17 00:00:00 2001
From 181019ffd07c6b398595eeb755bc0615b13890b9 Mon Sep 17 00:00:00 2001
From: Konstantinos Tsakalozos <kos.tsakalozos@canonical.com>
Date: Wed, 17 Feb 2021 18:50:40 +0200
Subject: [PATCH] Handle disconnected leader in three node cluster

View File

@@ -1,51 +0,0 @@
From 06848ba08ce2737e9d25ba26d799aba608815b7b Mon Sep 17 00:00:00 2001
From: Darren Shepherd <darren@rancher.com>
Date: Fri, 30 Aug 2019 11:22:18 -0700
Subject: [PATCH] Fix CSI initialization conflict
CSI is used by both the kubelet and kube-controller-manager. Both
components will initialize the csiPlugin with different VolumeHost
objects. The csiPlugin will then assign a global variable for
the node info manager. It is then possible that the kubelet gets
the credentials of the kube-controller-manager and that will cause
CSI to fail.
---
pkg/volume/csi/csi_plugin.go | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/pkg/volume/csi/csi_plugin.go b/pkg/volume/csi/csi_plugin.go
index 7fb89f688ba..b973176892e 100644
--- a/pkg/volume/csi/csi_plugin.go
+++ b/pkg/volume/csi/csi_plugin.go
@@ -238,21 +238,25 @@ func (p *csiPlugin) Init(host volume.VolumeHost) error {
}
// Initializing the label management channels
- nim = nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
+ localNim := nodeinfomanager.NewNodeInfoManager(host.GetNodeName(), host, migratedPlugins)
if utilfeature.DefaultFeatureGate.Enabled(features.CSINodeInfo) &&
utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
// This function prevents Kubelet from posting Ready status until CSINode
// is both installed and initialized
- if err := initializeCSINode(host); err != nil {
+ if err := initializeCSINode(host, localNim); err != nil {
return errors.New(log("failed to initialize CSINode: %v", err))
}
}
+ if _, ok := host.(volume.KubeletVolumeHost); ok {
+ nim = localNim
+ }
+
return nil
}
-func initializeCSINode(host volume.VolumeHost) error {
+func initializeCSINode(host volume.VolumeHost, nim nodeinfomanager.Interface) error {
kvh, ok := host.(volume.KubeletVolumeHost)
if !ok {
klog.V(4).Info("Cast from VolumeHost to KubeletVolumeHost failed. Skipping CSINode initialization, not running on kubelet")
--
2.25.1