mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-01 06:10:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			333 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Copyright 2015 The Kubernetes Authors.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| echo "WRITING KUBE FILES , will overwrite the jsons, then testing pods. is kube clean ready to go?"
 | |
| 
 | |
| 
 | |
| #Args below can be overriden when calling from cmd line.
 | |
| #Just send all the args in order.
 | |
| #for dev/test you can use:
 | |
| #kubectl=$GOPATH/src/github.com/kubernetes/kubernetes/cluster/kubectl.sh"
 | |
| kubectl="kubectl"
 | |
| VERSION="r.2.8.19"
 | |
| _SECONDS=1000          # number of seconds to measure throughput.
 | |
| FE="1"                # amount of Web server  
 | |
| LG="1"                # amount of load generators
 | |
| SLAVE="1"             # amount of redis slaves 
 | |
| TEST="1"              # 0 = Don't run tests, 1 = Do run tests.
 | |
| NS="k8petstore"       # namespace
 | |
| 
 | |
| kubectl="${1:-$kubectl}"
 | |
| VERSION="${2:-$VERSION}"
 | |
| _SECONDS="${3:-$_SECONDS}"   # number of seconds to measure throughput.
 | |
| FE="${4:-$FE}"       # amount of Web server  
 | |
| LG="${5:-$LG}"        # amount of load generators
 | |
| SLAVE="${6:-$SLAVE}"     # amount of redis slaves 
 | |
| TEST="${7:-$TEST}"      # 0 = Don't run tests, 1 = Do run tests.
 | |
| NS="${8:-$NS}"          # namespace
 | |
| 
 | |
| echo "Running w/ args: kubectl $kubectl version $VERSION sec $_SECONDS fe $FE lg $LG slave $SLAVE test $TEST NAMESPACE $NS"
 | |
| 
 | |
| function create_ns {
 | |
| 
 | |
| case "$NS" in
 | |
| "default" )
 | |
|     ;;
 | |
| "kube-system" )
 | |
|     ;;
 | |
| * )
 | |
| cat << EOF > ns.json
 | |
| {
 | |
|   "apiVersion": "v1",
 | |
|   "kind": "Namespace",
 | |
|   "metadata": {
 | |
|     "name": "$NS"
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| $kubectl create -f ns.json
 | |
| 
 | |
| esac
 | |
| }
 | |
| 
 | |
| function create { 
 | |
| 
 | |
| cat << EOF > fe-rc.json
 | |
| {
 | |
|   "kind": "ReplicationController",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "fectrl",
 | |
|     "labels": {"name": "frontend"}
 | |
|   },
 | |
|   "spec": {
 | |
|     "replicas": $FE,
 | |
|     "selector": {"name": "frontend"},
 | |
|     "template": {
 | |
|       "metadata": {
 | |
|         "labels": {
 | |
|           "name": "frontend",
 | |
|           "uses": "redis-master"
 | |
|         }
 | |
|       },
 | |
|       "spec": {
 | |
|          "containers": [{
 | |
|            "name": "frontend-go-restapi",
 | |
|            "image": "jayunit100/k8-petstore-web-server:$VERSION"
 | |
|          }]
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > bps-load-gen-rc.json
 | |
| {
 | |
|   "kind": "ReplicationController",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "bpsloadgenrc",
 | |
|     "labels": {"name": "bpsLoadGenController"}
 | |
|   },
 | |
|   "spec": {
 | |
|     "replicas": $LG,
 | |
|     "selector": {"name": "bps"},
 | |
|     "template": {
 | |
|       "metadata": {
 | |
|         "labels": {
 | |
|           "name": "bps",
 | |
|           "uses": "frontend"
 | |
|         }
 | |
|       },
 | |
|       "spec": {
 | |
|         "containers": [{
 | |
|            "name": "bps",
 | |
|            "image": "jayunit100/bigpetstore-load-generator",
 | |
|            "command": ["sh","-c","/opt/PetStoreLoadGenerator-1.0/bin/PetStoreLoadGenerator http://\$FRONTEND_SERVICE_HOST:3000/rpush/k8petstore/ 4 4 1000 123"]
 | |
|         }]
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > fe-s.json
 | |
| {
 | |
|   "kind": "Service",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "frontend",
 | |
|     "labels": {
 | |
|       "name": "frontend"
 | |
|     }
 | |
|   },
 | |
|   "spec": {
 | |
|     "ports": [{
 | |
|       "port": 3000
 | |
|     }],
 | |
|     "selector": {
 | |
|       "name": "frontend"
 | |
|     },
 | |
|     "type": "LoadBalancer"
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > rm.json
 | |
| {
 | |
|   "kind": "Pod",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "redismaster",
 | |
|     "labels": {
 | |
|       "name": "redis-master"
 | |
|     }
 | |
|   },
 | |
|   "spec": {
 | |
|     "containers": [{
 | |
|       "name": "master",
 | |
|       "image": "jayunit100/k8-petstore-redis-master:$VERSION",
 | |
|       "ports": [{
 | |
|         "containerPort": 6379
 | |
|       }]
 | |
|     }]
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > rm-s.json
 | |
| {
 | |
|   "kind": "Service",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "redismaster",
 | |
|     "labels": {
 | |
|       "name": "redis-master"
 | |
|     }
 | |
|   },
 | |
|   "spec": {
 | |
|     "ports": [{
 | |
|       "port": 6379
 | |
|     }],
 | |
|     "selector": {
 | |
|       "name": "redis-master"
 | |
|     }
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > rs-s.json
 | |
| {
 | |
|   "kind": "Service",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "redisslave",
 | |
|     "labels": {
 | |
|       "name": "redisslave"
 | |
|     }
 | |
|   },
 | |
|   "spec": {
 | |
|     "ports": [{
 | |
|       "port": 6379
 | |
|     }],
 | |
|     "selector": {
 | |
|       "name": "redisslave"
 | |
|     }
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| cat << EOF > slave-rc.json
 | |
| {
 | |
|   "kind": "ReplicationController",
 | |
|   "apiVersion": "v1",
 | |
|   "metadata": {
 | |
|     "name": "redissc",
 | |
|     "labels": {"name": "redisslave"}
 | |
|   },
 | |
|   "spec": {
 | |
|     "replicas": $SLAVE,
 | |
|     "selector": {"name": "redisslave"},
 | |
|     "template": {
 | |
|       "metadata": {
 | |
|         "labels": {
 | |
|           "name": "redisslave",
 | |
|           "uses": "redis-master"
 | |
|         }
 | |
|       },
 | |
|       "spec": {
 | |
|          "containers": [{
 | |
|            "name": "slave",
 | |
|            "image": "jayunit100/k8-petstore-redis-slave:$VERSION",
 | |
|            "ports": [{"containerPort": 6379}]
 | |
|          }]
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| EOF
 | |
| 
 | |
| create_ns
 | |
| 
 | |
| $kubectl create -f rm.json --namespace=$NS
 | |
| $kubectl create -f rm-s.json --namespace=$NS
 | |
| sleep 3 # precaution to prevent fe from spinning up too soon.
 | |
| $kubectl create -f slave-rc.json --namespace=$NS
 | |
| $kubectl create -f rs-s.json --namespace=$NS
 | |
| sleep 3 # see above comment.
 | |
| $kubectl create -f fe-rc.json --namespace=$NS
 | |
| $kubectl create -f fe-s.json --namespace=$NS
 | |
| $kubectl create -f bps-load-gen-rc.json --namespace=$NS
 | |
| }
 | |
| 
 | |
| #This script assumes the cloud provider is able to create a load balancer. If this not the case, you may want to check out other ways to make the frontend service accessible from outside (https://github.com/kubernetes/kubernetes/blob/master/docs/services.md#external-services)
 | |
| function getIP {
 | |
|   echo "Waiting up to 1 min for a public IP to be assigned by the cloud provider..."
 | |
|   for i in {1..20};
 | |
|   do
 | |
|     PUBLIC_IP=$($kubectl get services/frontend --namespace=$NS -o template --template="{{range .status.loadBalancer.ingress}}{{.ip}}{{end}}")
 | |
|       if [ -n "$PUBLIC_IP" ]; then
 | |
|         printf '\n\n\n%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
 | |
|         echo "public IP=$PUBLIC_IP"
 | |
|         printf '%*s\n\n\n\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' = 
 | |
|         return
 | |
|       fi
 | |
|       sleep 3
 | |
|   done
 | |
|   echo "Failed to detect the public IP after 1 min, exit!"
 | |
|   exit 1
 | |
| }
 | |
| 
 | |
| function pollfor {
 | |
|   pass_http=0
 | |
| 
 | |
|   ### Test HTTP Server comes up.
 | |
|   for i in {1..150};
 | |
|   do
 | |
|       ### Just testing that the front end comes up.  Not sure how to test total entries etc... (yet)
 | |
|       echo "Trying curl ... $PUBLIC_IP:3000 , attempt $i . expect a few failures while pulling images... "
 | |
|       curl --max-time 1 "$PUBLIC_IP:3000" > result
 | |
|       cat result
 | |
|       cat result | grep -q "k8-bps"
 | |
|       if [ $? -eq 0 ]; then
 | |
|           echo "TEST PASSED after $i tries !"
 | |
|           i=1000
 | |
|           break
 | |
|         else
 | |
|             echo "the above RESULT didn't contain target string for trial $i"
 | |
|         fi
 | |
|         sleep 3
 | |
|     done
 | |
| 
 | |
|     if [ $i -eq 1000 ]; then
 | |
|        pass_http=1
 | |
|     fi
 | |
|     
 | |
| }
 | |
| 
 | |
| function tests {
 | |
|     pass_load=0
 | |
| 
 | |
|     ### Print statistics of db size, every second, until $SECONDS are up.
 | |
|     for i in `seq 1 $_SECONDS`;
 | |
|      do
 | |
|         echo "curl : $PUBLIC_IP:3000 , $i of $_SECONDS"
 | |
|         curr_cnt="`curl --max-time 1 "$PUBLIC_IP:3000/llen"`" 
 | |
|         ### Write CSV File of # of trials / total transcations.
 | |
|         echo "$i $curr_cnt" >> result
 | |
|         echo "total transactions so far : $curr_cnt"
 | |
|         sleep 1
 | |
|   done
 | |
| }
 | |
| 
 | |
| create
 | |
| 
 | |
| getIP
 | |
| 
 | |
| pollfor
 | |
| 
 | |
| if [[ $pass_http -eq 1 ]]; then 
 | |
|     echo "Passed..."
 | |
| else
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| if [[ $TEST -eq 1 ]]; then
 | |
|     echo "running polling tests now"
 | |
|     tests
 | |
| fi
 |