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

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

Overview

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

 

Procedure

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:

  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
image-20241219-072650.png
#Install ingress nginx helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --set controller.service.appProtocol=false \ --create-namespace
image-20241219-073330.png
  • Verify pod status is Running and service ingress-nginx-controller successfully obtained an EXTERNAL IP

    kubectl get all -n ingress-nginx
image-20241219-074711.png

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: https://higio-support.atlassian.net/wiki/spaces/v2/pages/32538757/Using+Edge+Gateway+Firewall

  1. 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 .
    image-20241219-091700.png
  • Create a DNS record for demoapp

    Name: <ingress-host> Address: 42.113.xx.xx (EXTERNAL-IP of ingress nginx)
    image-20241219-092340.png
  • If all the configuration is correct, you can access your app with the domain http://<ingress-host>

image-20241219-092602.png

 

End.