Nota : (14 de octubre de 2021) Linode ha lanzado el AutoScaler de Kubernetes a todos los LKE. Si bien este autoscalador todavía tiene algo de uso (particularmente si desea autoscala agresivamente y de antemano), ya no se mantendrá activamente.
===
Esta es una utilidad de autoscalaje simple para escalar horizontalmente los linodos en un grupo de clúster LKE basado en la memoria o el uso de la CPU. Esto significa efectivamente que puede usar el autoscalado de la cápsula horizontal de Kubernetes para escalar sus vainas y esta utilidad para ampliar sus linodos, por lo que puede configurar esto y dejar que su clúster aumente o hacia abajo según sea necesario.
Cada instancia de esta utilidad será de forma automática en función de la memoria o la CPU. Para usar ambos, puede implementar 2 instancias de esta utilidad (generalmente 1 es suficiente).
Está totalmente documentado (pero escrito en PHP) y tiene una huella de recursos bajos, por lo que puede implementarla localmente o en el clúster en sí.
La imagen para esta utilidad se publica @ Docker Hub como Meezaan/Linode-K8S-AutoScaler (https://hub.docker.com/r/meezaan/linode-k8s-autoscaler).
La última etiqueta siempre tiene el último código. Además, las etiquetas de Docker Hub están vinculadas a las etiquetas en este repositorio Git como lanzamientos.
El contenedor Docker toma toda su configuración a través de las variables de entorno. Aquí hay una lista de lo que hace cada uno:
| Nombre de la variable de entorno | Descripción |
|---|---|
| Linode_personal_access_token | Su token de acceso personal con alcance Lke |
| Linode_lke_cluster_id | La identificación del clúster LKE a AutoScale |
| Linode_lke_cluster_pool_id | La ID de grupo de nodos dentro del clúster LKE a AutoScale |
| Linode_lke_cluster_pool_minimum_nodes | Los nodos mínimos para mantener en el clúster. El clúster no se escalará debajo de esto. |
| Autoscale_trigger | 'CPU' o 'Memoria'. El valor predeterminado a Memmory. |
| Autoscale_trigger_type | 'solicitado' o 'usado'. Predeterminado se solicitó. Esto le dice al AutoScaler que use la memoria solicitada o la CPU utilizada actualmente para escalar o bajar si incumple el umbral. |
| AutoScale_UP_PERCENTAGE | En qué porcentaje de 'CPU' o 'Memoria' ampliar el grupo de nodos. Ejemplo: 65 |
| AutoScale_Down_percentage | A qué porcentaje de 'CPU' o 'Memoria' escalar el grupo de nodos. Ejemplo: 40 |
| AutoScale_Resource_request_up_percentage | En qué porcentaje de 'CPU' o 'Memoria' de la solicitada / disponible para escalar el clúster. Valor predeterminado: 80 |
| AutoScale_Resource_request_down_percentage | En qué porcentaje de 'CPU' o 'Memoria' de la solicitada / disponible para escalar el clúster. Valor predeterminado: 70 |
| AutoScale_Query_interval | Cuántos segundos esperar antes de cada llamada a la API de Kubernetes para verificar la CPU y el uso de la memoria. Ejemplo: 10 |
| AutoScale_threshold_Count | Después de cuántas coincidencias consecutivas de AutoScale_UP_PERCECTAGE o AUTOSCALE_DOWN_PORTENTAGE para escalar el clúster hacia arriba o hacia abajo. |
| Autoscale_number_of_nodes | Cuántos nodos agregar a la vez al escalar el clúster. Ejemplo: 1 o 2 o 3 o n |
| Autoscale_wait_time_after_scaling | Cuántos segundos esperar después de escalar o bajar para comenzar a verificar la CPU y la memoria. Esto debe establecerse para darle al clúster el tiempo suficiente para ajustarse con el número actualizado de nodos. Ejemplo: 150 |
Para comprender lo anterior, suponiendo que hemos establecido los siguientes valores.
Con esta configuración, la utilidad AutoScaler consultará la API Kuberenetes cada 10 segundos. Si con 3 llamadas consecutivas a la API (que significa efectivamente durante 30 segundos), la memoria solicitada excede el 80% de la memoria total disponible en el clúster, se agregarán 2 nodos más al grupo de nodos especificado. La utilidad esperará 180 segundos y luego comenzará a consultar la API cada 10 segundos nuevamente.
Si con 3 llamadas consecutivas a la API (que significa efectivamente durante 30 segundos), la memoria solicitada es inferior al 70% de la memoria total disponible en el clúster, se eliminará 1 nodo ( los nodos siempre se eliminan uno a la vez para garantizar que no se quede sin capacidad de manera repentina ) del grupo de nodos especificado. La utilidad esperará 180 segundos y luego comenzará a consultar la API cada 10 segundos nuevamente.
El mismo ejemplo, con un tipo de activación diferente.
Con esta configuración, la utilidad AutoScaler consultará la API Kuberenetes cada 10 segundos. Si con 3 llamadas consecutivas a la API (que significa efectivamente durante 30 segundos), el uso de la memoria es superior al 65% de la memoria total disponible en el clúster, se agregarán 2 nodos más al grupo de nodos especificado. La utilidad esperará 180 segundos y luego comenzará a consultar la API cada 10 segundos nuevamente.
Si con 3 llamadas consecutivas a la API (que significa efectivamente durante 30 segundos), el uso de la memoria es inferior al 30% de la memoria total disponible en el clúster, se eliminará 1 nodo ( los nodos siempre se eliminan uno a la vez para garantizar que no se quede sin capacidad de manera repentina ) del grupo de nodos especificado. La utilidad esperará 180 segundos y luego comenzará a consultar la API cada 10 segundos nuevamente.
Deberá configurar la imagen Docker con variables ENV y la configuración Kubectl.
Para ejecutar localmente:
docker run -v ~/.kube/config:/root/.kube/config
-e LINODE_PERSONAL_ACCCESS_TOKEN='xxxx'
-e LINODE_LKE_CLUSTER_ID='xxxx'
-e LINODE_LKE_CLUSTER_POOL_ID='xxxx'
-e LINODE_LKE_CLUSTER_POOL_MINIMUM_NODES='3'
-e AUTOSCALE_TRIGGER='cpu'
-e AUTOSCALE_UP_PERCENTAGE='60'
-e AUTOSCALE_DOWN_PERCENTAGE='30'
-e AUTOSCALE_RESOURCE_REQUEST_UP_PERCENTAGE='70'
-e AUTOSCALE_RESOURCE_REQUEST_DOWN_PERCENTAGE='70'
-e AUTOSCALE_QUERY_INTERVAL='10'
-e AUTOSCALE_THRESHOLD_COUNT='3'
-e AUTOSCALE_NUMBER_OF_NODES='1'
-e AUTOSCALE_WAIT_TIME_AFTER_SCALING='180' meezaan/linode-k8s-autoscaler
Para la producción, puede construir una imagen de Docker privado y presionar un archivo de configuración Kubectl con las credenciales de una cuenta de servicio a la imagen. Entonces, su Dockerfile puede verse algo así como:
FROM meezaan/linode-k8s-autoscaler
COPY configfile /root/.kube/config
Una vez que haya construido la imagen (y supongamos que se llama SUITHAPACE/K8S-AUTOscaler: más reciente), puede implementarla con el siguiente manifiesto:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-autoscaler
namespace: name-of-namespace ####### Change this to the actual namespace
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: k8s-autoscale
template:
metadata:
labels:
app: k8s-autoscale
spec:
imagePullSecrets:
- name: regcred ####### Docker registry credentials secret
containers:
- name: k8s-autoscale
image: yourspace/k8s-autoscaler:latest ####### CHANGE THIS TO YOUR ACTUAL DOCKER IMAGE
env:
- name: LINODE_PERSONAL_ACCCESS_TOKEN
valueFrom:
secretKeyRef:
name: linode-personal-access-token-k8s-autoscaler ####### LINODE PERSONAL ACCESS TOKEN SECRET
key: token
- name: LINODE_LKE_CLUSTER_ID
value: ""
- name: LINODE_LKE_CLUSTER_POOL_ID
value: ""
- name: AUTOSCALE_TRIGGER
value: "memory"
- name: AUTOSCALE_UP_PERCENTAGE
value: "60"
- name: AUTOSCALE_DOWN_PERCENTAGE
value: "30"
- name: AUTOSCALE_QUERY_INTERVAL
value: "30"
- name: AUTOSCALE_THRESHOLD_COUNT
value: "3"
- name: AUTOSCALE_NUMBER_OF_NODES
value: "1"
- name: AUTOSCALE_WAIT_TIME_AFTER_SCALING
value: "150"
resources:
requests:
memory: 32Mi
limits:
memory: 32Mi
El manifiesto anterior utiliza un secreto para su token de acceso personal de Linode y credenciales de registro de Docker.
Necesitará crearlos.
El POD anterior toma 0.01 CPU y 15 MB de memoria en ejecutarse. La memoria puede aumentar en función del tamaño de la respuesta de la API, pero devuelve JSON, por lo que incluso si tiene más de 100 servidores en su clúster, todavía solo está mirando 30 MB más o menos.
Esta utilidad no está afiliada a Linode.