Cómo identificar el proveedor del clúster de Kubernetes utilizando kubectl.
Trabajo en un daemonset de k8s cuya implementación requiere que determinados valores sean cambiados dependiendo del tipo de proveedor de clúster k8s (gke, eks, aks, minikube, k3s, kind, k8s autoadministrado instalado utilizando kubeadm en una vm, … etc.).
¿Cuál es la forma correcta de identificar qué tipo de proveedor de clúster k8s es, dado que kubectl/kubeconfig ya están configurados?
Una opción es usar kubectl config current-context view:
CURRENT_CONTEXT_NAME="$(kubectl config current-context view)"
PLATFORM="autoadministrado"
autoDetectEnvironment(){
if [[ -z "$CURRENT_CONTEXT_NAME" ]]; then
echo "no se ha proporcionado ninguna configuración"
return
fi
echo "Detectando el entorno automáticamente"
if [[ $CURRENT_CONTEXT_NAME =~ ^minikube.* ]]; then
PLATFORM="minikube"
elif [[ $CURRENT_CONTEXT_NAME =~ ^gke_.* ]]; then
PLATFORM="gke"
elif [[ $CURRENT_CONTEXT_NAME =~ ^kind-.* ]]; then
PLATFORM="kind"
elif [[ $CURRENT_CONTEXT_NAME =~ ^k3d-.* ]]; then
PLATFORM="k3d"
elif [[ $CURRENT_CONTEXT_NAME =~ ^kubernetes-.* ]]; then
PLATFORM="autoadministrado"
else
echo "¡No se ha configurado ningún clúster k8s o es un entorno desconocido!"
exit 2
fi
}
Sin embargo, parece un poco chapucero y seguro que no funcionará en todos los casos. Por ejemplo, para EKS no pude descubrir qué expresión regular usar.
davy.ai
Otra opción es utilizar el comando
kubectl describe node
y buscar el campoProviderID
bajo la secciónSpec
. El valor del campoProviderID
se puede utilizar para determinar el tipo de proveedor de clúster de Kubernetes.Por ejemplo, para un clúster de GKE, el
ProviderID
tendrá el formatogce: //project_id/zone/instance_id
. Para EKS, tendrá el formatoaws: /// <aws-region> / <cluster-id>
. Para AKS, tendrá el formatoazure: ///subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ContainerService/managedClusters/<cluster-name>
.Aquí hay un ejemplo de fragmento de código que se puede utilizar:
“`bash
get_cluster_provider_type() {
# Obtener el nombre del nodo del primer nodo en el clúster k8s
node_name=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}’)
}
Ejemplo de uso
cluster_provider_type=$(get_cluster_provider_type)
echo “Tipo de proveedor de clúster de Kubernetes: $cluster_provider_type”
“`