Table of Contents
- Introduction to DevOps
- The DevOps Lifecycle
- Key DevOps Tools
- Continuous Integration and Continuous Deployment (CI/CD)
- Infrastructure as Code (IaC)
- Monitoring and Logging
- Security in DevOps
- Kubernetes Command Examples and Explanation
- Example YAML Configurations
1. Introduction to DevOps
What is DevOps?
DevOps is a set of practices that combines software development (Dev) and IT operations (Ops). It aims to shorten the systems development life cycle and provide continuous delivery with high software quality. DevOps is complementary to Agile software development; several DevOps aspects came from Agile methodology.
Benefits of DevOps
- Faster Delivery of Features: Reduced time to market.
- Improved Collaboration: Breaks down silos between development and operations teams.
- Increased Efficiency: Automation of repetitive tasks.
- Higher Quality and Reliability: Continuous testing and integration improve software quality.
- Enhanced Security: Automated compliance policies and configuration management techniques.
2. The DevOps Lifecycle
Stages of the DevOps Lifecycle
- Planning: Define and plan the end goal of the software.
- Coding: Development of software code.
- Building: Compile the source code into binary code.
- Testing: Automated testing to ensure quality.
- Releasing: Release management and deployment.
- Deploying: Deploying applications into production.
- Operating: Application performance monitoring.
- Monitoring: Continuous monitoring of the software and infrastructure.
3. Key DevOps Tools
Categories and Examples
- Version Control: Git, SVN
- CI/CD: Jenkins, Travis CI, CircleCI
- Configuration Management: Ansible, Puppet, Chef
- Containers: Docker, Kubernetes
- Monitoring: Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana)
- Collaboration: Jira, Slack
4. Continuous Integration and Continuous Deployment (CI/CD)
What is CI/CD?
CI/CD is a method to frequently deliver apps to customers by introducing automation into the stages of app development. The main concepts attributed to CI/CD are continuous integration, continuous deployment, and continuous delivery.
- Continuous Integration: Developers frequently commit code to a shared repository, which triggers automated builds and tests.
- Continuous Deployment: Automatically deploy every change that passes the automated tests to the production environment.
- Continuous Delivery: Ensures that the codebase is always in a deployable state but does not automatically deploy to production.
Example CI/CD Pipeline with Jenkins
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean install'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deploy') {
steps {
deployToServer()
}
}
}
}
5. Infrastructure as Code (IaC)
What is IaC?
Infrastructure as Code (IaC) is the process of managing and provisioning computing infrastructure through machine-readable definition files, rather than physical hardware configuration or interactive configuration tools.
Example with Terraform
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
6. Monitoring and Logging
Importance of Monitoring and Logging
Monitoring and logging are crucial for maintaining the health, performance, and security of applications. They provide visibility into system performance, help detect issues, and ensure smooth operation.
Tools for Monitoring and Logging
- Prometheus and Grafana: Prometheus is used for event monitoring and alerting, while Grafana provides visualization.
- ELK Stack: Elasticsearch, Logstash, and Kibana for searching, analyzing, and visualizing log data.
7. Security in DevOps
DevSecOps
DevSecOps integrates security practices within the DevOps process. It emphasizes security at every stage of the software development lifecycle.
Security Best Practices
- Shift Left: Incorporate security early in the development process.
- Automated Security Testing: Use tools to automatically scan code for vulnerabilities.
- Configuration Management: Ensure configurations are secure and compliant with policies.
8. Kubernetes Command Examples and Explanation
Kubernetes is an open-source container orchestration platform that automates many of the manual processes involved in deploying, managing, and scaling containerized applications.
Basic Kubernetes Commands
- Create a Deployment
sudo kubectl create -f my-deployment.yaml
- This command creates a deployment based on the configuration specified in
my-deployment.yaml
.
- Check Deployment Status
sudo kubectl rollout status deployment/my-deployment
- This command checks the status of the rollout of the deployment named
my-deployment
.
- View Deployment History
sudo kubectl rollout history deployment/my-deployment
- This command shows the history of rollouts for the deployment
my-deployment
.
- Delete a Deployment
sudo kubectl delete deployment my-deployment
- This command deletes the deployment named
my-deployment
.
- Record a Deployment Creation
sudo kubectl create -f my-deployment.yaml --record
- This command creates a deployment and records the command executed, useful for tracking changes.
- Apply Changes to a Deployment
sudo kubectl apply -f my-deployment.yaml
- This command applies changes defined in the
my-deployment.yaml
to the existing deployment.
- Describe a Deployment
sudo kubectl describe deployment
- This command provides detailed information about the specified deployment.
- Get Cluster Nodes
sudo kubectl get nodes
- This command lists all the nodes in the Kubernetes cluster.
- Update Deployment Image
sudo kubectl set image deployment/my-deployment nginx-container=nginx:1.12
- This command updates the image of the
nginx-container
in the deploymentmy-deployment
tonginx:1.12
.
- Undo a Deployment Rollout
sudo kubectl rollout undo deployment/my-deployment
- This command undoes the last rollout for the deployment
my-deployment
.
- This command undoes the last rollout for the deployment
- Get Deployments
sudo kubectl get deployment
- This command lists all deployments in the current namespace.
- Get Pods
bash sudo kubectl get pods
- This command lists all pods in the current namespace.
9. Example YAML Configurations
Example 1: Cluster Configuration
cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: us-east-2
nodeGroups:
- name: ng-1
instanceType: t2.small
desiredCapacity: 3
ssh:
publicKeyName: eks-key
- name: ng-mixed
minSize: 3
maxSize: 5
instancesDistribution:
maxPrice: 0.2
instanceTypes: ["t2.small", "t3.small"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 50
ssh:
publicKeyName: eks-key
Example 2: Scaled Cluster Configuration
cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: us-east-2
nodeGroups:
- name: scale-east2a
instanceType: t2.small
desiredCapacity: 1
maxSize: 10
availabilityZones: ["us-east-2a"]
iam:
withAddonPolicies:
autoScaler: true
labels:
nodegroup-type: stateful-east2a
instance-type: onDemand
ssh:
publicKeyName: eks-key
- name: scale-east2b
instanceType: t2.small
desiredCapacity: 1
maxSize: 10
availabilityZones: ["us-east-2b"]
iam:
withAddonPolicies:
autoScaler: true
labels:
nodegroup-type: stateful-east2b
instance-type: onDemand
ssh:
publicKeyName: eks-key
- name: scale-spot
desiredCapacity: 1
maxSize: 10
instancesDistribution:
instanceTypes: ["t2.small", "t3.small"]
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
availabilityZones: ["us-east-2a", "us-east-2b"]
iam:
withAddonPolicies:
autoScaler: true
labels:
nodegroup-type: stateless-workload
instance-type: spot
ssh:
publicKeyName: eks-key
availabilityZones: ["us-east-2a
", "us-east-2b"]
cloudWatch:
clusterLogging:
enableTypes: ["api", "audit", "authenticator"]
Example 3: Deployment Configuration
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-autoscaler
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
service: nginx
app: nginx
spec:
containers:
- image: nginx
name: test-autoscaler
resources:
limits:
cpu: 300m
memory: 512Mi
requests:
cpu: 300m
memory: 512Mi
nodeSelector:
instance-type: spot
Example 4: Role Configuration
role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: production
name: prod-viewer-role
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["get", "list", "watch"]
Example 5: Role Binding Configuration
rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: prod-viewer-binding
namespace: production
subjects:
- kind: User
name: testproduser
apiGroup: ""
roleRef:
kind: Role
name: testproduser-role
apiGroup: ""
This guide covers the essential aspects of DevOps, from foundational principles to advanced Kubernetes commands and configurations. By understanding and utilizing these concepts and tools, IT professionals can significantly enhance their DevOps practices, leading to more efficient, reliable, and secure software delivery processes.