Skip to content

Commit 9a6c2ba

Browse files
authored
Merge pull request kosmos-io#252 from xyz2277/clustertree_zyx_13
fix:1.root pvc could be lost possibly; 2.leaf pvc spec could not be m…
2 parents 1be1939 + 8a1991c commit 9a6c2ba

File tree

5 files changed

+61
-7
lines changed

5 files changed

+61
-7
lines changed

pkg/clustertree/cluster-manager/cluster_controller.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,15 @@ func (c *ClusterController) setupControllers(mgr manager.Manager, cluster *kosmo
291291
return fmt.Errorf("error starting podUpstreamReconciler %s: %v", podcontrollers.LeafPodControllerName, err)
292292
}
293293

294-
err := c.setupStorageControllers(mgr, nodes, leafClientset, cluster.Name)
294+
err := c.setupStorageControllers(mgr, utils.IsOne2OneMode(cluster), cluster.Name)
295295
if err != nil {
296296
return err
297297
}
298298

299299
return nil
300300
}
301301

302-
func (c *ClusterController) setupStorageControllers(mgr manager.Manager, nodes []*corev1.Node, leafClient kubernetes.Interface, clustername string) error {
302+
func (c *ClusterController) setupStorageControllers(mgr manager.Manager, isOne2OneMode bool, clustername string) error {
303303
leafPVCController := pvc.LeafPVCController{
304304
LeafClient: mgr.GetClient(),
305305
RootClient: c.Root,
@@ -315,6 +315,7 @@ func (c *ClusterController) setupStorageControllers(mgr manager.Manager, nodes [
315315
RootClient: c.Root,
316316
RootClientSet: c.RootClientset,
317317
ClusterName: clustername,
318+
IsOne2OneMode: isOne2OneMode,
318319
}
319320
if err := leafPVController.SetupWithManager(mgr); err != nil {
320321
return fmt.Errorf("error starting leaf pv controller %v", err)

pkg/clustertree/cluster-manager/controllers/pv/leaf_pv_controller.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ type LeafPVController struct {
3333
RootClient client.Client
3434
RootClientSet kubernetes.Interface
3535
ClusterName string
36+
IsOne2OneMode bool
3637
}
3738

3839
func (l *LeafPVController) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
3940
pv := &v1.PersistentVolume{}
40-
err := l.LeafClient.Get(ctx, request.NamespacedName, pv)
4141
pvNeedDelete := false
42+
err := l.LeafClient.Get(ctx, request.NamespacedName, pv)
4243
if err != nil {
4344
if !errors.IsNotFound(err) {
4445
klog.Errorf("get pv from leaf cluster failed, error: %v", err)
@@ -56,7 +57,7 @@ func (l *LeafPVController) Reconcile(ctx context.Context, request reconcile.Requ
5657
return reconcile.Result{RequeueAfter: LeafPVRequeueTime}, nil
5758
}
5859

59-
if pv.DeletionTimestamp != nil {
60+
if pvNeedDelete || pv.DeletionTimestamp != nil {
6061
return reconcile.Result{}, nil
6162
}
6263

@@ -84,7 +85,7 @@ func (l *LeafPVController) Reconcile(ctx context.Context, request reconcile.Requ
8485
}
8586

8687
rootPV = pv.DeepCopy()
87-
filterPV(rootPV, l.ClusterName)
88+
filterPV(rootPV, utils.NodeAffinity4RootPV(pv, l.IsOne2OneMode, l.ClusterName))
8889
nn := types.NamespacedName{
8990
Name: rootPV.Spec.ClaimRef.Name,
9091
Namespace: rootPV.Spec.ClaimRef.Namespace,
@@ -128,7 +129,7 @@ func (l *LeafPVController) Reconcile(ctx context.Context, request reconcile.Requ
128129
return reconcile.Result{}, nil
129130
}
130131

131-
filterPV(rootPV, l.ClusterName)
132+
filterPV(rootPV, utils.NodeAffinity4RootPV(pv, l.IsOne2OneMode, l.ClusterName))
132133
if pvCopy.Spec.ClaimRef != nil || rootPV.Spec.ClaimRef == nil {
133134
nn := types.NamespacedName{
134135
Name: pvCopy.Spec.ClaimRef.Name,

pkg/clustertree/cluster-manager/controllers/pvc/leaf_pvc_controller.go

+24
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"k8s.io/apimachinery/pkg/api/errors"
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1212
mergetypes "k8s.io/apimachinery/pkg/types"
13+
"k8s.io/apimachinery/pkg/util/wait"
1314
"k8s.io/client-go/kubernetes"
1415
"k8s.io/klog"
1516
ctrl "sigs.k8s.io/controller-runtime"
@@ -65,6 +66,29 @@ func (l *LeafPVCController) Reconcile(ctx context.Context, request reconcile.Req
6566
if reflect.DeepEqual(rootPVC.Status, pvcCopy.Status) {
6667
return reconcile.Result{}, nil
6768
}
69+
70+
//when root pvc is not bound, it's status can't be changed to bound
71+
if pvcCopy.Status.Phase == v1.ClaimBound {
72+
err = wait.PollImmediate(500*time.Millisecond, 1*time.Minute, func() (bool, error) {
73+
if rootPVC.Spec.VolumeName == "" {
74+
klog.Warningf("pvc namespace: %q, name: %q is not bounded", request.NamespacedName.Namespace,
75+
request.NamespacedName.Name)
76+
err = l.RootClient.Get(ctx, request.NamespacedName, rootPVC)
77+
if err != nil {
78+
return false, err
79+
}
80+
return false, nil
81+
}
82+
return true, nil
83+
})
84+
if err != nil {
85+
if !errors.IsNotFound(err) {
86+
return reconcile.Result{RequeueAfter: LeafPVCRequeueTime}, nil
87+
}
88+
return reconcile.Result{}, nil
89+
}
90+
}
91+
6892
if err = filterPVC(pvcCopy, l.ClusterName); err != nil {
6993
return reconcile.Result{}, nil
7094
}

pkg/clustertree/cluster-manager/controllers/pvc/root_pvc_controller.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ func (r *RootPVCController) Reconcile(ctx context.Context, request reconcile.Req
7171
return reconcile.Result{}, nil
7272
}*/
7373

74-
if reflect.DeepEqual(pvcOld.Spec, pvc.Spec) {
74+
if reflect.DeepEqual(pvcOld.Spec.Resources.Requests, pvc.Spec.Resources.Requests) {
7575
return reconcile.Result{}, nil
7676
}
77+
pvcOld.Spec.Resources.Requests = pvc.Spec.Resources.Requests
78+
pvc.Spec = pvcOld.Spec
7779

7880
pvc.Annotations = pvcOld.Annotations
7981
pvc.ObjectMeta.UID = pvcOld.ObjectMeta.UID

pkg/utils/pvpvc.go

+26
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package utils
22

33
import (
4+
"fmt"
45
"reflect"
56

67
v1 "k8s.io/api/core/v1"
8+
9+
kosmosv1alpha1 "github.com/kosmos.io/kosmos/pkg/apis/kosmos/v1alpha1"
710
)
811

912
func IsPVEqual(pv *v1.PersistentVolume, clone *v1.PersistentVolume) bool {
@@ -14,3 +17,26 @@ func IsPVEqual(pv *v1.PersistentVolume, clone *v1.PersistentVolume) bool {
1417
}
1518
return false
1619
}
20+
21+
func IsOne2OneMode(cluster *kosmosv1alpha1.Cluster) bool {
22+
return cluster.Spec.ClusterTreeOptions.LeafModels != nil
23+
}
24+
25+
func NodeAffinity4RootPV(pv *v1.PersistentVolume, isOne2OneMode bool, clusterName string) string {
26+
node4RootPV := fmt.Sprintf("%s%s", KosmosNodePrefix, clusterName)
27+
if isOne2OneMode {
28+
for _, v := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms {
29+
for _, val := range v.MatchFields {
30+
if val.Key == NodeHostnameValue || val.Key == NodeHostnameValueBeta {
31+
node4RootPV = val.Values[0]
32+
}
33+
}
34+
for _, val := range v.MatchExpressions {
35+
if val.Key == NodeHostnameValue || val.Key == NodeHostnameValueBeta {
36+
node4RootPV = val.Values[0]
37+
}
38+
}
39+
}
40+
}
41+
return node4RootPV
42+
}

0 commit comments

Comments
 (0)