- Development Environment Setup
- Containerize the application
- Deploy the application to local Kubernetes Cluster
- Push the image to Azure Container Registry using the Azure CLI
- Create AKS cluster using the Azure CLI
- Deploy the application to AKS Cluster using .yml file
- Scale the application and Kubernetes infrastructure
- Update the application then push the image to ACR and update deployment
Development Environment Setup
- Install Docker
- Enable Kubernetes Cluster on Docker, under Docker -> Settings
- Install Azure CLI and Azure PowerShell modules
Containerize the application
- Clone this repo to a folder
- Open a command prompt and navigate to your project folder.
- Use the following commands to build and run your Docker image:
				
					 docker build . -t kubeservice:local
 docker run -d -p 8000:80 kubeservice:local 
				
			
		- View the .Net Core application running from a container by navigating to localhost:8000
Deploy the application to local Kubernetes Cluster
- 
Deploy docker image to Kubernetes 
				
					 kubectl run kubeservice-deployment --image=kubeservice:local --port=80 --replicas=3 
				
			
		- 
- kubectlcommand- to verify the deployment: kubectl get deployments
- to verify the replicasets: kubectl get rs
- to verify the Pods: kubectl get pods
 
- to verify the deployment: 
 
- Expose the application to outside world, use the following command
				
					 kubectl expose deployment kubeservice-deployment --type=NodePort 
				
			
		- Verify the service
				
					 kubectl get svc 
				
			
		
				
					 Expected Result:
 NAME                     TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
 kubernetes               ClusterIP      10.0.0.1                 443/TCP        42d
 kubeservice-deployment   NodePort       10.0.120.27              80:31057/TCP   1m   
				
			
		- 
Finally access the app using browser: http://localhost:31057 
Push the image to Azure Container Registry using the Azure CLI
- Login to Azure
				
					 az login 
				
			
		- Create Azure Resource Group
				
					 az group create -n vvkubeserviceacr-rg -l eastus 
				
			
		- Create Azure Container Registry
				
					 az acr create -n vvkubeserviceacr -g vvkubeserviceacr-rg -l eastus --sku standard 
				
			
		- 
- Verify the Azure Container Registry
 
- Verify the Azure Container Registry
				
					 az acr list -o table
 Expected Result:
 NAME              RESOURCE GROUP       LOCATION    SKU       LOGIN SERVER                 CREATION DATE         ADMIN ENABLED
 vvkubeserviceacr  vvkubeserviceacr-rg  eastus      Standard  vvkubeserviceacr.azurecr.io  2018-10-27T20:04:22Z 
				
			
		- Push the image to Azure Container Registry
- Login to Azure Container Registry
 
				
					 az acr login -n vvkubeserviceacr 
				
			
		- 
- Tag the docker image prior to push the image to Azure Container Registry
 
				
					 docker tag kubeservice:local vvkubeserviceacr.azurecr.io/kubeservice:v1 
				
			
		- 
- Push the tagged image to Azure Container Registry
 
				
					 docker push vvkubeserviceacr.azurecr.io/kubeservice:v1 
				
			
		- 
- Verify the repository in Azure Container Registry
 
				
					 az acr repository list -n vvkubeserviceacr -o table
 Result:
 kubeservice 
				
			
		
				
					 az ad sp create-for-rbac --skip-assignment
 Result:
 {
     "appId": "",
     "displayName": "",
     "name": "",
     "password": "",
     "tenant": ""
 }      
				
			
		- Create acrID variable
				
					 $acrID = az acr show --name vvkubeserviceacr --resource-group vvkubeserviceacr-rg --query "id" --output tsv 
				
			
		- Create a role assignment with appid and acrID
				
					 az role assignment create --assignee "" --role Reader --scope $acrID  
				
			
		- Create AKS Cluster
				
					 az aks create --name vvkubeserviceaks --resource-group vvkubeserviceacr-rg --node-count 1 --generate-ssh-keys --service-principal "" --client-secret "" --location eastus   
				
			
		- Get the AKS cluster credentials to update local environment
				
					az aks get-credentials --name vvkubeserviceaks --resource-group vvkubeserviceacr-rg 
				
			
		- Verify the AKS Cluster in Azure Cloud
				
					 kubectl get nodes
 Expected Result look like this:
 NAME                       STATUS    ROLES     AGE       VERSION
 aks-nodepool1-33154602-0   Ready     agent     6m        v1.9.11 
				
			
		
				
					 apiVersion: apps/v1
 kind: Deployment
 metadata:
 	name: kubeservice-deployment
 	labels:
 	    app: kubeservice
 spec:
 	replicas: 3
 	template:
 		metadata:
 			name: kubeservice
 			labels:
 				app: kubeservice
 		spec:
 			containers:
 		      - name: kubeservice
 		         image: vvkubeserviceacr.azurecr.io/kubeservice:v1
 		         imagePullPolicy: IfNotPresent
 		    restartPolicy: Always
 	selector:
 	    matchLabels:
 		      app: kubeservice
 ---
 apiVersion: v1
 kind: Service
 metadata:
 	 name: kubeservice-service
 spec:
   selector:
     app: kubeservice
   ports:
     - port: 80
   type: LoadBalancer 
				
			
		- Deploy the application to AKS Cluster
				
					 kubectl apply -f .\kubeservice-deploy.yml 
				
			
		- To monitor the service deployment
				
					 kubectl get service --watch
 Result:
 NAME                  TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
 kubernetes            ClusterIP      10.0.0.1              443/TCP        20m
 kubeservice-service   LoadBalancer   10.0.154.43        80:30845/TCP   15s
 kubeservice-service   LoadBalancer   10.0.154.43   137.135.124.83   80:30845/TCP   1m   
				
			
		Scale the application and Kubernetes infrastructure
Scaling Azure Kubernetes Service (AKS) Cluster nodes
- Get the current nodes
				
					 kubectl get nodes
 Result:
 NAME                       STATUS    ROLES     AGE       VERSION
 aks-nodepool1-33154602-0   Ready     agent     26m       v1.9.11 
				
			
		- Scaling nodes
				
					 az aks scale --resource-group vvkubeserviceacr-rg --name=vvkubeserviceaks --node-count 3
 Result:
  
				
			
		- Get the current nodes after scaling
				
					 kubectl get nodes
 Result:
 NAME                                      READY     STATUS    RESTARTS   AGE
 kubeservice-deployment-5fbf677667-ffftl   1/1       Running   0          17m
 kubeservice-deployment-5fbf677667-kvfg2   1/1       Running   0          17m
 kubeservice-deployment-5fbf677667-mjgbq   1/1       Running   0          17m 
				
			
		
				
					 kubectl get pods
 Result:
 NAME                                      READY     STATUS    RESTARTS   AGE
 kubeservice-deployment-5fbf677667-ffftl   1/1       Running   0          18m
 kubeservice-deployment-5fbf677667-kvfg2   1/1       Running   0          18m
 kubeservice-deployment-5fbf677667-mjgbq   1/1       Running   0          18m 
				
			
		- Verify the current deployment
				
					 kubectl get deployment
 Result:
 NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 kubeservice-deployment   3         3         3            3           19m 
				
			
		- Scale the pods to 5
				
					 kubectl scale --replicas=5 deployment/kubeservice-deployment
 Result:
 deployment.extensions "kubeservice-deployment" scaled 
				
			
		- Verify the current deployment after scale
				
					 kubectl get deployment
 Result:
 NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 kubeservice-deployment   5         5         5            5           22m 
				
			
		- Verify the current replicas # of application
				
					 kubectl get pods
 Result:
 NAME                                      READY     STATUS    RESTARTS   AGE
 kubeservice-deployment-5fbf677667-b6p8l   1/1       Running   0          2m
 kubeservice-deployment-5fbf677667-ffftl   1/1       Running   0          22m
 kubeservice-deployment-5fbf677667-kvfg2   1/1       Running   0          22m
 kubeservice-deployment-5fbf677667-mjgbq   1/1       Running   0          22m
 kubeservice-deployment-5fbf677667-qdrsf   1/1       Running   0          2m 
				
			
		
				
					 Change the label "Host Name:" with "AKS Host Name:" 
				
			
		- 
Create a new image docker build . -t vvkubeserviceacr.azurecr.io/kubeservice:v2
- 
Push the image to Azure Container Registry 
				
					 docker push vvkubeserviceacr.azurecr.io/kubeservice:v2 
				
			
		- Update the deployment
				
					 kubectl set image deployment kubeservice-deployment kubeservice=vvkubeserviceacr.azurecr.io/kubeservice:v2 
				
			
		- To monitor the deployment
				
					kubectl get pods
Result:
NAME                                    READY     STATUS    RESTARTS   AGE
kubeservice-deployment-9c594f98-5bwgp   1/1       Running   0          1m
kubeservice-deployment-9c594f98-b4szp   1/1       Running   0          1m
kubeservice-deployment-9c594f98-ctbzp   1/1       Running   0          1m
kubeservice-deployment-9c594f98-pjztm   1/1       Running   0          1m
kubeservice-deployment-9c594f98-w75g4   1/1       Running   0          1m 
				
			
		- Test the updated application
				
					 kubectl get service
 Result:
 NAME                  TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
 kubernetes            ClusterIP      10.0.0.1                 443/TCP        1h
 kubeservice-service   LoadBalancer   10.0.154.43   137.135.124.83   80:30845/TCP   1h  
				
			
		- 
Run the application to see the changes made by navigating to the url: http://137.135.124.83 
 
															






