Launching Kubernetes on AWS (EKS)
Prerequisites
βοΈ Ensure your environment is ready!
Before setting up Amazon EKS, confirm that you have the following:
- AWS Account with appropriate permissions.
- AWS CLI installed and configured.
- kubectl installed.
- eksctl installed.
Setting up Amazon EKS
# Install AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# Install eksctl
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
# Install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
π‘ Why install these tools?
AWS CLI helps manage AWS resources, kubectl is for Kubernetes management, and eksctl simplifies EKS cluster setup.
2. Create an EKS Cluster
eksctl create cluster \
--name my-eks-cluster \
--region us-west-2 \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 3 \
--managed
β οΈ Resource Costs
Remember that running a cluster incurs AWS charges. Be sure to monitor your usage to avoid unexpected bills.
aws eks update-kubeconfig --name my-eks-cluster --region us-west-2
π οΈ Validate Configuration
Run kubectl get nodes
to confirm your cluster is successfully set up.
Cluster Management
Scaling the Cluster
# Scale the node group
eksctl scale nodegroup --cluster=my-eks-cluster --name=ng-1 --nodes=3
# Auto-scaling configuration
eksctl create nodegroup \
--cluster my-eks-cluster \
--region us-west-2 \
--name ng-mixed \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 5 \
--asg-access
π Why Scale?
Scaling ensures your cluster meets changing workloads efficiently.
Deploying Applications
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: sample-app
image: nginx:latest
ports:
- containerPort: 80
π‘ Deploying Applications
Use deployments to ensure your applications are scalable and resilient.
Setting up Load Balancing
apiVersion: v1
kind: Service
metadata:
name: sample-app-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: sample-app
β οΈ Networking Costs
Load balancers incur costs. Use them wisely to optimize expenses.
Monitoring and Logging
Installing Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Setting up CloudWatch Logging
apiVersion: v1
kind: Namespace
metadata:
name: amazon-cloudwatch
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cloudwatch-agent
namespace: amazon-cloudwatch
spec:
selector:
matchLabels:
name: cloudwatch-agent
template:
metadata:
labels:
name: cloudwatch-agent
spec:
containers:
- name: cloudwatch-agent
image: amazon/cloudwatch-agent:latest
Security Best Practices
Network Policies
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
π Secure Your Cluster
Network policies prevent unauthorized communication between pods.
RBAC Configuration
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
Cost Optimization
Resource Quotas
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
π‘ Why Resource Quotas?
They ensure efficient resource usage and cost control.
Cleanup
Delete the Cluster
eksctl delete cluster --name my-eks-cluster --region us-west-2
β οΈ Data Loss Alert
Deleting the cluster will remove all associated resources. Backup data if necessary.
Troubleshooting
Common Issues and Solutions
- Node Group Issues
# Check node status
kubectl get nodes
kubectl describe node <node-name>
# Check node group health
eksctl get nodegroup --cluster my-eks-cluster
- Pod Issues
# Check pod status
kubectl get pods
kubectl describe pod <pod-name>
kubectl logs <pod-name>
- Networking Issues
# Check service status
kubectl get svc
kubectl describe svc <service-name>
# Check DNS resolution
kubectl run test-dns --image=busybox:1.28 -- nslookup kubernetes.default
π οΈ Troubleshooting Tips
Most issues can be resolved by checking logs and validating configurations.
Additional Resources
For questions or feedback, reach out:
π¨ Email: projects@briankimemia.is-a.dev
π Portfolio: Brian Kimemia
GitHub: BrianKN019
Thank you for exploring this project! Letβs innovate and build secure AWS solutions together. π
Responses are generated using AI and may contain mistakes.