Commit 5fa64049 authored by mfanjie's avatar mfanjie

rewrite serivce controller to apply the latest controller pattern

parent 52559696
...@@ -250,9 +250,11 @@ func StartControllers(s *options.CMServer, kubeClient *client.Client, kubeconfig ...@@ -250,9 +250,11 @@ func StartControllers(s *options.CMServer, kubeClient *client.Client, kubeconfig
nodeController.Run(s.NodeSyncPeriod.Duration) nodeController.Run(s.NodeSyncPeriod.Duration)
time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter)) time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter))
serviceController := servicecontroller.New(cloud, clientset.NewForConfigOrDie(restclient.AddUserAgent(kubeconfig, "service-controller")), s.ClusterName) serviceController, err := servicecontroller.New(cloud, clientset.NewForConfigOrDie(restclient.AddUserAgent(kubeconfig, "service-controller")), s.ClusterName)
if err := serviceController.Run(s.ServiceSyncPeriod.Duration, s.NodeSyncPeriod.Duration); err != nil { if err != nil {
glog.Errorf("Failed to start service controller: %v", err) glog.Errorf("Failed to start service controller: %v", err)
} else {
serviceController.Run(int(s.ConcurrentServiceSyncs))
} }
time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter)) time.Sleep(wait.Jitter(s.ControllerStartInterval.Duration, ControllerStartJitter))
......
...@@ -46,6 +46,7 @@ func NewCMServer() *CMServer { ...@@ -46,6 +46,7 @@ func NewCMServer() *CMServer {
Port: ports.ControllerManagerPort, Port: ports.ControllerManagerPort,
Address: "0.0.0.0", Address: "0.0.0.0",
ConcurrentEndpointSyncs: 5, ConcurrentEndpointSyncs: 5,
ConcurrentServiceSyncs: 1,
ConcurrentRCSyncs: 5, ConcurrentRCSyncs: 5,
ConcurrentRSSyncs: 5, ConcurrentRSSyncs: 5,
ConcurrentDaemonSetSyncs: 2, ConcurrentDaemonSetSyncs: 2,
...@@ -108,6 +109,7 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet) { ...@@ -108,6 +109,7 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider, "The provider for cloud services. Empty string for no provider.") fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider, "The provider for cloud services. Empty string for no provider.")
fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.") fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile, "The path to the cloud provider configuration file. Empty string for no configuration file.")
fs.Int32Var(&s.ConcurrentEndpointSyncs, "concurrent-endpoint-syncs", s.ConcurrentEndpointSyncs, "The number of endpoint syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentEndpointSyncs, "concurrent-endpoint-syncs", s.ConcurrentEndpointSyncs, "The number of endpoint syncing operations that will be done concurrently. Larger number = faster endpoint updating, but more CPU (and network) load")
fs.Int32Var(&s.ConcurrentServiceSyncs, "concurrent-service-syncs", s.ConcurrentServiceSyncs, "The number of services that are allowed to sync concurrently. Larger number = more responsive service management, but more CPU (and network) load")
fs.Int32Var(&s.ConcurrentRCSyncs, "concurrent_rc_syncs", s.ConcurrentRCSyncs, "The number of replication controllers that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentRCSyncs, "concurrent_rc_syncs", s.ConcurrentRCSyncs, "The number of replication controllers that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load")
fs.Int32Var(&s.ConcurrentRSSyncs, "concurrent-replicaset-syncs", s.ConcurrentRSSyncs, "The number of replica sets that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentRSSyncs, "concurrent-replicaset-syncs", s.ConcurrentRSSyncs, "The number of replica sets that are allowed to sync concurrently. Larger number = more responsive replica management, but more CPU (and network) load")
fs.Int32Var(&s.ConcurrentResourceQuotaSyncs, "concurrent-resource-quota-syncs", s.ConcurrentResourceQuotaSyncs, "The number of resource quotas that are allowed to sync concurrently. Larger number = more responsive quota management, but more CPU (and network) load") fs.Int32Var(&s.ConcurrentResourceQuotaSyncs, "concurrent-resource-quota-syncs", s.ConcurrentResourceQuotaSyncs, "The number of resource quotas that are allowed to sync concurrently. Larger number = more responsive quota management, but more CPU (and network) load")
......
...@@ -171,9 +171,11 @@ func (s *CMServer) Run(_ []string) error { ...@@ -171,9 +171,11 @@ func (s *CMServer) Run(_ []string) error {
glog.Fatalf("Failed to start node status update controller: %v", err) glog.Fatalf("Failed to start node status update controller: %v", err)
} }
serviceController := servicecontroller.New(cloud, clientset.NewForConfigOrDie(restclient.AddUserAgent(kubeconfig, "service-controller")), s.ClusterName) serviceController, err := servicecontroller.New(cloud, clientset.NewForConfigOrDie(restclient.AddUserAgent(kubeconfig, "service-controller")), s.ClusterName)
if err := serviceController.Run(s.ServiceSyncPeriod.Duration, s.NodeSyncPeriod.Duration); err != nil { if err != nil {
glog.Errorf("Failed to start service controller: %v", err) glog.Errorf("Failed to start service controller: %v", err)
} else {
serviceController.Run(int(s.ConcurrentServiceSyncs))
} }
if s.AllocateNodeCIDRs && s.ConfigureCloudRoutes { if s.AllocateNodeCIDRs && s.ConfigureCloudRoutes {
......
...@@ -479,6 +479,10 @@ type KubeControllerManagerConfiguration struct { ...@@ -479,6 +479,10 @@ type KubeControllerManagerConfiguration struct {
// allowed to sync concurrently. Larger number = more responsive replica // allowed to sync concurrently. Larger number = more responsive replica
// management, but more CPU (and network) load. // management, but more CPU (and network) load.
ConcurrentRCSyncs int32 `json:"concurrentRCSyncs"` ConcurrentRCSyncs int32 `json:"concurrentRCSyncs"`
// concurrentServiceSyncs is the number of services that are
// allowed to sync concurrently. Larger number = more responsive service
// management, but more CPU (and network) load.
ConcurrentServiceSyncs int32 `json:"concurrentServiceSyncs"`
// concurrentResourceQuotaSyncs is the number of resource quotas that are // concurrentResourceQuotaSyncs is the number of resource quotas that are
// allowed to sync concurrently. Larger number = more responsive quota // allowed to sync concurrently. Larger number = more responsive quota
// management, but more CPU (and network) load. // management, but more CPU (and network) load.
......
...@@ -71,6 +71,7 @@ func DeepCopy_componentconfig_KubeControllerManagerConfiguration(in interface{}, ...@@ -71,6 +71,7 @@ func DeepCopy_componentconfig_KubeControllerManagerConfiguration(in interface{},
out.ConcurrentEndpointSyncs = in.ConcurrentEndpointSyncs out.ConcurrentEndpointSyncs = in.ConcurrentEndpointSyncs
out.ConcurrentRSSyncs = in.ConcurrentRSSyncs out.ConcurrentRSSyncs = in.ConcurrentRSSyncs
out.ConcurrentRCSyncs = in.ConcurrentRCSyncs out.ConcurrentRCSyncs = in.ConcurrentRCSyncs
out.ConcurrentServiceSyncs = in.ConcurrentServiceSyncs
out.ConcurrentResourceQuotaSyncs = in.ConcurrentResourceQuotaSyncs out.ConcurrentResourceQuotaSyncs = in.ConcurrentResourceQuotaSyncs
out.ConcurrentDeploymentSyncs = in.ConcurrentDeploymentSyncs out.ConcurrentDeploymentSyncs = in.ConcurrentDeploymentSyncs
out.ConcurrentDaemonSetSyncs = in.ConcurrentDaemonSetSyncs out.ConcurrentDaemonSetSyncs = in.ConcurrentDaemonSetSyncs
......
...@@ -21,6 +21,7 @@ import ( ...@@ -21,6 +21,7 @@ import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake" fakecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/fake"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
...@@ -29,7 +30,7 @@ import ( ...@@ -29,7 +30,7 @@ import (
const region = "us-central" const region = "us-central"
func newService(name string, uid types.UID, serviceType api.ServiceType) *api.Service { func newService(name string, uid types.UID, serviceType api.ServiceType) *api.Service {
return &api.Service{ObjectMeta: api.ObjectMeta{Name: name, Namespace: "namespace", UID: uid}, Spec: api.ServiceSpec{Type: serviceType}} return &api.Service{ObjectMeta: api.ObjectMeta{Name: name, Namespace: "namespace", UID: uid, SelfLink: testapi.Default.SelfLink("services", name)}, Spec: api.ServiceSpec{Type: serviceType}}
} }
func TestCreateExternalLoadBalancer(t *testing.T) { func TestCreateExternalLoadBalancer(t *testing.T) {
...@@ -56,6 +57,7 @@ func TestCreateExternalLoadBalancer(t *testing.T) { ...@@ -56,6 +57,7 @@ func TestCreateExternalLoadBalancer(t *testing.T) {
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "udp-service", Name: "udp-service",
Namespace: "default", Namespace: "default",
SelfLink: testapi.Default.SelfLink("services", "udp-service"),
}, },
Spec: api.ServiceSpec{ Spec: api.ServiceSpec{
Ports: []api.ServicePort{{ Ports: []api.ServicePort{{
...@@ -73,6 +75,7 @@ func TestCreateExternalLoadBalancer(t *testing.T) { ...@@ -73,6 +75,7 @@ func TestCreateExternalLoadBalancer(t *testing.T) {
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "basic-service1", Name: "basic-service1",
Namespace: "default", Namespace: "default",
SelfLink: testapi.Default.SelfLink("services", "basic-service1"),
}, },
Spec: api.ServiceSpec{ Spec: api.ServiceSpec{
Ports: []api.ServicePort{{ Ports: []api.ServicePort{{
...@@ -91,11 +94,11 @@ func TestCreateExternalLoadBalancer(t *testing.T) { ...@@ -91,11 +94,11 @@ func TestCreateExternalLoadBalancer(t *testing.T) {
cloud := &fakecloud.FakeCloud{} cloud := &fakecloud.FakeCloud{}
cloud.Region = region cloud.Region = region
client := &fake.Clientset{} client := &fake.Clientset{}
controller := New(cloud, client, "test-cluster") controller, _ := New(cloud, client, "test-cluster")
controller.init() controller.init()
cloud.Calls = nil // ignore any cloud calls made in init() cloud.Calls = nil // ignore any cloud calls made in init()
client.ClearActions() // ignore any client calls made in init() client.ClearActions() // ignore any client calls made in init()
err, _ := controller.createLoadBalancerIfNeeded(types.NamespacedName{Namespace: "foo", Name: "bar"}, item.service, nil) err, _ := controller.createLoadBalancerIfNeeded("foo/bar", item.service)
if !item.expectErr && err != nil { if !item.expectErr && err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} else if item.expectErr && err == nil { } else if item.expectErr && err == nil {
...@@ -211,13 +214,13 @@ func TestUpdateNodesInExternalLoadBalancer(t *testing.T) { ...@@ -211,13 +214,13 @@ func TestUpdateNodesInExternalLoadBalancer(t *testing.T) {
cloud.Region = region cloud.Region = region
client := &fake.Clientset{} client := &fake.Clientset{}
controller := New(cloud, client, "test-cluster2") controller, _ := New(cloud, client, "test-cluster2")
controller.init() controller.init()
cloud.Calls = nil // ignore any cloud calls made in init() cloud.Calls = nil // ignore any cloud calls made in init()
var services []*cachedService var services []*api.Service
for _, service := range item.services { for _, service := range item.services {
services = append(services, &cachedService{lastState: service, appliedState: service}) services = append(services, service)
} }
if err := controller.updateLoadBalancerHosts(services, hosts); err != nil { if err := controller.updateLoadBalancerHosts(services, hosts); err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment