k8petstore-nodeport.sh
This commit is contained in:
parent
aac27711e5
commit
440411e404
|
@ -94,7 +94,7 @@ So, to run this app in Kubernetes, simply run [The all in one k8petstore.sh shel
|
|||
|
||||
Note that at the top of the script there are a few self explanatory parameters to set, among which the Public IPs parameter is where you can checkout the web ui (at $PUBLIC_IP:3000), which will show a plot and read outs of transaction throughput.
|
||||
|
||||
In the mean time, because the public IP will be deprecated in Kubernetes v1, we provide another script k8petstore-loadbalancer.sh, which requests the cloud provider (e.g., GCE, AWS) to assign a public IP. You can find the assigned IP address in the output of the script. If your cloud provider does not support load balancer or you are not running Kubernetes on a cloud, you may want to use [NodePort](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#external-services) instead.
|
||||
In the mean time, because the public IP will be deprecated in Kubernetes v1, we provide other 2 scripts k8petstore-loadbalancer.sh and k8petstore-nodeport.sh. As the names suggest, they rely on LoadBalancer and NodePort respectively. More details can be found [here](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/services.md#external-services).
|
||||
|
||||
## Future
|
||||
|
||||
|
|
|
@ -0,0 +1,319 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||
#
|
||||
# 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/GoogleCloudPlatform/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 = Dont run tests, 1 = Do run tests.
|
||||
NS="default" # namespace
|
||||
NODE_PORT=30291 #nodePort, see fe-s.json
|
||||
|
||||
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 = Dont run tests, 1 = Do run tests.
|
||||
NS="${8:-$NS}" # namespace
|
||||
NODE_PORT="${9:-$NODE_PORT}" #nodePort, see fe-s.json
|
||||
echo "Running w/ args: kubectl $kubectl version $VERSION sec $_SECONDS fe $FE lg $LG slave $SLAVE test $TEST NAMESPACE $NS NODE_PORT $NODE_PORT"
|
||||
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,
|
||||
"nodePort": $NODE_PORT
|
||||
}],
|
||||
"selector": {
|
||||
"name": "frontend"
|
||||
},
|
||||
"type": "NodePort"
|
||||
}
|
||||
}
|
||||
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
|
||||
$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
|
||||
}
|
||||
|
||||
#Get the IP addresses of all Kubernetes nodes.
|
||||
function getIP {
|
||||
#currently this script is only tested on GCE. The following line may need to be updated if k8s is not running on a cloud platform
|
||||
NODES_IP=$($kubectl get nodes -t='{{range .items}}{{range .status.addresses}}{{if eq .type "ExternalIP"}}{{.address}}{{print "\n"}}{{end}}{{end}}{{end}}')
|
||||
TEST_IP=$($kubectl get nodes -t='{{range (index .items 0).status.addresses}}{{if eq .type "ExternalIP"}}{{.address}}{{end}}{{end}}')
|
||||
if [ -z "$NODES_IP" ]; then
|
||||
echo "Error: Can't get node's IP!!!"
|
||||
exit 1
|
||||
else
|
||||
printf '\n\n\n%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
|
||||
echo -e "List of nodes' IP addresses:\n$NODES_IP"
|
||||
echo -e "Node IP $TEST_IP will be used in the tests in this script"
|
||||
printf '%*s\n\n\n\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
|
||||
fi
|
||||
}
|
||||
|
||||
function getNodePort {
|
||||
NODE_PORT=$($kubectl get services/frontend -t='{{(index .spec.ports 0).nodePort}}')
|
||||
if [ -z "$NODE_PORT" ]; then
|
||||
echo "Error: Can't get NodePort of services/frontend!!!"
|
||||
exit 1
|
||||
else
|
||||
printf '\n\n\n%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
|
||||
echo -e "NodePort of services/frontend:\n$NODE_PORT"
|
||||
echo -e "WARNING: On cloud platforms like GCE, you may need to add a firewall rule to allow TCP traffic on port $NODE_PORT"
|
||||
printf '%*s\n\n\n\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
|
||||
fi
|
||||
}
|
||||
|
||||
function pollfor {
|
||||
pass_http=0
|
||||
|
||||
### Test HTTP Server comes up.
|
||||
for i in `seq 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 "$TEST_IP:$NODE_PORT" > 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 : $TEST_IP:$NODE_PORT , $i of $_SECONDS"
|
||||
curr_cnt="`curl "$TEST_IP:$NODE_PORT/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
|
||||
|
||||
getNodePort
|
||||
|
||||
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
|
Loading…
Reference in New Issue