karpenter-lab¶
compatibility¶
install¶
using eksdemo¶
using helm¶
- create sqs for interrupt event
 
- create service account (refer: func-create-iamserviceaccount)
- install
 echo ${KARPENTER_VERSION:=1.0.0} echo ${KARPENTER_NAMESPACE:=karpenter} echo ${CLUSTER_NAME:=ekscluster1} helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter \ --version "${KARPENTER_VERSION}" \ --namespace "${KARPENTER_NAMESPACE}" --create-namespace \ --set "settings.clusterName=${CLUSTER_NAME}" \ --set "settings.interruptionQueue=sqs-${CLUSTER_NAME}" \ --set controller.resources.requests.cpu=1 \ --set controller.resources.requests.memory=1Gi \ --set controller.resources.limits.cpu=1 \ --set controller.resources.limits.memory=1Gi \ --set serviceAccount.create=false \ --set serviceAccount.name=karpenter
helm upgrade -i -f a.value.yaml karpenter oci://public.ecr.aws/karpenter/karpenter \
    --version "${KARPENTER_VERSION}" \
    --namespace "${KARPENTER_NAMESPACE}" --create-namespace 
previous version¶
echo ${CLUSTER_NAME:=eks-upgrade-demo}
echo ${AWS_DEFAULT_REGION:=us-east-2}
export KARPENTER_VERSION=v0.27.5
export AWS_ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"
export TEMPOUT=$(mktemp)
echo $KARPENTER_VERSION $CLUSTER_NAME $AWS_DEFAULT_REGION $AWS_ACCOUNT_ID $TEMPOUT
curl -fsSL https://karpenter.sh/"${KARPENTER_VERSION}"/getting-started/getting-started-with-karpenter/cloudformation.yaml  > $TEMPOUT \
&& aws cloudformation deploy \
  --stack-name "Karpenter-${CLUSTER_NAME}" \
  --template-file "${TEMPOUT}" \
  --capabilities CAPABILITY_NAMED_IAM \
  --parameter-overrides "ClusterName=${CLUSTER_NAME}"
instance family¶
install eks-node-viewer¶
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest
sudo mv -v ~/go/bin/eks-node-viewer /usr/local/bin
scenario¶
coredns¶
kubectl get deploy -n kube-system coredns -o yaml
apiVersion: apps/v1
kind: Deployment
...
  template:
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/safe-to-evict: "false"
        karpenter.sh/do-not-evict: "true"
      creationTimestamp: null
      labels:
        eks.amazonaws.com/component: coredns
        foo: bar
        k8s-app: kube-dns
        ...
workshop¶
- https://catalog.workshops.aws/karpenter/
- https://www.eksworkshop.com/beginner/085_scaling_karpenter/
run gpu pod¶
refer¶
- Creating Kubernetes Auto Scaling Groups for Multiple Availability Zones
- https://stormforge.io/kubernetes-autoscaling/eks-karpenter/
- https://medium.com/@gajaoncloud/karpenter-mastery-nodepools-nodeclasses-for-workload-nirvana-bc89850fa934
sample¶
---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: default
spec:
  amiSelectorTerms:
    - alias: al2023@latest
  role: KarpenterNodeRole-ekscluster1
  securityGroupSelectorTerms:
  - tags:
      aws:eks:cluster-name: ekscluster1
  subnetSelectorTerms:
  - tags:
      Name: eksctl-ekscluster1-cluster/SubnetPrivate*
  tags:
    intent: apps
sample - no amd¶
https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      nodeSelector:
        kubernetes.io/arch: amd64
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/instance-cpu-manufacturer
                operator: In
                values:
                - aws
                - intel
      containers:
      - name: my-app
        image: nginx:latest


