Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo habilitar Istio CNI para el complemento de malla de servicio basado en Istio en Azure Kubernetes Service (AKS). Istio CNI mejora la seguridad mediante la eliminación de la necesidad de funcionalidades de red con privilegios en las cargas de trabajo de aplicación dentro de la malla de servicio.
Información general
De forma predeterminada, la malla de servicio de Istio usa contenedores de inicialización con privilegios (istio-init) en cada pod de aplicación para configurar el redireccionamiento del tráfico de red al proxy sidecar de Envoy. Estos contenedores de inicialización requieren capacidades de NET_ADMIN y NET_RAW, que a menudo se consideran problemas de seguridad en entornos empresariales.
Istio CNI aborda este problema de seguridad trasladando las responsabilidades de configuración de la red de los contenedores init de pod individuales a un plugin CNI a nivel de clúster. Este enfoque:
-
Mejora la seguridad: quita la necesidad de funcionalidades de red con privilegios (
NET_ADMIN,NET_RAW) de las cargas de trabajo de aplicación. - Simplifica las directivas de seguridad de pods: los pods de aplicación solo requieren funcionalidades mínimas
- Mantiene la funcionalidad: proporciona las mismas funcionalidades de administración del tráfico que el enfoque tradicional del contenedor de inicialización.
Cuando Istio CNI está habilitado, los pods de aplicación usan un contenedor de inicialización mínimo istio-validation que elimina todas las capacidades en lugar del contenedor privilegiado istio-init.
Nota:
Istio CNI no es un reemplazo de Azure CNI y no interferirá con las redes normales de AKS. Es un complemento independiente diseñado para controlar la configuración de redirección de tráfico de Istio en el nivel de nodo, lo que mejora la seguridad mediante la eliminación de la necesidad de contenedores de inicialización con privilegios en pods de aplicación.
Antes de empezar
Instale el CLI de Azure versión 2.86.0 o posterior. Puede ejecutar
az --versionpara comprobar la versión. Para la instalación o la actualización, consulte Instalación de la CLI de Azure.Debe tener un clúster de AKS con la extensión de malla de servicio basada en Istio habilitada. Si no tiene esta configuración, consulte Implementación del complemento de malla de servicio basado en Istio para Azure Kubernetes Service.
Asegúrese de que la malla de servicio de Istio usa la revisión
asm-1-25o posterior. Puede comprobar la revisión actual con:az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
Establecimiento de variables de entorno
export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>
Habilitar Istio CNI
Habilitar Istio CNI en una nueva instalación de malla
Puede habilitar Istio CNI al activar el complemento de la malla de servicio especificando el parámetro --proxy-redirection-mechanism.
az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --proxy-redirection-mechanism CNIChaining
Habilitación de Istio CNI en una instalación de malla existente
Si ya tiene habilitado el add-on de malla de servicio Istio, puede cambiar a Istio CNI mediante el siguiente comando:
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism CNIChaining
Nota:
Los pods existentes no cambiarán automáticamente al istio-validation contenedor de inicialización. Reinicie las implementaciones después de habilitar Istio CNI para que los pods recojan el cambio (por ejemplo, kubectl rollout restart deployment/<name>).
Comprobación de que Istio CNI está habilitado
Use az aks get-credentials para obtener las credenciales del clúster de AKS:
az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Después de habilitar Istio CNI, compruebe la instalación comprobando que el DaemonSet de CNI se está ejecutando:
kubectl get daemonset -n aks-istio-system
Debería ver el daemonSet de Istio CNI en ejecución:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
azure-service-mesh-istio-cni-addon-node 3 3 3 3 3 kubernetes.io/os=linux 94s
Implementación de cargas de trabajo y comprobación del comportamiento
Para comprobar la mejora de la seguridad, puede implementar la aplicación de ejemplo bookinfo y comprobar que las cargas de trabajo usan el contenedor init seguro istio-validation en lugar del contenedor con privilegios istio-init .
Implementación de una aplicación de ejemplo
En primer lugar, habilite la inyección de sidecar para el espacio de nombres predeterminado:
# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)
# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}
Implemente la aplicación de ejemplo bookinfo:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
Comprobación del uso seguro del contenedor de inicialización
Compruebe que los pods implementados usan el contenedor init seguro istio-validation en lugar de istio-init:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
La salida esperada debe mostrarse istio-validation como el contenedor de inicialización con funcionalidades eliminadas:
details-v1-799dc5d847-7x9gl istio-validation {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj istio-validation {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42 istio-validation {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg istio-validation {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m istio-validation {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt istio-validation {"drop":["ALL"]}
También puede comprobar el CÓDIGO YAML de un pod específico para comprobar el contexto de seguridad:
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"
La salida debe mostrar que el istio-validation contenedor de inicialización no tiene funcionalidades con privilegios:
initContainers:
- args:
…
name: istio-validation
…
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
runAsGroup: 1337
runAsNonRoot: true
runAsUser: 1337
Deshabilitar Istio CNI
Para deshabilitar Istio CNI y volver al uso de contenedores de inicialización tradicionales, use el siguiente comando:
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism InitContainers
Después de deshabilitar Istio CNI:
El DaemonSet de CNI se quitará:
kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-systemSalida esperada (sin el DaemonSet de CNI):
Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not foundLas nuevas cargas de trabajo usarán el contenedor de inicialización tradicional
istio-initcon funcionalidades de red. Reinicie todas las implementaciones existentes para aplicar el cambio:kubectl rollout restart deployment/details-v1 kubectl rollout restart deployment/productpage-v1 kubectl rollout restart deployment/ratings-v1 kubectl rollout restart deployment/reviews-v1 kubectl rollout restart deployment/reviews-v2 kubectl rollout restart deployment/reviews-v3Compruebe el nombre y las funcionalidades del contenedor de inicialización:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'La salida esperada debe mostrarse
istio-initcon funcionalidades de red:details-v1-57bc58c559-722v8 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} productpage-v1-7bb64f657c-jw6gs istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} ratings-v1-57d5594c75-4zd49 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v1-7fd8f9cd59-mdcf9 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v2-7b8bdc9cdf-k9qgb istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v3-588854d9d7-s2f7j istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}