Skip to content

AWS - Network Load Balancer - NLB

Step-00: Kubernetes Manifests

#01-MySQL-externalName-Service.yml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ExternalName
  externalName: usermgmtdb.cxojydmxwly6.us-east-1.rds.amazonaws.com
#02-UserManagementMicroservice-Deployment-Service.yml
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: usermgmt-microservice
  labels:
    app: usermgmt-restapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: usermgmt-restapp
  template:  
    metadata:
      labels: 
        app: usermgmt-restapp
    spec:
      initContainers:
        - name: init-db
          image: busybox:1.31
          command: ['sh', '-c', 'echo -e "Checking for the availability of MySQL Server deployment"; while ! nc -z mysql 3306; do sleep 1; printf "-"; done; echo -e "  >> MySQL DB Server has started";']      
      containers:
        - name: usermgmt-restapp
          image: stacksimplify/kube-usermanagement-microservice:1.0.0  
          ports: 
            - containerPort: 8095           
          env:
            - name: DB_HOSTNAME
              value: "mysql"            
            - name: DB_PORT
              value: "3306"            
            - name: DB_NAME
              value: "usermgmt"            
            - name: DB_USERNAME
              value: "dbadmin"        # RDS DB Username is dbadmin     
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-db-password
                  key: db-password           
          livenessProbe:
            exec:
              command: 
                - /bin/sh
                - -c 
                - nc -z localhost 8095
            initialDelaySeconds: 60
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /usermgmt/health-status
              port: 8095
            initialDelaySeconds: 60
            periodSeconds: 10          
#03-UserManagement-Service.yml
apiVersion: v1
kind: Service
metadata:
  name: usermgmt-restapp-service
  labels: 
    app: usermgmt-restapp
spec:
  type: NodePort
  selector:
    app: usermgmt-restapp
  ports: 
    - port: 8095
      targetPort: 8095
      nodePort: 31231
apiVersion: v1
kind: Service
metadata:
  name: nlb-usermgmt-restapp
  labels: 
    app: usermgmt-restapp
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb    # To create Network Load Balancer
spec:
  type: LoadBalancer # Default - CLB
  selector:
    app: usermgmt-restapp
  ports: 
    - port: 80
      targetPort: 8095

Step-01: Create AWS Network Load Balancer Kubernetes Manifest & Deploy

  • 04-NetworkLoadBalancer.yml
    apiVersion: v1
    kind: Service
    metadata:
      name: nlb-usermgmt-restapp
      labels:
        app: usermgmt-restapp
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb    # To create Network Load Balancer
    spec:
      type: LoadBalancer # Regular k8s Service manifest with type as LoadBalancer
      selector:
        app: usermgmt-restapp     
      ports:
      - port: 80
        targetPort: 8095
    
  • Deploy all Manifest
    # Deploy all manifests
    kubectl apply -f kube-manifests/
    
    # List Services (Verify newly created NLB Service)
    kubectl get svc
    
    # Verify Pods
    kubectl get pods
    

Step-02: Verify the deployment

  • Verify if new CLB got created
  • Go to Services -> EC2 -> Load Balancing -> Load Balancers
    • CLB should be created
    • Copy DNS Name (Example: a85ae6e4030aa4513bd200f08f1eb9cc-7f13b3acc1bcaaa2.elb.us-east-1.amazonaws.com)
  • Go to Services -> EC2 -> Load Balancing -> Target Groups
    • Verify the health status, we should see active.
  • Access Application
    # Access Application
    http://<NLB-DNS-NAME>/usermgmt/health-status
    

Step-03: Clean Up

# Delete all Objects created
kubectl delete -f kube-manifests/

# Verify current Kubernetes Objects
kubectl get all

AWS EKS - Elastic Kubernetes Service - Masterclass

Image