Skip to content

Commit

Permalink
Revise ingress controller update operations
Browse files Browse the repository at this point in the history
  • Loading branch information
tamalsaha committed Aug 14, 2017
1 parent c29c9cb commit 7db3d3f
Show file tree
Hide file tree
Showing 21 changed files with 524 additions and 724 deletions.
12 changes: 10 additions & 2 deletions api/validator.go
Expand Up @@ -163,8 +163,13 @@ func (r Ingress) IsValid(cloudProvider string) error {
}
}
if !r.SupportsLBType(cloudProvider) {
return fmt.Errorf("Ingress %s@%s uses sunsupported LBType %s for cloud provider %s", r.Name, r.Namespace, r.LBType(), cloudProvider)
return fmt.Errorf("Ingress %s@%s uses unsupported LBType %s for cloud provider %s", r.Name, r.Namespace, r.LBType(), cloudProvider)
}

if (r.LBType() == LBTypeNodePort || r.LBType() == LBTypeHostPort) && len(r.Spec.LoadBalancerSourceRanges) > 0 {
return fmt.Errorf("Ingress %s@%s of type %s can't use `spec.LoadBalancerSourceRanges`", r.Name, r.Namespace, r.LBType())
}

return nil
}

Expand All @@ -177,8 +182,11 @@ func (r Ingress) SupportsLBType(cloudProvider string) bool {
cloudProvider == "azure" ||
cloudProvider == "acs" ||
cloudProvider == "minikube"
case LBTypeNodePort, LBTypeHostPort:
case LBTypeNodePort:
return cloudProvider != "acs"
case LBTypeHostPort:
// TODO: https://github.com/appscode/voyager/issues/374
return cloudProvider != "acs" && cloudProvider != "azure"
default:
return false
}
Expand Down
55 changes: 55 additions & 0 deletions hack/deploy/on-master.yaml
@@ -0,0 +1,55 @@
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: voyager
name: voyager-operator
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
app: voyager
spec:
nodeSelector:
kubernetes.io/role: master
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: voyager
args:
- run
- --cloud-provider=aws
- --v=3
image: appscode/voyager:hpc
imagePullPolicy: Always
ports:
- containerPort: 56790
name: http
protocol: TCP
volumeMounts:
- mountPath: /etc/kubernetes
name: cloudconfig
readOnly: true
volumes:
- hostPath:
path: /etc/kubernetes
name: cloudconfig
---
apiVersion: v1
kind: Service
metadata:
labels:
app: voyager
name: voyager-operator
namespace: kube-system
spec:
ports:
- name: http
port: 56790
targetPort: http
selector:
app: voyager
5 changes: 4 additions & 1 deletion hack/make.py
Expand Up @@ -50,7 +50,10 @@ def check_antipackage():
}
}
}

if libbuild.ENV not in ['prod']:
libbuild.BIN_MATRIX['voyager']['distro'] = {
'alpine': ['amd64']
}
libbuild.BUCKET_MATRIX = {
'prod': 'gs://appscode-cdn',
'dev': 'gs://appscode-dev'
Expand Down
1 change: 1 addition & 0 deletions pkg/eventer/recorder.go
Expand Up @@ -31,6 +31,7 @@ const (
EventReasonIngressUpdateSuccessful = "UpdateSuccessful"
EventReasonIngressServiceUpdateFailed = "ServiceUpdateFailed"
EventReasonIngressServiceUpdateSuccessful = "ServiceUpdateSuccessful"
EventReasonIngressFirewallUpdateFailed = "FirewallUpdateFailed"
EventReasonIngressStatsServiceCreateFailed = "StatsServiceCreateFailed"
EventReasonIngressStatsServiceCreateSuccessful = "StatsServiceCreateSuccessful"
EventReasonIngressStatsServiceDeleteFailed = "StatsServiceDeleteFailed"
Expand Down
11 changes: 5 additions & 6 deletions pkg/ingress/controller.go
Expand Up @@ -18,7 +18,6 @@ type Controller interface {
IsExists() bool
Create() error
Update(mode UpdateMode) error
UpdateTargetAnnotations(old *api.Ingress, new *api.Ingress) error
Delete() error
}

Expand Down Expand Up @@ -46,17 +45,17 @@ func NewController(
kubeClient clientset.Interface,
extClient acs.ExtensionInterface,
promClient pcm.MonitoringV1alpha1Interface,
services core.ServiceLister,
endpoints core.EndpointsLister,
serviceLister core.ServiceLister,
endpointsLister core.EndpointsLister,
opt config.Options,
ingress *api.Ingress) Controller {
switch ingress.LBType() {
case api.LBTypeHostPort:
return NewHostPortController(kubeClient, extClient, promClient, services, endpoints, opt, ingress)
return NewHostPortController(kubeClient, extClient, promClient, serviceLister, endpointsLister, opt, ingress)
case api.LBTypeNodePort:
return NewNodePortController(kubeClient, extClient, promClient, services, endpoints, opt, ingress)
return NewNodePortController(kubeClient, extClient, promClient, serviceLister, endpointsLister, opt, ingress)
case api.LBTypeLoadBalancer:
return NewLoadBalancerController(kubeClient, extClient, promClient, services, endpoints, opt, ingress)
return NewLoadBalancerController(kubeClient, extClient, promClient, serviceLister, endpointsLister, opt, ingress)
}
return nil
}
64 changes: 2 additions & 62 deletions pkg/ingress/create.go
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"reflect"
"strings"
"time"

"github.com/appscode/errors"
"github.com/appscode/log"
Expand Down Expand Up @@ -43,7 +42,7 @@ func (c *controller) ensureConfigMap() error {
}

needsUpdate := false
if val, ok := c.ensureResourceAnnotations(cm.Annotations); ok {
if val, ok := c.ensureOriginAnnotations(cm.Annotations); ok {
needsUpdate = true
cm.Annotations = val
}
Expand Down Expand Up @@ -168,50 +167,7 @@ func (c *controller) ensureStatsService() error {
return nil
}

func (c *controller) updateStatus() error {
var statuses []apiv1.LoadBalancerIngress

switch c.Ingress.LBType() {
case api.LBTypeLoadBalancer:
for i := 0; i < 50; i++ {
time.Sleep(time.Second * 10)
if svc, err := c.KubeClient.CoreV1().Services(c.Ingress.Namespace).Get(c.Ingress.OffshootName(), metav1.GetOptions{}); err == nil {
if len(svc.Status.LoadBalancer.Ingress) >= 1 {
statuses = svc.Status.LoadBalancer.Ingress
break
}
}
}
// TODO @sadlil consider adding node ip in status for hostport/nodeport mode
}

if len(statuses) > 0 {
if c.Ingress.APISchema() == api.APISchemaIngress {
ing, err := c.KubeClient.ExtensionsV1beta1().Ingresses(c.Ingress.Namespace).Get(c.Ingress.Name, metav1.GetOptions{})
if err != nil {
return errors.FromErr(err).Err()
}
ing.Status.LoadBalancer.Ingress = statuses
_, err = c.KubeClient.ExtensionsV1beta1().Ingresses(c.Ingress.Namespace).Update(ing)
if err != nil {
return errors.FromErr(err).Err()
}
} else {
ing, err := c.ExtClient.Ingresses(c.Ingress.Namespace).Get(c.Ingress.Name)
if err != nil {
return errors.FromErr(err).Err()
}
ing.Status.LoadBalancer.Ingress = statuses
_, err = c.ExtClient.Ingresses(c.Ingress.Namespace).Update(ing)
if err != nil {
return errors.FromErr(err).Err()
}
}
}
return nil
}

func (c *controller) ensureResourceAnnotations(annotation map[string]string) (map[string]string, bool) {
func (c *controller) ensureOriginAnnotations(annotation map[string]string) (map[string]string, bool) {
needsUpdate := false

// Copy the given map to avoid updating the original annotations
Expand Down Expand Up @@ -275,19 +231,3 @@ func VolumeMounts(secretNames []string) []apiv1.VolumeMount {
}
return ms
}

func isServicePortChanged(oldPorts, newPorts []apiv1.ServicePort) bool {
// Check if any port changed
ports := make(map[int32]bool)
for _, port := range oldPorts {
// We only use TCP protocol so ports are unique for our scenario
ports[port.Port] = true
}

for _, port := range newPorts {
if _, ok := ports[port.Port]; !ok {
return true
}
}
return false
}
37 changes: 9 additions & 28 deletions pkg/ingress/delete.go
Expand Up @@ -2,11 +2,8 @@ package ingress

import (
"github.com/appscode/errors"
"github.com/appscode/log"
"github.com/appscode/go/types"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"k8s.io/apimachinery/pkg/util/sets"
)

func (c *controller) deleteConfigMap() error {
Expand All @@ -18,32 +15,16 @@ func (c *controller) deleteConfigMap() error {
}

// Ensures deleting all pods if its still exits.
func (c *controller) deletePodsForSelector(s map[string]string) {
lb := labels.NewSelector()
for key, value := range s {
s := sets.NewString(value)
ls, err := labels.NewRequirement(key, selection.Equals, s.List())
if err != nil {
log.Warningln(err)
}
lb = lb.Add(*ls)
func (c *controller) deletePodsForSelector(selector *metav1.LabelSelector) error {
r, err := metav1.LabelSelectorAsSelector(selector)
if err != nil {
return err
}
pods, err := c.KubeClient.CoreV1().Pods(c.Ingress.Namespace).List(metav1.ListOptions{
LabelSelector: lb.String(),
return c.KubeClient.CoreV1().Pods(c.Ingress.Namespace).DeleteCollection(&metav1.DeleteOptions{
GracePeriodSeconds: types.Int64P(0),
}, metav1.ListOptions{
LabelSelector: r.String(),
})

if len(pods.Items) > 1 {
log.Warningln("load balancer delete request, pods are greater than one.")
}
gracePeriods := int64(0)
for _, pod := range pods.Items {
err = c.KubeClient.CoreV1().Pods(c.Ingress.Namespace).Delete(pod.Name, &metav1.DeleteOptions{
GracePeriodSeconds: &gracePeriods,
})
if err != nil {
log.Warningln(err)
}
}
}

func (c *controller) ensureStatsServiceDeleted() error {
Expand Down

0 comments on commit 7db3d3f

Please sign in to comment.