Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit f7f155f

Browse files
authored
Add autoscale test to E2E (#2096)
* initial attempt at autoscale test * working autoscale test * only add add’l options if passed in * Adding 3 replicas for load tester deployment * wait longer and linux only * skip autoscale test for v1.9 clusters #2114
1 parent f434ecd commit f7f155f

File tree

2 files changed

+101
-8
lines changed

2 files changed

+101
-8
lines changed

test/e2e/kubernetes/deployment/deployment.go

+28-5
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,32 @@ type Container struct {
5555

5656
// CreateLinuxDeploy will create a deployment for a given image with a name in a namespace
5757
// --overrides='{ "apiVersion": "extensions/v1beta1", "spec":{"template":{"spec": {"nodeSelector":{"beta.kubernetes.io/os":"linux"}}}}}'
58-
func CreateLinuxDeploy(image, name, namespace string) (*Deployment, error) {
58+
func CreateLinuxDeploy(image, name, namespace, miscOpts string) (*Deployment, error) {
59+
var err error
60+
var out []byte
5961
overrides := `{ "apiVersion": "extensions/v1beta1", "spec":{"template":{"spec": {"nodeSelector":{"beta.kubernetes.io/os":"linux"}}}}}`
60-
out, err := exec.Command("kubectl", "run", name, "-n", namespace, "--image", image, "--overrides", overrides).CombinedOutput()
62+
if miscOpts != "" {
63+
out, err = exec.Command("kubectl", "run", name, "-n", namespace, "--image", image, "--overrides", overrides, miscOpts).CombinedOutput()
64+
} else {
65+
out, err = exec.Command("kubectl", "run", name, "-n", namespace, "--image", image, "--overrides", overrides).CombinedOutput()
66+
}
67+
if err != nil {
68+
log.Printf("Error trying to deploy %s [%s] in namespace %s:%s\n", name, image, namespace, string(out))
69+
return nil, err
70+
}
71+
d, err := Get(name, namespace)
72+
if err != nil {
73+
log.Printf("Error while trying to fetch Deployment %s in namespace %s:%s\n", name, namespace, err)
74+
return nil, err
75+
}
76+
return d, nil
77+
}
78+
79+
// RunLinuxDeploy will create a deployment that runs a bash command in a pod
80+
// --overrides='{ "apiVersion": "extensions/v1beta1", "spec":{"template":{"spec": {"nodeSelector":{"beta.kubernetes.io/os":"linux"}}}}}'
81+
func RunLinuxDeploy(image, name, namespace, command string, replicas int) (*Deployment, error) {
82+
overrides := `{ "apiVersion": "extensions/v1beta1", "spec":{"template":{"spec": {"nodeSelector":{"beta.kubernetes.io/os":"linux"}}}}}`
83+
out, err := exec.Command("kubectl", "run", name, "-n", namespace, "--image", image, "--replicas", strconv.Itoa(replicas), "--overrides", overrides, "--command", "--", "/bin/sh", "-c", command).CombinedOutput()
6184
if err != nil {
6285
log.Printf("Error trying to deploy %s [%s] in namespace %s:%s\n", name, image, namespace, string(out))
6386
return nil, err
@@ -113,10 +136,10 @@ func (d *Deployment) Delete() error {
113136
}
114137

115138
// Expose will create a load balancer and expose the deployment on a given port
116-
func (d *Deployment) Expose(targetPort, exposedPort int) error {
117-
out, err := exec.Command("kubectl", "expose", "deployment", d.Metadata.Name, "--type", "LoadBalancer", "-n", d.Metadata.Namespace, "--target-port", strconv.Itoa(targetPort), "--port", strconv.Itoa(exposedPort)).CombinedOutput()
139+
func (d *Deployment) Expose(svcType string, targetPort, exposedPort int) error {
140+
out, err := exec.Command("kubectl", "expose", "deployment", d.Metadata.Name, "--type", svcType, "-n", d.Metadata.Namespace, "--target-port", strconv.Itoa(targetPort), "--port", strconv.Itoa(exposedPort)).CombinedOutput()
118141
if err != nil {
119-
log.Printf("Error while trying to expose target port (%v) for deployment %s in namespace %s on port %v:%s\n", targetPort, d.Metadata.Name, d.Metadata.Namespace, exposedPort, string(out))
142+
log.Printf("Error while trying to expose (%s) target port (%v) for deployment %s in namespace %s on port %v:%s\n", svcType, targetPort, d.Metadata.Name, d.Metadata.Namespace, exposedPort, string(out))
120143
return err
121144
}
122145
return nil

test/e2e/kubernetes/kubernetes_test.go

+73-3
Original file line numberDiff line numberDiff line change
@@ -176,18 +176,88 @@ var _ = Describe("Azure Container Cluster using the Kubernetes Orchestrator", fu
176176
})
177177

178178
Describe("with a linux agent pool", func() {
179+
It("should be able to autoscale", func() {
180+
version, err := node.Version()
181+
Expect(err).NotTo(HaveOccurred())
182+
re := regexp.MustCompile("v1.9")
183+
if eng.HasLinuxAgents() && re.FindString(version) == "" {
184+
// Inspired by http://blog.kubernetes.io/2016/07/autoscaling-in-kubernetes.html
185+
r := rand.New(rand.NewSource(time.Now().UnixNano()))
186+
phpApacheName := fmt.Sprintf("php-apache-%s-%v", cfg.Name, r.Intn(99999))
187+
phpApacheDeploy, err := deployment.CreateLinuxDeploy("gcr.io/google_containers/hpa-example", phpApacheName, "default", "--requests=cpu=50m,memory=50M")
188+
if err != nil {
189+
fmt.Println(err)
190+
}
191+
Expect(err).NotTo(HaveOccurred())
192+
193+
running, err := pod.WaitOnReady(phpApacheName, "default", 3, 30*time.Second, cfg.Timeout)
194+
Expect(err).NotTo(HaveOccurred())
195+
Expect(running).To(Equal(true))
196+
197+
phpPods, err := phpApacheDeploy.Pods()
198+
Expect(err).NotTo(HaveOccurred())
199+
// We should have exactly 1 pod to begin
200+
Expect(len(phpPods)).To(Equal(1))
201+
202+
err = phpApacheDeploy.Expose("ClusterIP", 80, 80)
203+
Expect(err).NotTo(HaveOccurred())
204+
s, err := service.Get(phpApacheName, "default")
205+
Expect(err).NotTo(HaveOccurred())
206+
207+
// Apply autoscale characteristics to deployment
208+
_, err = exec.Command("kubectl", "autoscale", "deployment", phpApacheName, "--cpu-percent=5", "--min=1", "--max=10").CombinedOutput()
209+
Expect(err).NotTo(HaveOccurred())
210+
211+
phpPods, err = phpApacheDeploy.Pods()
212+
Expect(err).NotTo(HaveOccurred())
213+
// We should still have exactly 1 pod after autoscale config but before load
214+
Expect(len(phpPods)).To(Equal(1))
215+
216+
// Launch a simple busybox pod that wget's continuously to the apache serviceto simulate load
217+
commandString := fmt.Sprintf("while true; do wget -q -O- http://%s.default.svc.cluster.local; done", phpApacheName)
218+
loadTestName := fmt.Sprintf("load-test-%s-%v", cfg.Name, r.Intn(99999))
219+
numLoadTestPods := 3
220+
loadTestDeploy, err := deployment.RunLinuxDeploy("busybox", loadTestName, "default", commandString, numLoadTestPods)
221+
Expect(err).NotTo(HaveOccurred())
222+
223+
running, err = pod.WaitOnReady(loadTestName, "default", 3, 30*time.Second, cfg.Timeout)
224+
Expect(err).NotTo(HaveOccurred())
225+
Expect(running).To(Equal(true))
226+
227+
// We should have three load tester pods running
228+
loadTestPods, err := loadTestDeploy.Pods()
229+
Expect(err).NotTo(HaveOccurred())
230+
Expect(len(loadTestPods)).To(Equal(numLoadTestPods))
231+
232+
// Wait 3 minutes for autoscaler to respond to load
233+
time.Sleep(3 * time.Minute)
234+
235+
phpPods, err = phpApacheDeploy.Pods()
236+
Expect(err).NotTo(HaveOccurred())
237+
// We should have > 1 pods after autoscale effects
238+
Expect(len(phpPods) > 1).To(BeTrue())
239+
240+
err = loadTestDeploy.Delete()
241+
Expect(err).NotTo(HaveOccurred())
242+
err = phpApacheDeploy.Delete()
243+
Expect(err).NotTo(HaveOccurred())
244+
err = s.Delete()
245+
Expect(err).NotTo(HaveOccurred())
246+
}
247+
})
248+
179249
It("should be able to deploy an nginx service", func() {
180250
if eng.HasLinuxAgents() {
181251
r := rand.New(rand.NewSource(time.Now().UnixNano()))
182252
deploymentName := fmt.Sprintf("nginx-%s-%v", cfg.Name, r.Intn(99999))
183-
nginxDeploy, err := deployment.CreateLinuxDeploy("library/nginx:latest", deploymentName, "default")
253+
nginxDeploy, err := deployment.CreateLinuxDeploy("library/nginx:latest", deploymentName, "default", "")
184254
Expect(err).NotTo(HaveOccurred())
185255

186256
running, err := pod.WaitOnReady(deploymentName, "default", 3, 30*time.Second, cfg.Timeout)
187257
Expect(err).NotTo(HaveOccurred())
188258
Expect(running).To(Equal(true))
189259

190-
err = nginxDeploy.Expose(80, 80)
260+
err = nginxDeploy.Expose("LoadBalancer", 80, 80)
191261
Expect(err).NotTo(HaveOccurred())
192262

193263
s, err := service.Get(deploymentName, "default")
@@ -231,7 +301,7 @@ var _ = Describe("Azure Container Cluster using the Kubernetes Orchestrator", fu
231301
Expect(err).NotTo(HaveOccurred())
232302
Expect(running).To(Equal(true))
233303
234-
err = iisDeploy.Expose(80, 80)
304+
err = iisDeploy.Expose("LoadBalancer", 80, 80)
235305
Expect(err).NotTo(HaveOccurred())
236306
237307
s, err := service.Get(deploymentName, "default")

0 commit comments

Comments
 (0)