# Install NGINX Ingress on K3S

### 1\. Install K3S

To install K3S, execute the following command with an explanation for `INSTALL_K3S_EXEC`:

* `--disable traefik, servicelb`: Remove traefik and servicelb
    
* `--tls-san`: Add additional hostnames or IPv4/IPv6 addresses as Subject Alternative Names on the TLS cert, so the controller plane can connect using IP of the server
    

```bash
sudo curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik,servicelb --tls-san $IP_SERVER" K3S_KUBECONFIG_MODE="644" sh -
```

### 2\. Install NGINX Ingress Controller

There are several ways to install but we use helm for simplicity.

We will use `nginx-ingress-release` as the name of the Chart and installing it on `nginx-ingress` namespace. Since we installed it on a Virtual Private Server (VPS), we're changing the service type to `NodePort`. This is necessary because the default setting uses `LoadBalancer` type, which may not be suitable for our VPS environment. Additionally, set the `hostNetwork` to true so that we can access it via a domain.

```bash
$ kubectl create namespace nginx-ingress
namespace/nginx-ingress created

$ helm install nginx-ingress-release oci://ghcr.io/nginxinc/charts/nginx-ingress --version 1.1.0 --namespace nginx-ingress --set controller.service.type=NodePort --set controller.kind=daemonset --set controller.hostNetwork=true
Pulled: ghcr.io/nginxinc/charts/nginx-ingress:1.1.0
Digest: sha256:47eddf60256ad1b0f98596f41d767d9d4cd6ec81f54a284391a4763261c78d3b
NAME: nginx-ingress-release
LAST DEPLOYED: Wed Jan  3 17:20:47 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The NGINX Ingress Controller has been installed.
```

### **3\. Verify the installation**

```bash
$ kubectl get daemonset,pods -n nginx-ingress
NAME                                              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/nginx-ingress-release-controller   2         2         2       2            2           <none>          34m

NAME                                         READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-release-controller-7szw5   1/1     Running   0          34m
pod/nginx-ingress-release-controller-csl79   1/1     Running   0          34m
```

### **4\. Install simple application**

In this example, we will install simple Apache deployment.

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apache
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - name: apache-container
        image: httpd:latest
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: apache-service
spec:
  selector:
    app: apache
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
```

### **5\. Expose the application using Ingress**

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apache-ingress
  namespace: app
spec:
  rules:
  - host: apache.example.id  # Replace with your actual domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: apache-service
            port:
              number: 80
```

### **6\. Access the application**

To access the application, go to [apache.example.id](http://apache.example.id).

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1704323792198/c43eb3a2-191c-4015-9c06-507ea4c01c7b.png align="center")
