gnychis
gnychis

Reputation: 7555

Cannot access standalone-chrome selenium server via Kubernetes service

I have a k0s Kubernetes cluster on a single node. I am trying to run a selenium/standalone-chrome to create a remote Selenium node. The trouble that I am having is that it responds if I port forward 4444 from the pod, but cannot seem to access it via a Service port. I get connection refused. I don't know if it's because it's ignore connections that non-localhost.

The Pod definition for pod/standalone-chrome is:

apiVersion: v1
kind: Pod
metadata:
  name: standalone-chrome
spec:
  containers:
  - name: standalone-chrome
    image: selenium/standalone-chrome
    ports:
    - containerPort: 4444
    env:
    - name: JAVA_OPTS
      value: '-Dwebdriver.chrome.whitelistedIps=""'

The Service definition I have for service/standalone-chrome-service is:

apiVersion: v1
kind: Service
metadata:
  name: standalone-chrome-service
  labels:
    app: standalone-chrome
spec:
  ports:
  - port: 4444
    name: standalone-chrome
  type: ClusterIP
  selector:
    app: standalone-chrome

This creates the following, along with a busybox container I have just for testing connectivity.

NAME                         READY   STATUS    RESTARTS   AGE
pod/busybox1                 1/1     Running   70         2d22h
pod/standalone-chrome        1/1     Running   0          3m15s

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP          18d
service/standalone-chrome-service   ClusterIP   10.111.12.1     <none>        4444/TCP         3m5s

The issue I am having now is that I'm not able to access the remote Selenium service via standalone-chrome-service. I get connection refused. For example, here is trying to reach it via the busybox1 container:

$ wget http://standalone-chrome-service:4444
Connecting to standalone-chrome-service:4444 (10.111.12.1:4444)
wget: can't connect to remote host (10.111.12.1): Connection refused

I am able to port forward from pod/standalone-chrome to my host machine using kubectl port-forward though and it works OK, which I think confirms a service is successfully running but not accessible via the Service:

$ kubectl port-forward pod/standalone-chrome 4444:4444 &
Forwarding from 127.0.0.1:4444 -> 4444
Forwarding from [::1]:4444 -> 4444
$ wget http://localhost:4444
--2021-11-22 13:37:20--  http://localhost:4444/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:4444... connected.
...

I'd greatly appreciate any help in figuring out how to get the Selenium remote server accessible via the Service.


EDIT: Here is the updated Service definition with name...

apiVersion: v1
kind: Service
metadata:
  name: standalone-chrome-service
  labels:
    app: standalone-chrome
spec:
  ports:
  - port: 4444
    name: standalone-chrome
  type: ClusterIP
  selector:
    name: standalone-chrome

Here is the output of describe:

Name:              standalone-chrome-service
Namespace:         default
Labels:            app=standalone-chrome
Annotations:       <none>
Selector:          name=standalone-chrome
Type:              ClusterIP
IP Families:       <none>
IP:                10.100.179.116
IPs:               10.100.179.116
Port:              standalone-chrome  4444/TCP
TargetPort:        4444/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

Upvotes: 1

Views: 1270

Answers (1)

moonkotte
moonkotte

Reputation: 4181

Service's syntax with:

  selector:
    app: standalone-chrome

is correct, selector should be matched by label.

Services match a set of Pods using labels and selectors, a grouping primitive that allows logical operation on objects in Kubernetes. Labels are key/value pairs attached to objects

See for more details Using a Service to Expose Your App.

Now you need to add this label (which is app: standalone-chrome) to your pod.yaml metadata:

apiVersion: v1
kind: Pod
metadata:
  name: standalone-chrome
  labels:
    app: standalone-chrome # this label should match to selector in service
spec:
  containers:
  - name: standalone-chrome
    image: selenium/standalone-chrome
    ports:
    - containerPort: 4444
    env:
    - name: JAVA_OPTS
      value: '-Dwebdriver.chrome.whitelistedIps=""'

Upvotes: 1

Related Questions