How to expose nginx on public Ip using NodePort service in Kubernetes?

11,157

Solution 1

Jeel is right. Your Service selector is mismatch with Pod labels.

If you fix that like what Jeel already added in this answer

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
  selector:
    name: nginx

Your Service will be exposed in Node IP address. Because your Service Type is NodePort.

If your Node IP is, lets say, 35.226.16.207, you can connect to your Pod using this IP and NodePort

$ curl 35.226.16.207:30080

In this case, your node must have a public IP. Otherwise, you can't access

Second option, you can create LoadBalancer Type Service

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      name: http
  selector:
    name: nginx

This will provide you a public IP.

For more details, check this

Solution 2

The endpoint was not getting added. On debugging I found the label between deployment and Service has a mismatch. Hence changed the label type from "app" to "name" and it worked.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
      name: http
  selector:
    name: nginx
Share:
11,157
Jeel
Author by

Jeel

Updated on June 13, 2022

Comments

  • Jeel
    Jeel almost 2 years

    I'm executing kubectl create -f nginx.yaml which creates the pods successfully. But the PODS aren't exposed on Public IP of my instance. Following is the YAML used be me with service type as nodeport:

     apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        name: nginx
    spec:
      type: NodePort
      ports:
        - port: 80
          nodePort: 30080
          name: http
        - port: 443
          nodePort: 30443
          name: https
      selector:
        name: nginx
    

    What could be in-correct in my approach or above YAML file to expose the pod on deployment to the public IP?

    PS: Firewall and ACLs are open to internet on all TCP

  • Ahmed Abd Ellatif
    Ahmed Abd Ellatif over 2 years
    yes , that must be in the top thanks