# 05. Deploy demo app with persistence volume and publish app via ingress controller

## <mark style="color:green;">**Overview**</mark> <a href="#overview" id="overview"></a>

*Step-by-step guide on how to deploy demo application on HI GIO Kubernetes*

* *Install nginx ingress controller to your Kubernetes cluster. Installing the nginx ingress controller will auto-create 2 Virtual services (80, 443) in HI GIO LB.*
* *Deploy demo app with persistence volume into the Kubernetes cluster and publish app via ingress nginx*

## <mark style="color:green;">**Procedure**</mark> <a href="#procedure" id="procedure"></a>

**1. Pre-requisites:**

* Helm (v3 or higher)
* Make sure there is at least 1 available public IP
* Have a default Storage Class
* Permission for access to your Kubernetes cluster

**2. Procedure:**

{% stepper %}
{% step %}
**Step 1:** Install nginx ingress controller to your Kubernetes cluster

```
#Add repo ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx 
helm repo update ingress-nginx
```

<div align="left"><figure><img src="/files/AituNTE1DsLzXlOJvtJT" alt=""><figcaption></figcaption></figure></div>

```
#Install ingress nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
		--namespace ingress-nginx \
		--set controller.service.appProtocol=false \
		--create-namespace
```

<figure><img src="/files/NwcQ9yy04bQ2UKUzacQT" alt=""><figcaption></figcaption></figure>

* Verify pod status is `Running` and service `ingress-nginx-controller` successfully obtained an `EXTERNAL IP`

```
kubectl get all -n ingress-nginx
```

<figure><img src="/files/FrhFuVNDMLzMy8nOSDQk" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
CNI driver on Kubernetes automatically creates Virtual services on HI GIO LB and 2 DNAT rules (80, 443) on vCD.

Please modify the VPC firewall to allow access to the ingress virtual services. This provides access to your application published via the nginx ingress

***Ref*** [*Using Edge Gateway firewall*](/network/1.-working-with-network/using-edge-gateway-firewall.md)
{% endhint %}
{% endstep %}

{% step %}
**Step 2: Deploy demo app with persistence volume into the Kubernetes cluster and publish app via ingress nginx**

* Demo app folder structure

```
demoapp 
├── 01-demoapp-namespace.yaml
├── 02-demoapp-pvc.yaml
├── 03-demoapp-deployment.yaml
├── 04-demoapp-service.yaml
└── 05-demoapp-ingress.yaml
```

* Create file `01-demoapp-namespace.yaml` to create demoapp namespace

```
apiVersion: v1
kind: Namespace
metadata:
  name: demoapp
```

* Create file `02-demoapp-pvc.yaml` to create a Persistence Volume Claim

```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demoapp-pvc
  namespace: demoapp
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: default-storage-class-1 #adjust to use your storage class
```

* Create file `03-demoapp-deployment.yaml` to create the demoapp deployment

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp
  namespace: demoapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demoapp
  template:
    metadata:
      labels:
        app: demoapp
    spec:
      containers:
      - name: demoapp
        image: paulbouwer/hello-kubernetes:1.8
        ports:
        - containerPort: 8080
        volumeMounts:
        - mountPath: /data
          name: demoapp-storage
      volumes:
      - name: demoapp-storage
        persistentVolumeClaim:
          claimName: demoapp-pvc
```

* Create file `04-demoapp-service.yaml` to create demoapp service

```
apiVersion: v1
kind: Service
metadata:
  name: demoapp
  namespace: demoapp
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: demoapp
```

* Create file `05-demoapp-ingress.yaml` to create demoapp ingress

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demoapp-ingress
  namespace: demoapp
spec:
  ingressClassName: nginx
  rules:
  - host: demoapp.cloud.net.vn #adjust to use your domain
    http:
      paths:
      - backend:
          service:
            name: demoapp
            port:
              number: 80
        path: /
        pathType: Prefix
```

* Apply all manifests

```
cd demoapp
kubectl apply -f .
```

<div align="left"><figure><img src="/files/9YJOGE7njUKShSAipV2W" alt=""><figcaption></figcaption></figure></div>

* Create a DNS record for demoapp

```
Name: <ingress-host>
Address: 42.113.xx.xx (EXTERNAL-IP of ingress nginx)
```

<div align="left"><figure><img src="/files/LkBlWTFiCF2oqMplY5Md" alt=""><figcaption></figcaption></figure></div>

* If all the configuration is correct, you can access your app with the domain `http://<ingress-host>`

<figure><img src="/files/DbE6zTR0gQr9lqxkdKYh" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.higiocloud.vn/hi-gio-kubernetes/05.-deploy-demo-app-with-persistence-volume-and-publish-app-via-ingress-controller.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
