Setup Nginx Ingress Controller On Kubernetes

NGINX Ingress Controller adalah komponen yang digunakan dalam arsitektur Kubernetes untuk mengelola dan mengarahkan lalu lintas masuk (ingress) ke layanan-layanan dalam klaster Kubernetes.

Beberapa fungsi utama dari NGINX Ingress Controller seperti:

  • Routing dan Load Balancing
  • Manajemen SSL/TLS
  • Virtual Host Routing
  • Path-Based Routing
  • Rewrite Rules
  • Rate Limiting
  • Autoscaling
  • Aplikasi Multitenancy

Deploy Nginx Ingress Controller

Terdapat 2 Nginx ingress controllers yaitu

Pada simulasi ini akan menggunakan Nginx ingress controller dari kubernetes community.

Deploy Nginx ingress controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

Pastikan pods NGINX Ingress Controller running.

# kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-mgbf5        0/1     Completed   0          14m
ingress-nginx-admission-patch-xnvnv         0/1     Completed   3          14m
ingress-nginx-controller-79d66f886c-qnzsm   1/1     Running     0          14m

Deploy a Demo Application

Buat namespace site.

kubectl create ns site

Selanjutnya Buat file deployment.yaml lalu edit seperti berikut.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  namespace: site
spec:
  replicas: 4
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo
    spec:
      containers:
      - image: nginxdemos/hello
        imagePullPolicy: Always
        name: hello
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always

Deploy demosite.

kubectl apply -f deployment.yaml

Cek deployment status

kubectl get deployments -n site

Buat file service.yaml lalu edit seperti berikut.

apiVersion: v1
kind: Service
metadata:
  name: demo-service
  namespace: site
spec:
  internalTrafficPolicy: Cluster
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: demo
  type: ClusterIP

Deploy service.

kubectl apply -f service.yaml

Create Ingress Object for Application

Buat ingress agar app: demo dapat diakses menggunakan DNS.

Sebelumnya pastikan Anda sudah membuat record pada domain atau subdomain ke tujuan IP node yang menjadi ingress-nginx-controller

kubectl get pods -n ingress-nginx \
-o custom-columns=NAME:.metadata.name,NODE:spec.nodeName
NAME                                        NODE
ingress-nginx-admission-create-5h25b        worker2
ingress-nginx-admission-patch-7rjv4         worker1
ingress-nginx-controller-79d66f886c-j5qzc   worker1

Buat file ingress.yaml lalu edit seperti berikut.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ing
  namespace: site
spec:
  ingressClassName: nginx
  rules:
  - host: web8.example.com
    http:
      paths:
      - backend:
          service:
            name: demo-service
            port:
              number: 80
        path: /
        pathType: Prefix

Ganti web8.example.com dengan domain atau subdomain yang telah disetting A record.

Deploy ingress ke cluster.

kubectl apply -f ingress.yaml

Test akses website melalui http://web8.example.com pada browser.