mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-02-23 00:10:06 -05:00
[node operator] nodeimage controller: remove control-plane nodes from etcd cluster before deleting k8s node object
Signed-off-by: Malte Poll <mp@edgeless.systems>
This commit is contained in:
parent
242020e304
commit
0618a000a7
@ -28,7 +28,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// nodeOverprovisionLimit is the maximum number of extra nodes created during the update procedure at any point in time.
|
// nodeOverprovisionLimit is the maximum number of extra nodes created during the update procedure at any point in time.
|
||||||
nodeOverprovisionLimit = 2
|
nodeOverprovisionLimit = 4
|
||||||
// nodeJoinTimeout is the time limit pending nodes have to join the cluster before being terminated.
|
// nodeJoinTimeout is the time limit pending nodes have to join the cluster before being terminated.
|
||||||
nodeJoinTimeout = time.Minute * 15
|
nodeJoinTimeout = time.Minute * 15
|
||||||
// nodeLeaveTimeout is the time limit pending nodes have to leave the cluster and being terminated.
|
// nodeLeaveTimeout is the time limit pending nodes have to leave the cluster and being terminated.
|
||||||
@ -47,14 +47,16 @@ const (
|
|||||||
// NodeImageReconciler reconciles a NodeImage object
|
// NodeImageReconciler reconciles a NodeImage object
|
||||||
type NodeImageReconciler struct {
|
type NodeImageReconciler struct {
|
||||||
nodeReplacer
|
nodeReplacer
|
||||||
|
etcdRemover
|
||||||
client.Client
|
client.Client
|
||||||
Scheme *runtime.Scheme
|
Scheme *runtime.Scheme
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNodeImageReconciler creates a new NodeImageReconciler.
|
// NewNodeImageReconciler creates a new NodeImageReconciler.
|
||||||
func NewNodeImageReconciler(nodeReplacer nodeReplacer, client client.Client, scheme *runtime.Scheme) *NodeImageReconciler {
|
func NewNodeImageReconciler(nodeReplacer nodeReplacer, etcdRemover etcdRemover, client client.Client, scheme *runtime.Scheme) *NodeImageReconciler {
|
||||||
return &NodeImageReconciler{
|
return &NodeImageReconciler{
|
||||||
nodeReplacer: nodeReplacer,
|
nodeReplacer: nodeReplacer,
|
||||||
|
etcdRemover: etcdRemover,
|
||||||
Client: client,
|
Client: client,
|
||||||
Scheme: scheme,
|
Scheme: scheme,
|
||||||
}
|
}
|
||||||
@ -441,6 +443,17 @@ func (r *NodeImageReconciler) deleteNode(ctx context.Context, controller metav1.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// node is unused & ready to be replaced
|
// node is unused & ready to be replaced
|
||||||
|
if nodeutil.IsControlPlaneNode(&node) {
|
||||||
|
nodeVPCIP, err := nodeutil.VPCIP(&node)
|
||||||
|
if err != nil {
|
||||||
|
logr.Error(err, "Unable to get node VPC IP")
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := r.RemoveEtcdMemberFromCluster(ctx, nodeVPCIP); err != nil {
|
||||||
|
logr.Error(err, "Unable to remove etcd member from cluster")
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
}
|
||||||
if err := r.Delete(ctx, &node); err != nil {
|
if err := r.Delete(ctx, &node); err != nil {
|
||||||
logr.Error(err, "Deleting node")
|
logr.Error(err, "Deleting node")
|
||||||
return false, err
|
return false, err
|
||||||
@ -778,3 +791,8 @@ type nodeReplacer interface {
|
|||||||
// DeleteNode starts the termination of the node at the CSP.
|
// DeleteNode starts the termination of the node at the CSP.
|
||||||
DeleteNode(ctx context.Context, providerID string) error
|
DeleteNode(ctx context.Context, providerID string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type etcdRemover interface {
|
||||||
|
// RemoveEtcdMemberFromCluster removes an etcd member from the cluster.
|
||||||
|
RemoveEtcdMemberFromCluster(ctx context.Context, vpcIP string) error
|
||||||
|
}
|
||||||
|
@ -15,11 +15,13 @@ import (
|
|||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/healthz"
|
"sigs.k8s.io/controller-runtime/pkg/healthz"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
||||||
|
|
||||||
updatev1alpha1 "github.com/edgelesssys/constellation/operators/constellation-node-operator/api/v1alpha1"
|
updatev1alpha1 "github.com/edgelesssys/constellation/operators/constellation-node-operator/api/v1alpha1"
|
||||||
"github.com/edgelesssys/constellation/operators/constellation-node-operator/controllers"
|
"github.com/edgelesssys/constellation/operators/constellation-node-operator/controllers"
|
||||||
|
"github.com/edgelesssys/constellation/operators/constellation-node-operator/internal/etcd"
|
||||||
nodemaintenancev1beta1 "github.com/medik8s/node-maintenance-operator/api/v1beta1"
|
nodemaintenancev1beta1 "github.com/medik8s/node-maintenance-operator/api/v1beta1"
|
||||||
//+kubebuilder:scaffold:imports
|
//+kubebuilder:scaffold:imports
|
||||||
)
|
)
|
||||||
@ -79,8 +81,20 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
k8sClient, err := client.New(ctrl.GetConfigOrDie(), client.Options{Scheme: scheme})
|
||||||
|
if err != nil {
|
||||||
|
setupLog.Error(err, "Unable to create k8s client")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
etcdClient, err := etcd.New(k8sClient)
|
||||||
|
if err != nil {
|
||||||
|
setupLog.Error(err, "Unable to create etcd client")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer etcdClient.Close()
|
||||||
|
|
||||||
if err = controllers.NewNodeImageReconciler(
|
if err = controllers.NewNodeImageReconciler(
|
||||||
cspClient, mgr.GetClient(), mgr.GetScheme(),
|
cspClient, etcdClient, mgr.GetClient(), mgr.GetScheme(),
|
||||||
).SetupWithManager(mgr); err != nil {
|
).SetupWithManager(mgr); err != nil {
|
||||||
setupLog.Error(err, "Unable to create controller", "controller", "NodeImage")
|
setupLog.Error(err, "Unable to create controller", "controller", "NodeImage")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user