@@ -43,12 +43,12 @@ Your cluster must have 4 CPU and 6 GB of RAM to complete the example up to the s
...
@@ -43,12 +43,12 @@ Your cluster must have 4 CPU and 6 GB of RAM to complete the example up to the s
### Deploy Selenium Grid Hub:
### Deploy Selenium Grid Hub:
We will be using Selenium Grid Hub to make our Selenium install scalable via a master/worker model. The Selenium Hub is the master, and the Selenium Nodes are the workers(not to be confused with Kubernetes nodes). We only need one hub, but we're using a replication controller to ensure that the hub is always running:
We will be using Selenium Grid Hub to make our Selenium install scalable via a master/worker model. The Selenium Hub is the master, and the Selenium Nodes are the workers(not to be confused with Kubernetes nodes). We only need one hub, but we're using a replication controller to ensure that the hub is always running:
```
```console
kubectl create --filename=selenium-hub-rc.yaml
kubectl create --filename=selenium-hub-rc.yaml
```
```
The Selenium Nodes will need to know how to get to the Hub, let's create a service for the nodes to connect to.
The Selenium Nodes will need to know how to get to the Hub, let's create a service for the nodes to connect to.
Let's verify our deployment of Selenium hub by connecting to the web console.
Let's verify our deployment of Selenium hub by connecting to the web console.
#### Kubernetes Nodes Reachable
#### Kubernetes Nodes Reachable
If your Kubernetes nodes are reachable from your network, you can verify the hub by hitting it on the nodeport. You can retrieve the nodeport by typing `kubectl describe svc selenium-hub`, however the snippet below automates that:
If your Kubernetes nodes are reachable from your network, you can verify the hub by hitting it on the nodeport. You can retrieve the nodeport by typing `kubectl describe svc selenium-hub`, however the snippet below automates that by using kubectl's template functionality:
```
```console
export NODEPORT=`kubectl get svc --selector='name=selenium-hub' --output=template --template="{{ with index .items 0}}{{with index .spec.ports 0 }}{{.nodePort}}{{end}}{{end}}"`
export NODEPORT=`kubectl get svc --selector='app=selenium-hub' --output=template --template="{{ with index .items 0}}{{with index .spec.ports 0 }}{{.nodePort}}{{end}}{{end}}"`
export NODE=`kubectl get nodes --output=template --template="{{with index .items 0 }}{{.metadata.name}}{{end}}"`
export NODE=`kubectl get nodes --output=template --template="{{with index .items 0 }}{{.metadata.name}}{{end}}"`
curl http://$NODE:$NODEPORT
curl http://$NODE:$NODEPORT
...
@@ -66,39 +66,40 @@ curl http://$NODE:$NODEPORT
...
@@ -66,39 +66,40 @@ curl http://$NODE:$NODEPORT
#### Kubernetes Nodes Unreachable
#### Kubernetes Nodes Unreachable
If you cannot reach your Kubernetes nodes from your network, you can proxy via kubectl.
If you cannot reach your Kubernetes nodes from your network, you can proxy via kubectl.
```
```console
export PODNAME=`kubectl get pods --selector="name=selenium-hub" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
export PODNAME=`kubectl get pods --selector="app=selenium-hub" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
kubectl port-forward --pod=$PODNAME 4444:4444
kubectl port-forward --pod=$PODNAME 4444:4444
```
```
In a seperate terminal, you can now check the status.
In a seperate terminal, you can now check the status.
```
```console
curl http://localhost:4444
curl http://localhost:4444
```
```
#### Using Google Container Engine
#### Using Google Container Engine
If you are using Google Container Engine, you can expose your hub via the internet. This is a bad idea for many reasons, but you can do it as follows:
If you are using Google Container Engine, you can expose your hub via the internet. This is a bad idea for many reasons, but you can do it as follows:
Then wait a few minutes, eventually your new `selenium-hub-external` service will be assigned an load balancing IP from gcloud.
Then wait a few minutes, eventually your new `selenium-hub-external` service will be assigned a load balanced IP from gcloud. Once `kubectl get svc selenium-hub-external` shows two IPs, run this snippet.
```
```console
export INTERNET_IP=`kubectl get svc --selector="name=selenium-hub-external" --output=template --template="{{with index .items 0}}{{with index .status.loadBalancer.ingress 0}}{{.ip}}{{end}}{{end}}"`
export INTERNET_IP=`kubectl get svc --selector="app=selenium-hub,external=true" --output=template --template="{{with index .items 0}}{{with index .status.loadBalancer.ingress 0}}{{.ip}}{{end}}{{end}}"`
curl http://$INTERNET_IP:4444/
curl http://$INTERNET_IP:4444/
```
```
You should now be able to hit `$INTERNET_IP` via your web browser, and so can everyone else on the Internet!
### Deploy Firefox and Chrome Nodes:
### Deploy Firefox and Chrome Nodes:
Now that the Hub is up, we can deploy workers.
Now that the Hub is up, we can deploy workers.
This will deploy 3 Chrome nodes.
This will deploy 2 Chrome nodes.
```
```console
kubectl create -f selenium-node-chrome-rc.yaml
kubectl create -f selenium-node-chrome-rc.yaml
```
```
And 3 Firefox nodes to match.
And 2 Firefox nodes to match.
```
```console
kubectl create -f selenium-node-firefox-rc.yaml
kubectl create -f selenium-node-firefox-rc.yaml
```
```
...
@@ -109,24 +110,24 @@ Let's run a quick Selenium job to validate our setup.
...
@@ -109,24 +110,24 @@ Let's run a quick Selenium job to validate our setup.
#### Setup Python Environment
#### Setup Python Environment
First, we need to start a python container that we can attach to.
First, we need to start a python container that we can attach to.
```
```console
kubectl run selenium-python --image=google/python-hello
kubectl run selenium-python --image=google/python-hello
```
```
Next, we need to get inside this container.
Next, we need to get inside this container.
```
```console
export PODNAME=`kubectl get pods --selector="run=selenium-python" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
export PODNAME=`kubectl get pods --selector="run=selenium-python" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
You now have 10 Firefox and 10 Chrome nodes, happy Seleniuming!
You now have 10 Firefox and 10 Chrome nodes, happy Seleniuming!
### Debugging
### Debugging
Sometimes it is neccessary to check on a hung test. Each pod is running VNC. To check on one of the browser nodes via VNC, it's reccomended that you proxy, since we don't want to expose a service for every pod, and the containers have a weak password. Replace POD_NAME with the name of the pod you want to connect to.
Sometimes it is neccessary to check on a hung test. Each pod is running VNC. To check on one of the browser nodes via VNC, it's reccomended that you proxy, since we don't want to expose a service for every pod, and the containers have a weak VNC password. Replace POD_NAME with the name of the pod you want to connect to.
```
```console
kubectl port-forward --pod=POD_NAME 9000:5900
kubectl port-forward --pod=POD_NAME 5900:5900
```
```
Then connect to localhost:9000 with your VNC client using the password "secret"
Then connect to localhost:5900 with your VNC client using the password "secret"