k8petstore-nodeport.sh

This commit is contained in:
Chao Xu 2015-06-12 15:10:32 -07:00
parent aac27711e5
commit 440411e404
2 changed files with 320 additions and 1 deletions

View File

@ -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

319
k8petstore/k8petstore-nodeport.sh Executable file
View File

@ -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