Karpenter自动扩容缩容Node

Karpenter现在已经部署完毕,我们来探索它是如何管理node的生命周期

运行以下命令,创建一个deployement:

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate
spec:
  replicas: 0
  selector:
    matchLabels:
      app: inflate
  template:
    metadata:
      labels:
        app: inflate
    spec:
      terminationGracePeriodSeconds: 0
      containers:
        - name: inflate
          image: public.ecr.aws/eks-distro/kubernetes/pause:3.7
          resources:
            requests:
              cpu: 1
EOF

将replica的数量扩容为5,观察机器数量的变化:

kubectl scale deployment inflate --replicas 5
kubectl logs -f -n karpenter -l app.kubernetes.io/name=karpenter -c controller

由于上面的pod每个都需要1核CPU,创建出5个pod出来,原来集群的容量不够,就会触发karpenter扩容节点。

karpenter先计算出来100种满足条件的机型,然后直接交给ec2-fleet,让它来决定开出哪种机器。最终开出来了c7a.xlarge机型:

image-20231026221341587

在这个过程中,观察kube-ops-view的页面,可以看到整个过程,首先检查到有3个pending pod(另外两个部署到了原来两个节点上):

image-20231026221150798

karpenter开出新的机器(下面两个是daemonset pod):

image-20231026221207714

三个pending pod部署到新的节点上面:

image-20231026221218377

在EC2控制台上也能看到新开出来的节点:

image-20231026221428219

缩容测试

将replica的数量重新调回0:

kubectl scale deployment -n workshop inflate --replicas 0

此时karpenter检查到有节点上pod数量为空,触发缩容,将原来扩展出来的节点下掉:

image-20231026221542012

查看karpenter日志:

kubectl logs -f -n karpenter -l app.kubernetes.io/name=karpenter -c controller

日志如下,karpenter确认要删除的节点后,触发termination:

image-20231026221600825