0

I have created a local Minikube cluster, then a deployment for a hello-world example. After it is active, a service is created at the same time.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: hello-world-example
  replicas: 2
  template:
    metadata:
      labels:
        run: hello-world-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/hello-app:2.0 # Works
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: hello-app-service
spec:
  # type: NodePort
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: hello-world
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    # nodePort: 31579

I apply the deployment and service with kubectl apply-f hello-app.yaml I end up with the following example services:

NAMESPACE NAME TARGET PORT URL
default hello-app-service 8080 http://IP:31813
default kubernetes No node port
kube-system kube-dns No node port

Note: My actual IP is not actually "IP"

When I curl the URL for the hello-app-service, I end up with this:

curl: (7) Failed to connect to IP port 31813 after 0 ms: Connection refused

However, when I expose the deployment service manually in CLI with kubectl expose deployment hello-world --type=LoadBalancer --port=8080

I get the following result:

NAMESPACE NAME TARGET PORT URL
default hello-app-service 8080 http://IP:31813
default hello-world 8080 http://IP:32168
default kubernetes No node port
kube-system kube-dns No node port

And after I curl the URL for new service "hello-world", I end with the proper result:

Hello, world! Version: 2.0.0 Hostname: hello-world-5bb7fff796-fmwl8

Can somebody please explain to me what I am doing wrong with the service? Why is the CLI service working, while the .yaml file service is not working, despite using the same configuration. I have tested both with the same exact service settings as the CLI command (Using LoadBalancer type) and also with NodePort and setting the specific port.

Versions: OS: Ubuntu 22.04.2 LTS Docker version: 24.0.2 Kubectl version: Client Version: v1.27.2 Kustomize Version: v5.0.1 Server Version: v1.26.3 Minikube version: v1.30.1

1 Answers1

0

I'd change the selector for your service so it maps correctly to your deployment. Also, you can manually assign an external IP in your manifest:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: hello-world-example
  replicas: 2
  template:
    metadata:
      labels:
        run: hello-world-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/hello-app:2.0 # Works
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: hello-app-service
spec:
  # type: NodePort
  type: LoadBalancer
  selector:
    run: hello-world-example
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
  externalIPs:
  - 34.74.203.201

EDIT Kubernetes service external ip pending You could always change your service to a NodePort or IngressController, but since you're running minikube there's a "magic command":

minikube tunnel

https://minikube.sigs.k8s.io/docs/handbook/accessing/

Oliver
  • 1
  • 2
  • Based on my reading, an external IP is not required for this purpose. The rest of the mapping is as per a documentation example. This doesn't solve the issue unfortunately – ginywiny Jun 19 '23 at 00:27