Jeel
Jeel

Reputation: 2525

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

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

Upvotes: 4

Views: 20626

Answers (2)

Shahriar
Shahriar

Reputation: 13804

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

Upvotes: 5

Jeel
Jeel

Reputation: 2525

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

Upvotes: 8

Related Questions