Cluster
Cluster is the component of Common in charge of providing a company-wide Kubernetes Cluster.
Public Oath
Fluid Attacks will constantly look for new stack that simplifies serving applications to the Internet in a secure and automated manner.
Architecture
- The module is managed as code using Terraform.
- We have one Kubernetes cluster
called
common-k8s
that is shared by all the components. - The cluster is hosted on AWS.
- The cluster is divided into namespaces,
which keep resources in isolation from other namespaces.
- The
default
namespace is unused, we try to put things into a namespace appropriate to the product. - The
dev
namespace currently holds the ephemeral environments of Integrates. - The
prod-integrates
namespace holds the production deployment of Integrates, and a Celery jobs server. - The
kube-system
namespace holds cluster-wide deployments for, load balancer, DNS, node termination handler, cloudflared, observability and autoscaler. - Other
kube-*
namespaces exist, but they are not used for anything at the moment.
- The
- Every namespace runs in a specific worker group whose physical machine instances run on EC2.
- The cluster spawns machines on all availability zones within
us-east-1
for maximum spot availability. - The cluster supports autoscaling based on several metrics like cpu consumption, memory consumption and queue size.
- It provides observability tools for debugging.
- It creates AWS application load balancers and Cloudflare DNS records for ingress resources.
- It supports a Cloudflare ZTNA tunnel that allows developers to access the AWS VPC via Cloudflare WARP.
- Developers can access the cluster via Okta for debugging.
Contributing
Please read the contributing page first.
General
- Any changes to the cluster infrastructure and configuration must be done via Merge Requests.
- Any changes related to the Platform (deployments, autoscaling, ingress…) for both development and production must be done via Merge Requests.
Components
Our cluster implements:
- AWS EKS Terraform module for declaring the cluster as code using Terraform.
- AWS Load Balancer Controller for automatically initializing AWS load balancers when declaring ingress resources.
- AWS Kubernetes Autoscaler for automatically scaling the cluster size based on resource assignation.
- ExternalDNS for automatically setting DNS records when declaring ingress resources.
- Kubernetes Metrics Server for automatically scaling deployments like production Platform based on application load (CPU, Memory, custom metrics).
- New Relic for monitoring both production Platform and general infrastructure.
Debugging
Connect to cluster
In order to connect to the Kubernetes Cluster, you must:
- Login as an Integrates developer using this guide.
- Install kubectl and aws-cli with
nix-env -i awscli kubectl
. - Select cluster by running
aws eks update-kubeconfig --name common-k8s --region us-east-1
. - Run
kubectl get node
.
Your input should be similar to this:
Common commands
Most commands have the following syntax: kubectl <action> <resource> -n <namespace>
- Common actions are:
get
,describe
,logs
,exec
andedit
. - Common resources are:
pod
,node
,deployment
,ingress
,hpa
. - Common namespaces are:
development
,production
andkube-system
. Additionally, the-A
flag executes<action>
for all namespaces.
Some basic examples are:
Command | Example | Description |
---|---|---|
kubectl get pod -A | N/A | Get all running pods |
kubectl get node -A | N/A | Get all cluster nodes |
kubectl get deployment -A | N/A | Get all cluster deployments |
kubectl get hpa -A | N/A | Get all autoscaling policies |
kubectl get namespace | N/A | Get all cluster namespaces |
Some more complex examples are:
Command | Example | Description |
---|---|---|
kubectl describe pod -n <namespace> <pod> | kubectl describe pod -n development app-dsalazaratfluid-7c485cf565-w9gwg | Describe pod configurations |
kubectl logs -n <namespace> <pod> -c <container> | kubectl logs -n development app-dsalazaratfluid-7c485cf565-w9gwg -c app | Get container logs from a pod |
kubectl exec -it -n <namespace> <pod> -c <container> -- <command> | kubectl exec -it -n development app-dsalazaratfluid-7c485cf565-w9gwg -c app -- bash | Access a container within pod |
kubectl edit deployment -n <namespace> <deployment> | kubectl edit deployment -n development integrates-dsalazaratfluid | Edit a specific deployment |