Search code examples
kubernetescontainerskubectl

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


Solution

  • 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