Sticky Session Implementation

- Added process to cleanup stale session affinity records
- Automatically set cloud provided load balancer for sticky session if the service requires it - Note, this only works on GCE right now.
- Changed sessionAffinityMap a map to pointers instead of structs to improve performance
- Commented out cookie and protocol from sessionAffinityDetail to avoid confusion as it is not yet implemented.
This commit is contained in:
Mike Foley
2014-12-18 18:46:10 -05:00
parent c34f2d354c
commit c4e94efe16
8 changed files with 457 additions and 53 deletions

View File

@@ -39,7 +39,9 @@ type serviceInfo struct {
socket proxySocket
timeout time.Duration
// TODO: make this an net.IP address
publicIP []string
publicIP []string
sessionAffinityType api.AffinityType
stickyMaxAgeMinutes int
}
// How long we wait for a connection to a backend in seconds
@@ -341,6 +343,7 @@ func (proxier *Proxier) SyncLoop() {
glog.Errorf("Failed to ensure iptables: %v", err)
}
proxier.ensurePortals()
proxier.cleanupStaleStickySessions()
}
}
}
@@ -358,6 +361,15 @@ func (proxier *Proxier) ensurePortals() {
}
}
// clean up any stale sticky session records in the hash map.
func (proxier *Proxier) cleanupStaleStickySessions() {
for name, info := range proxier.serviceMap {
if info.sessionAffinityType != api.AffinityTypeNone {
proxier.loadBalancer.CleanupStaleStickySessions(name)
}
}
}
// This assumes proxier.mu is not locked.
func (proxier *Proxier) stopProxy(service string, info *serviceInfo) error {
proxier.mu.Lock()
@@ -403,10 +415,12 @@ func (proxier *Proxier) addServiceOnPort(service string, protocol api.Protocol,
return nil, err
}
si := &serviceInfo{
proxyPort: portNum,
protocol: protocol,
socket: sock,
timeout: timeout,
proxyPort: portNum,
protocol: protocol,
socket: sock,
timeout: timeout,
sessionAffinityType: api.AffinityTypeNone,
stickyMaxAgeMinutes: 180,
}
proxier.setServiceInfo(service, si)
@@ -456,10 +470,19 @@ func (proxier *Proxier) OnUpdate(services []api.Service) {
info.portalIP = serviceIP
info.portalPort = service.Spec.Port
info.publicIP = service.Spec.PublicIPs
if service.Spec.SessionAffinity != nil {
info.sessionAffinityType = *service.Spec.SessionAffinity
// TODO: paramaterize this in the types api file as an attribute of sticky session. For now it's hardcoded to 3 hours.
info.stickyMaxAgeMinutes = 180
}
glog.V(4).Infof("info: %+v", info)
err = proxier.openPortal(service.Name, info)
if err != nil {
glog.Errorf("Failed to open portal for %q: %v", service.Name, err)
}
proxier.loadBalancer.NewService(service.Name, info.sessionAffinityType, info.stickyMaxAgeMinutes)
}
proxier.mu.Lock()
defer proxier.mu.Unlock()