Skip to content

Commit ae44073

Browse files
lingxiankongk8s-ci-robot
authored andcommitted
magnum-auto-healer: Remove Node object after Heat stack update (kubernetes#701)
1 parent d65470f commit ae44073

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

pkg/autohealing/cloudprovider/cloudprovider.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package cloudprovider
1818

1919
import (
20+
"k8s.io/client-go/kubernetes"
2021
log "k8s.io/klog"
2122

2223
"k8s.io/cloud-provider-openstack/pkg/autohealing/config"
@@ -43,7 +44,7 @@ type CloudProvider interface {
4344
Enabled() bool
4445
}
4546

46-
type RegisterFunc func(config config.Config) (CloudProvider, error)
47+
type RegisterFunc func(config config.Config, client kubernetes.Interface) (CloudProvider, error)
4748

4849
// RegisterCloudProvider registers a cloudprovider.Factory by name. This
4950
// is expected to happen during app startup.
@@ -57,10 +58,10 @@ func RegisterCloudProvider(name string, register RegisterFunc) {
5758
}
5859

5960
// GetCloudProvider creates an instance of the named cloud provider
60-
func GetCloudProvider(name string, config config.Config) (CloudProvider, error) {
61+
func GetCloudProvider(name string, config config.Config, client kubernetes.Interface) (CloudProvider, error) {
6162
f, found := providers[name]
6263
if !found {
6364
return nil, nil
6465
}
65-
return f(config)
66+
return f(config, client)
6667
}

pkg/autohealing/cloudprovider/openstack/provider.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ import (
2929
"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stackresources"
3030
"github.com/gophercloud/gophercloud/openstack/orchestration/v1/stacks"
3131
uuid "github.com/pborman/uuid"
32+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3233
"k8s.io/apimachinery/pkg/util/sets"
3334
"k8s.io/apimachinery/pkg/util/wait"
35+
"k8s.io/client-go/kubernetes"
3436
log "k8s.io/klog"
3537

3638
"k8s.io/cloud-provider-openstack/pkg/autohealing/config"
@@ -55,6 +57,7 @@ var statusesPreventingRepair = sets.NewString(
5557

5658
// OpenStack is an implementation of cloud provider Interface for OpenStack.
5759
type OpenStackCloudProvider struct {
60+
KubeClient kubernetes.Interface
5861
Nova *gophercloud.ServiceClient
5962
Heat *gophercloud.ServiceClient
6063
Magnum *gophercloud.ServiceClient
@@ -209,6 +212,13 @@ func (provider OpenStackCloudProvider) Repair(nodes []healthcheck.NodeInfo) erro
209212

210213
log.Infof("Started Heat stack update to rebuild resources, cluster: %s, stack: %s", clusterName, cluster.StackID)
211214

215+
// Remove the broken nodes from the cluster
216+
for _, n := range nodes {
217+
if err := provider.KubeClient.CoreV1().Nodes().Delete(n.KubeNode.Name, &metav1.DeleteOptions{}); err != nil {
218+
log.Errorf("Failed to remove the node %s from cluster, error: %v", n.KubeNode.Name, err)
219+
}
220+
}
221+
212222
return nil
213223
}
214224

pkg/autohealing/cloudprovider/register/register.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ import (
2626
gopenstack "github.com/gophercloud/gophercloud/openstack"
2727
"github.com/gophercloud/gophercloud/openstack/identity/v3/extensions/trusts"
2828
netutil "k8s.io/apimachinery/pkg/util/net"
29+
"k8s.io/client-go/kubernetes"
2930
certutil "k8s.io/client-go/util/cert"
3031

3132
"k8s.io/cloud-provider-openstack/pkg/autohealing/cloudprovider"
3233
"k8s.io/cloud-provider-openstack/pkg/autohealing/cloudprovider/openstack"
3334
"k8s.io/cloud-provider-openstack/pkg/autohealing/config"
3435
)
3536

36-
func registerOpenStack(cfg config.Config) (cloudprovider.CloudProvider, error) {
37+
func registerOpenStack(cfg config.Config, kubeClient kubernetes.Interface) (cloudprovider.CloudProvider, error) {
3738
client, err := gopenstack.NewClient(cfg.OpenStack.AuthURL)
3839
if err != nil {
3940
return nil, err
@@ -93,10 +94,11 @@ func registerOpenStack(cfg config.Config) (cloudprovider.CloudProvider, error) {
9394

9495
var p cloudprovider.CloudProvider
9596
p = openstack.OpenStackCloudProvider{
96-
Nova: novaClient,
97-
Heat: heatClient,
98-
Magnum: magnumClient,
99-
Config: cfg,
97+
KubeClient: kubeClient,
98+
Nova: novaClient,
99+
Heat: heatClient,
100+
Magnum: magnumClient,
101+
Config: cfg,
100102
}
101103

102104
return p, nil

pkg/autohealing/controller/controller.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,20 @@ func createKubeClients(apiserverHost string, kubeConfig string) (*kubernetes.Cli
104104

105105
// NewController creates a new autohealer controller.
106106
func NewController(conf config.Config) *Controller {
107+
// initialize k8s clients
108+
kubeClient, leaderElectionClient, err := createKubeClients(conf.Kubernetes.ApiserverHost, conf.Kubernetes.KubeConfig)
109+
if err != nil {
110+
log.Fatalf("failed to initialize kubernetes client, error: %v", err)
111+
}
112+
107113
// initialize cloud provider
108-
provider, err := cloudprovider.GetCloudProvider(conf.CloudProvider, conf)
114+
provider, err := cloudprovider.GetCloudProvider(conf.CloudProvider, conf, kubeClient)
109115
if err != nil {
110116
log.Fatalf("Failed to get the cloud provider %s: %v", conf.CloudProvider, err)
111117
}
112118

113119
log.Infof("Using cloud provider: %s", provider.GetName())
114120

115-
// initialize k8s clients
116-
kubeClient, leaderElectionClient, err := createKubeClients(conf.Kubernetes.ApiserverHost, conf.Kubernetes.KubeConfig)
117-
if err != nil {
118-
log.Fatalf("failed to initialize kubernetes client, error: %v", err)
119-
}
120-
121121
// event
122122
eventBroadcaster := record.NewBroadcaster()
123123
eventBroadcaster.StartLogging(log.V(4).Infof)
@@ -316,12 +316,6 @@ func (c *Controller) repairNodes(unhealthyNodes []healthcheck.NodeInfo) {
316316
} else {
317317
log.Infof("Node %s is cordoned", nodeName)
318318
}
319-
320-
// Remove the broken node from the cluster
321-
if err := c.kubeClient.CoreV1().Nodes().Delete(nodeName, &metav1.DeleteOptions{}); err != nil {
322-
log.Errorf("Failed to remove the node %s from cluster, error: %v", unhealthyNodeNames.List(), err)
323-
}
324-
// TODO: Deal with the situation that the autohealer is running on a failed node
325319
}
326320

327321
// Start to repair all the unhealthy nodes.

0 commit comments

Comments
 (0)