Soporte para Clústeres Kubernetes de Doble Pila
Soporte experimental para Clústeres Kubernetes de Doble Pila.
Durante el último año, Intel y F5 han colaborado en un esfuerzo para brindar soporte para Redes de Doble Pila de Kubernetes a Istio.
Antecedentes
Este proceso nos ha llevado más tiempo del previsto y continuamos teniendo trabajo por hacer. El equipo inicialmente comenzó con un diseño basado en una implementación de referencia de F5. El diseño llevó a un RFC que nos hizo reexaminar nuestro enfoque. En particular, existían preocupaciones sobre problemas de memoria y rendimiento que la comunidad quería abordar antes de la implementación. El diseño original tuvo que duplicar la configuración de Envoy para listeners, clusters, rutas y endpoints. Dado que muchas personas ya experimentan problemas de consumo de memoria y CPU de Envoy, los comentarios iniciales querían que reevaluáramos completamente este enfoque. Muchos proxies manejan transparentemente el tráfico saliente de doble pila independientemente de cómo se originó el tráfico. Gran parte de los comentarios más tempranos fue implementar el mismo comportamiento en Istio y Envoy.
Redefiniendo el soporte de Doble Pila
Gran parte de los comentarios proporcionados por la comunidad para el RFC original fue actualizar Envoy para soportar mejor los casos de uso de doble pila internamente en lugar de soportarlo dentro de Istio. Esto nos ha llevado a un nuevo diseño donde hemos tomado las lecciones aprendidas así como los comentarios y las hemos aplicado para ajustarse a un diseño simplificado.
Soporte para Doble Pila en Istio 1.17
Hemos trabajado con la comunidad de Envoy para resolver numerosas preocupaciones, lo cual es una razón por la cual la habilitación de doble pila nos ha tomado un tiempo implementar. Hemos implementado familia de IP coincidente para listener saliente y soportado múltiples direcciones por listener. Alex Xu también ha estado trabajando fervientemente para resolver problemas pendientes de larga data, con la capacidad de que Envoy tenga una forma más inteligente de elegir endpoints para doble pila. Algunas de estas mejoras a Envoy, como la capacidad de habilitar opciones de socket en múltiples direcciones, han llegado en el lanzamiento de Istio 1.17 (p. ej. direcciones de origen adicionales en clusters entrantes).
Los cambios de API de Envoy realizados por el equipo se pueden encontrar en su sitio en Direcciones de listener y bind config. Asegurarnos de que podamos tener soporte adecuado tanto en la conexión downstream como upstream para Envoy es importante para realizar el soporte de doble pila.
En total, el equipo ha enviado más de una decena de PRs a Envoy y está trabajando en al menos media docena más para facilitar la adopción de doble pila de Envoy para Istio.
Mientras tanto, en el lado de Istio puedes seguir el progreso en Issue #40394. El progreso se ha ralentizado un poco últimamente mientras continuamos trabajando con Envoy en varios temas, sin embargo, estamos felices de ¡anunciar soporte experimental para doble pila en Istio 1.17!
Un experimento rápido usando Doble Pila
Habilita el soporte experimental de doble pila en Istio 1.17.0+ con lo siguiente:
$ istioctl install -y -f - <<EOF apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: defaultConfig: proxyMetadata: ISTIO_DUAL_STACK: "true" values: pilot: env: ISTIO_DUAL_STACK: "true" EOFCrea tres namespaces:
dual-stack:tcp-echoescuchará tanto en una dirección IPv4 como IPv6.ipv4:tcp-echoescuchará solo en una dirección IPv4.ipv6:tcp-echoescuchará solo en una dirección IPv6.
$ kubectl create namespace dual-stack $ kubectl create namespace ipv4 $ kubectl create namespace ipv6Habilita la inyección de sidecar en todos esos namespaces así como en el namespace default:
$ kubectl label --overwrite namespace default istio-injection=enabled $ kubectl label --overwrite namespace dual-stack istio-injection=enabled $ kubectl label --overwrite namespace ipv4 istio-injection=enabled $ kubectl label --overwrite namespace ipv6 istio-injection=enabledCrea deployments
tcp-echoen los namespaces:$ kubectl apply --namespace dual-stack -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/tcp-echo/tcp-echo-dual-stack.yaml $ kubectl apply --namespace ipv4 -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/tcp-echo/tcp-echo-ipv4.yaml $ kubectl apply --namespace ipv6 -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/tcp-echo/tcp-echo-ipv6.yamlCrea deployment sleep en el namespace default:
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.29/samples/sleep/sleep.yamlVerifica el tráfico:
$ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo dualstack | nc tcp-echo.dual-stack 9000" hello dualstack $ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv4 | nc tcp-echo.ipv4 9000" hello ipv4 $ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv6 | nc tcp-echo.ipv6 9000" hello ipv6
¡Ahora puedes experimentar con servicios de doble pila en tu entorno!
Cambios importantes en Listeners y Endpoints
Para el experimento anterior, notarás que se hacen cambios en listeners y rutas:
$ istioctl proxy-config listeners "$(kubectl get pod -n dual-stack -l app=tcp-echo -o jsonpath='{.items[0].metadata.name}')" -n dual-stack --port 9000Verás que los listeners ahora están vinculados a múltiples direcciones, pero solo para servicios de doble pila. Otros servicios solo estarán escuchando en una sola dirección IP.
"name": "fd00:10:96::f9fc_9000",
"address": {
"socketAddress": {
"address": "fd00:10:96::f9fc",
"portValue": 9000
}
},
"additionalAddresses": [
{
"address": {
"socketAddress": {
"address": "10.96.106.11",
"portValue": 9000
}
}
}
],Las direcciones entrantes virtuales ahora también están configuradas para escuchar tanto en 0.0.0.0 como en [::].
"name": "virtualInbound",
"address": {
"socketAddress": {
"address": "0.0.0.0",
"portValue": 15006
}
},
"additionalAddresses": [
{
"address": {
"socketAddress": {
"address": "::",
"portValue": 15006
}
}
}
],Los endpoints de Envoy ahora están configurados para enrutar tanto a IPv4 como IPv6:
$ istioctl proxy-config endpoints "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" --port 9000
ENDPOINT STATUS OUTLIER CHECK CLUSTER
10.244.0.19:9000 HEALTHY OK outbound|9000||tcp-echo.ipv4.svc.cluster.local
10.244.0.26:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local
fd00:10:244::1a:9000 HEALTHY OK outbound|9000||tcp-echo.dual-stack.svc.cluster.local
fd00:10:244::18:9000 HEALTHY OK outbound|9000||tcp-echo.ipv6.svc.cluster.localParticipa
Queda mucho trabajo por hacer, y eres bienvenido a ayudarnos con las tareas restantes necesarias para que el soporte de doble pila llegue a Alpha aquí.
Por ejemplo, Iris Ding (Intel) y Li Chun (Intel) ya están trabajando con la comunidad para obtener la redirección de tráfico de red para ambient, y esperamos que ambient soporte doble pila para su próximo lanzamiento alpha en Istio 1.18.
Nos encantaría recibir tus comentarios y si estás ansioso por trabajar con nosotros, pasa por nuestro canal de slack, #dual-stack dentro del Istio Slack.
¡Gracias al equipo que ha trabajado en doble pila de Istio!
- Intel: Steve Zhang, Alex Xu, Iris Ding
- F5: Jacob Delgado
- Yingchun Cai (anteriormente de F5)