Skip to content

Commit

Permalink
feat: reserve vport for statefulset pod
Browse files Browse the repository at this point in the history
  • Loading branch information
oilbeater committed Jul 24, 2019
1 parent aa016c1 commit 55d7fd6
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 33 deletions.
73 changes: 46 additions & 27 deletions pkg/controller/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,46 @@ func (c *Controller) enqueueDeletePod(obj interface{}) {
utilruntime.HandleError(err)
return
}
klog.V(3).Infof("enqueue delete pod %s", key)
c.deletePodQueue.AddRateLimited(key)

p := obj.(*v1.Pod)
isStateful, statefulSetName := isStatefulSetPod(p)
if !p.Spec.HostNetwork && !isStateful {
klog.V(3).Infof("enqueue delete pod %s", key)
c.deletePodQueue.AddRateLimited(key)
}

for _, np := range c.podMatchNetworkPolicies(p) {
c.updateNpQueue.AddRateLimited(np)
}

if isStateful {
ss, err := c.config.KubeClient.AppsV1().StatefulSets(p.Namespace).Get(statefulSetName, metav1.GetOptions{})
if err != nil {
// statefulset is deleted
if k8serrors.IsNotFound(err) {
c.deletePodQueue.AddRateLimited(key)
return
} else {
klog.Errorf("failed to get statefulset %v", err)
return
}
}

// statefulset is deleting
if ss.DeletionTimestamp != nil {
c.deletePodQueue.AddRateLimited(key)
return
}

// down scale statefulset
numIndex := len(strings.Split(p.Name, "-")) - 1
numStr := strings.Split(p.Name, "-")[numIndex]
index, _ := strconv.Atoi(numStr)
if int32(index) >= *ss.Spec.Replicas {
c.deletePodQueue.AddRateLimited(key)
return
}
}
}

func (c *Controller) enqueueUpdatePod(oldObj, newObj interface{}) {
Expand Down Expand Up @@ -478,7 +511,7 @@ func (c *Controller) handleAddIpPoolPod(key string) error {
if ipPoolAnnotation != "" && pod.Annotations[util.IpAddressAnnotation] == "" {
ipPool := strings.Split(pod.Annotations[util.IpPoolAnnotation], ",")

if isStatefulSetPod(pod) {
if isStateful, _ := isStatefulSetPod(pod); isStateful {
numIndex := len(strings.Split(pod.Name, "-")) - 1
numStr := strings.Split(pod.Name, "-")[numIndex]
index, _ := strconv.Atoi(numStr)
Expand Down Expand Up @@ -571,27 +604,7 @@ func (c *Controller) handleDeletePod(key string) error {
return err
}
}
pod, err := c.podsLister.Pods(namespace).Get(name)
if err != nil {
// The Pod resource may no longer exist, in this case we stop
// processing.
if k8serrors.IsNotFound(err) {
return c.ovnClient.DeletePort(ovs.PodNameToPortName(name, namespace))
}
return err
}

if pod.Spec.HostNetwork {
klog.Infof("pod %s/%s in host network mode no need for ovn process", pod.Namespace, pod.Name)
return nil
}

// for statefulset pod, names are same when updating, so double check to make sure the pod is to be deleted
if pod.DeletionTimestamp != nil {
return c.ovnClient.DeletePort(ovs.PodNameToPortName(name, namespace))
}

return nil
return c.ovnClient.DeletePort(ovs.PodNameToPortName(name, namespace))
}

func (c *Controller) handleUpdatePod(key string) error {
Expand Down Expand Up @@ -647,6 +660,9 @@ func (c *Controller) handleUpdatePod(key string) error {
if err != nil {
return err
}
if err := c.ovnClient.DeleteStaticRouter(pod.Status.PodIP, c.config.ClusterRouter); err != nil {
return errors.Annotate(err, "del static route failed")
}
if err := c.ovnClient.AddStaticRouter(ovs.PolicySrcIP, pod.Status.PodIP, nodeTunlIPAddr.String(), c.config.ClusterRouter); err != nil {
return errors.Annotate(err, "add static route failed")
}
Expand All @@ -660,20 +676,23 @@ func (c *Controller) handleUpdatePod(key string) error {
if err != nil {
return err
}
if err := c.ovnClient.DeleteStaticRouter(pod.Status.PodIP, c.config.ClusterRouter); err != nil {
return errors.Annotate(err, "del static route failed")
}
if err := c.ovnClient.AddStaticRouter(ovs.PolicySrcIP, pod.Status.PodIP, nodeTunlIPAddr.String(), c.config.ClusterRouter); err != nil {
return errors.Annotate(err, "add static route failed")
}
}
return nil
}

func isStatefulSetPod(pod *v1.Pod) bool {
func isStatefulSetPod(pod *v1.Pod) (bool, string) {
for _, owner := range pod.OwnerReferences {
if owner.Kind == "StatefulSet" {
return true
return true, owner.Name
}
}
return false
return false, ""
}

func getNodeTunlIP(node *v1.Node) (net.IP, error) {
Expand Down
12 changes: 6 additions & 6 deletions vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ k8s.io/client-go/tools/auth
k8s.io/client-go/tools/clientcmd/api/latest
k8s.io/client-go/util/homedir
k8s.io/client-go/tools/record/util
k8s.io/client-go/dynamic
k8s.io/client-go/informers/admissionregistration/v1beta1
k8s.io/client-go/informers/apps/v1
k8s.io/client-go/informers/apps/v1beta1
Expand Down Expand Up @@ -358,6 +359,7 @@ k8s.io/client-go/pkg/apis/clientauthentication/v1beta1
k8s.io/client-go/util/connrotation
k8s.io/client-go/util/keyutil
k8s.io/client-go/tools/clientcmd/api/v1
k8s.io/client-go/restmapper
k8s.io/client-go/listers/admissionregistration/v1beta1
k8s.io/client-go/listers/apps/v1
k8s.io/client-go/listers/apps/v1beta1
Expand Down Expand Up @@ -388,8 +390,6 @@ k8s.io/client-go/listers/settings/v1alpha1
k8s.io/client-go/listers/storage/v1
k8s.io/client-go/listers/storage/v1alpha1
k8s.io/client-go/listers/storage/v1beta1
k8s.io/client-go/restmapper
k8s.io/client-go/dynamic
# k8s.io/klog v0.3.1
k8s.io/klog
# k8s.io/kube-openapi v0.0.0-20190401085232-94e1e7b7574c
Expand All @@ -403,6 +403,8 @@ k8s.io/utils/trace
# sigs.k8s.io/controller-runtime v0.2.0-alpha.0 => sigs.k8s.io/controller-runtime v0.2.0-beta.4
sigs.k8s.io/controller-runtime
sigs.k8s.io/controller-runtime/pkg/webhook
sigs.k8s.io/controller-runtime/pkg/cache
sigs.k8s.io/controller-runtime/pkg/client
sigs.k8s.io/controller-runtime/pkg/webhook/admission
sigs.k8s.io/controller-runtime/pkg/builder
sigs.k8s.io/controller-runtime/pkg/client/config
Expand All @@ -416,24 +418,22 @@ sigs.k8s.io/controller-runtime/pkg/internal/log
sigs.k8s.io/controller-runtime/pkg/runtime/inject
sigs.k8s.io/controller-runtime/pkg/webhook/internal/certwatcher
sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics
sigs.k8s.io/controller-runtime/pkg/cache/internal
sigs.k8s.io/controller-runtime/pkg/client/apiutil
sigs.k8s.io/controller-runtime/pkg/controller
sigs.k8s.io/controller-runtime/pkg/handler
sigs.k8s.io/controller-runtime/pkg/predicate
sigs.k8s.io/controller-runtime/pkg/source
sigs.k8s.io/controller-runtime/pkg/webhook/conversion
sigs.k8s.io/controller-runtime/pkg/client
sigs.k8s.io/controller-runtime/pkg/cache
sigs.k8s.io/controller-runtime/pkg/internal/recorder
sigs.k8s.io/controller-runtime/pkg/leaderelection
sigs.k8s.io/controller-runtime/pkg/metrics
sigs.k8s.io/controller-runtime/pkg/recorder
sigs.k8s.io/controller-runtime/pkg/internal/objectutil
sigs.k8s.io/controller-runtime/pkg/internal/controller
sigs.k8s.io/controller-runtime/pkg/event
sigs.k8s.io/controller-runtime/pkg/source/internal
sigs.k8s.io/controller-runtime/pkg/conversion
sigs.k8s.io/controller-runtime/pkg/cache/internal
sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics
sigs.k8s.io/controller-runtime/pkg/internal/objectutil
# sigs.k8s.io/yaml v1.1.0
sigs.k8s.io/yaml
2 changes: 2 additions & 0 deletions yamls/ovn.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ rules:
- apiGroups:
- ""
- networking.k8s.io
- apps
resources:
- networkpolicies
- services
- endpoints
- statefulsets
verbs:
- get
- list
Expand Down

0 comments on commit 55d7fd6

Please sign in to comment.