Access kubernetes service externally

1/20/2020

I'm following the spring and kubernetes integration tutorial:

https://spring.io/guides/gs/spring-boot-kubernetes/

In my current scenario, I have 1 master and 2 workers servers.

When I deploy the file below using the command kubectl apply -f deployment.yaml, I can make a request from within the master server using kubectl port-forward svc/demo 8080:8080 and curl localhost:8080/actuator/health.

What I want to do is an external request (a public computer - my computer) to access the service that I created (kubernetes_master_ip:8080/actuator), but when I try this, I get "connection refused".

What is missing?

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo
    spec:
      containers:
      - image: springguides/demo
        name: demo
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: demo
  type: ClusterIP
status:
  loadBalancer: {}
-- Leonardo Carmona
docker
kubernetes
spring

2 Answers

1/21/2020

You need to change the type of service to expose the application. There are two ways: - LoadBalancer type: (Only on cloud providers) - NodePort type: Can be done on-premise or minikube.

Change your service yaml to below:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo
  name: demo
spec:
  ports:
  - name: 8080-8080
    port: 8080
    nodePort: 31234
    protocol: TCP
    targetPort: 8080
  selector:
    app: demo
  type: NodePort

Once the service is executed. check the application Node IP on which container is created.

kubectl get pods -o wide

then try to access the application at: http://node_ip:31234/actuator

-- Umesh Kumhar
Source: StackOverflow

1/21/2020

you can change your service type to load balancer. Which will expose your service via IP address to the external internet. Service type load balancer will only work with Cloud providers.

For more details you can visit : https://kubernetes.io/docs/concepts/services-networking/

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: demo
  type: LoadBalancer

save as yaml and execute it. it will provide the IP address.

You can access service via IP

Kubectl get svc
-- Harsh Manvar
Source: StackOverflow