Skip to content

Commit e3c0e0e

Browse files
authored
Merge pull request #45609 from eduardoSalazarCarrillo/endpoint-slices-es
[es] Added concepts/services-networking/endpoint-slices.md to Spanish
2 parents d130f32 + 0878847 commit e3c0e0e

File tree

1 file changed

+192
-0
lines changed

1 file changed

+192
-0
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
---
2+
reviewers:
3+
- freehan
4+
title: EndpointSlices
5+
content_type: concept
6+
weight: 60
7+
description: >-
8+
La API de EndpointSlice es el mecanismo que Kubernetes utiliza para permitir que tu Servicio
9+
escale para manejar un gran número de backends, y permite que el clúster actualice tu lista de
10+
11+
backends saludables eficientemente.
12+
---
13+
14+
<!-- overview -->
15+
16+
{{< feature-state for_k8s_version="v1.21" state="stable" >}}
17+
18+
La API de _EndpointSlice_ de Kubernetes proporciona una forma de rastrear los endpoints de red
19+
dentro de un clúster Kubernetes. EndpointSlices ofrece una alternativa más escalable
20+
y extensible a [Endpoints](/docs/concepts/services-networking/service/#endpoints).
21+
22+
23+
<!-- body -->
24+
25+
## EndpointSlice API {#recurso-endpointslice}
26+
27+
En Kubernetes, un EndpointSlice contiene referencias a un conjunto de endpoints de red. El plano de control crea automáticamente EndpointSlices para cualquier Servicio de Kubernetes que tenga especificado un {{< glossary_tooltip text="selector" term_id="selector" >}}. Estos EndpointSlices incluyen referencias a todos los Pods que coinciden con el selector de Servicio. Los EndpointSlices agrupan los endpoints de la red mediante combinaciones únicas de protocolo, número de puerto y nombre de Servicio.
28+
29+
El nombre de un objeto EndpointSlice debe ser un
30+
[nombre de subdominio DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names)
31+
válido.
32+
33+
A modo de ejemplo, a continuación se muestra un objeto EndpointSlice de ejemplo, propiedad del Servicio `example`
34+
de Kubernetes.
35+
36+
```yaml
37+
apiVersion: discovery.k8s.io/v1
38+
kind: EndpointSlice
39+
metadata:
40+
name: example-abc
41+
labels:
42+
kubernetes.io/service-name: example
43+
addressType: IPv4
44+
ports:
45+
- name: http
46+
protocol: TCP
47+
port: 80
48+
endpoints:
49+
- addresses:
50+
- "10.1.2.3"
51+
conditions:
52+
ready: true
53+
hostname: pod-1
54+
nodeName: node-1
55+
zone: us-west2-a
56+
```
57+
58+
Por defecto, el plano de control crea y gestiona EndpointSlices para que no tengan más de 100 endpoints cada una. Puedes configurar esto con la bandera de funcionalidad
59+
`--max-endpoints-per-slice`
60+
{{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}
61+
hasta un máximo de 1000.
62+
63+
64+
EndpointSlices puede actuar como la fuente de verdad
65+
{{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}} sobre cómo enrutar el tráfico interno.
66+
67+
### Tipos de dirección
68+
69+
EndpointSlices admite tres tipos de direcciones:
70+
71+
* IPv4
72+
* IPv6
73+
* FQDN (Fully Qualified Domain Name)
74+
75+
Cada objeto `EndpointSlice` representa un tipo de dirección IP específico. Si tienes un servicio disponible a través de IPv4 e IPv6, habrá al menos dos objetos `EndpointSlice` (uno para IPv4 y otro para IPv6).
76+
77+
### Condiciones
78+
79+
La API EndpointSlice almacena condiciones sobre los endpoints que pueden ser útiles para los consumidores.
80+
Las tres condiciones son `ready`, `serving` y `terminating`.
81+
82+
#### Ready
83+
84+
`ready` es una condición que corresponde a la condición `Ready` de un Pod. Un Pod en ejecución con la condición `Ready` establecida a `True` debería tener esta condición EndpointSlice también establecida a `true`. Por razones de compatibilidad, `ready` NUNCA es `true` cuando un Pod está terminando. Los consumidores deben referirse a la condición `serving` para inspeccionar la disponibilidad de los Pods que están terminando. La única excepción a esta regla son los servicios con `spec.publishNotReadyAddresses` a `true`. Los endpoints de estos servicios siempre tendrán la condición `ready` a `true`.
85+
86+
#### Serving
87+
88+
{{< feature-state for_k8s_version="v1.26" state="stable" >}}
89+
90+
La condición `serving` es casi idéntica a la condición `ready`. La diferencia es que los consumidores de la API EndpointSlice deben comprobar la condición `serving` si se preocupan por la disponibilidad del pod mientras el pod también está terminando.
91+
92+
{{< note >}}
93+
94+
Aunque `serving` es casi idéntico a `ready`, se añadió para evitar romper el significado existente de `ready`. Podría ser inesperado para los clientes existentes si `ready` pudiera ser `true` para los endpoints de terminación, ya que históricamente los endpoints de terminación nunca se incluyeron en la API Endpoints o EndpointSlice para empezar. Por esta razón, `ready` es _siempre_ `false` para los Endpoints que terminan, y se ha añadido una nueva condición `serving` en la v1.20 para que los clientes puedan realizar un seguimiento de la disponibilidad de los pods que terminan independientemente de la semántica existente para `ready`.
95+
96+
{{< /note >}}
97+
98+
#### Terminating
99+
100+
{{< feature-state for_k8s_version="v1.22" state="beta" >}}
101+
102+
`Terminating` es una condición que indica si un endpoint está terminando. En el caso de los pods, se trata de cualquier pod que tenga establecida una marca de tiempo de borrado.
103+
104+
### Información sobre topología {#topology}
105+
106+
Cada endpoint dentro de un EndpointSlice puede contener información topológica relevante. La información de topología incluye la ubicación del endpoint e información sobre el Nodo y la zona correspondientes. Estos están disponibles en los siguientes campos por endpoint en EndpointSlices:
107+
108+
* `nodeName` - El nombre del Nodo en el que se encuentra este endpoint.
109+
* `zone` - La zona en la que se encuentra este endpoint.
110+
111+
112+
{{< note >}}
113+
En la API v1, el endpoint `topology` se eliminó en favor de los campos dedicados `nodeName` y `zone`.
114+
115+
La configuración de campos de topología arbitrarios en el campo `endpoint` de un recurso `EndpointSlice` ha quedado obsoleta y no se admite en la API v1. En su lugar, la API v1 permite establecer campos individuales `nodeName` y `zone`. Estos campos se traducen automáticamente entre versiones de la API. Por ejemplo, el valor de la clave "topology.kubernetes.io/zone" en el campo `topology` de la API v1beta1 es accesible como campo `zone` en la API v1.
116+
{{< /note >}}
117+
118+
### Administración
119+
120+
En la mayoría de los casos, el plano de control (concretamente, el endpoint slice {{< glossary_tooltip text="controller" term_id="controller" >}}) crea y gestiona objetos EndpointSlice. Existe una variedad de otros casos de uso para EndpointSlices, como implementaciones de servicios Mesh, que podrían dar lugar a que otras entidades o controladores gestionen conjuntos adicionales de EndpointSlices.
121+
122+
Para garantizar que varias entidades puedan gestionar EndpointSlices sin interferir unas con otras, Kubernetes define el parámetro
123+
{{< glossary_tooltip term_id="label" text="label" >}}
124+
`endpointslice.kubernetes.io/managed-by`, que indica la entidad que gestiona un EndpointSlice.
125+
El controlador de endpoint slice establece `endpointslice-controller.k8s.io` como valor para esta etiqueta en todos los EndpointSlices que gestiona. Otras entidades que gestionen EndpointSlices también deben establecer un valor único para esta etiqueta.
126+
127+
### Propiedad
128+
129+
En la mayoría de los casos de uso, los EndpointSlices son propiedad del Servicio para el que el objeto EndpointSlices rastree los endpoints. Esta propiedad se indica mediante una referencia de propietario en cada EndpointSlice, así como una etiqueta `kubernetes.io/service-name` que permite búsquedas sencillas de todos los EndpointSlices que pertenecen a un Servicio.
130+
131+
### Replicación de EndpointSlice
132+
133+
En algunos casos, las aplicaciones crean recursos Endpoints personalizados. Para garantizar que estas aplicaciones no tengan que escribir simultáneamente en recursos Endpoints y EndpointSlice, el plano de control del clúster refleja la mayoría de los recursos Endpoints en los EndpointSlices correspondientes.
134+
135+
136+
El plano de control refleja los recursos de los Endpoints a menos que:
137+
* El recurso Endpoints tenga una etiqueta `endpointslice.kubernetes.io/skip-mirror` con el valor en `true`.
138+
* El recurso Endpoints tenga una anotación `control-plane.alpha.kubernetes.io/leader`.
139+
* El recurso Service correspondiente no exista.
140+
* El recurso Service correspondiente tiene un selector no nulo.
141+
142+
Los recursos Endpoints individuales pueden traducirse en múltiples EndpointSlices. Esto ocurrirá si un recurso Endpoints tiene
143+
múltiples subconjuntos o incluye endpoints con múltiples familias IP (IPv4 e IPv6). Se reflejará un máximo de 1000 direcciones
144+
por subconjunto en EndpointSlices.
145+
146+
### Distribución de EndpointSlices
147+
148+
Cada EndpointSlice tiene un conjunto de puertos que se aplica a todos los endpoints dentro del recurso. Cuando se utilizan puertos con nombre para un Servicio, los Pods pueden terminar con diferentes números de puerto de destino para el mismo puerto con nombre, requiriendo diferentes EndpointSlices. Esto es similar a la lógica detrás de cómo se agrupan los subconjuntos con Endpoints.
149+
150+
El plano de control intenta llenar los EndpointSlices tanto como sea posible, pero no los reequilibra activamente. La lógica es bastante sencilla:
151+
152+
1. Iterar a través de los EndpointSlices existentes, eliminar los endpoints que ya no se deseen y actualizar los endpoints coincidentes que hayan cambiado.
153+
2. Recorrer los EndpointSlices que han sido modificados en el primer paso y rellenarlos con los nuevos endpoints necesarios.
154+
3. Si aún quedan nuevos endpoints por añadir, intente encajarlos en un slice que no se haya modificado previamente y/o cree otros nuevos.
155+
156+
Es importante destacar que el tercer paso prioriza limitar las actualizaciones de EndpointSlice sobre una distribución perfectamente completa de EndpointSlices. Por ejemplo, si hay 10 nuevos endpoints que añadir y 2 EndpointSlices con espacio para 5 endpoints más cada uno, este enfoque creará un nuevo EndpointSlice en lugar de llenar los 2 EndpointSlices existentes. En otras palabras, es preferible una única creación de EndpointSlice que múltiples actualizaciones de EndpointSlice.
157+
158+
Con kube-proxy ejecutándose en cada Nodo y vigilando los EndpointSlices, cada cambio en un EndpointSlice se vuelve relativamente caro ya que será transmitido a cada Nodo del clúster. Este enfoque pretende limitar el número de cambios que necesitan ser enviados a cada Nodo, incluso si puede resultar con múltiples EndpointSlices que no están llenos.
159+
160+
161+
En la práctica, esta distribución menos que ideal debería ser poco frecuente. La mayoría de los cambios procesados por el controlador EndpointSlice serán lo suficientemente pequeños como para caber en un EndpointSlice existente, y si no, es probable que pronto sea necesario un nuevo EndpointSlice de todos modos. Las actualizaciones continuas de los Deployments también proporcionan un reempaquetado natural de los EndpointSlices con todos los Pods y sus correspondientes endpoints siendo reemplazados.
162+
163+
164+
### Endpoints duplicados
165+
166+
Debido a la naturaleza de los cambios de EndpointSlice, los endpoints pueden estar representados en más de un EndpointSlice al mismo tiempo. Esto ocurre de forma natural, ya que los cambios en diferentes objetos EndpointSlice pueden llegar a la vigilancia / caché del cliente de Kubernetes en diferentes momentos.
167+
168+
{{< note >}}
169+
Los clientes de la API EndpointSlice deben iterar a través de todos los EndpointSlices existentes asociados a un Servicio y construir una lista completa de endpoints de red únicos. Es importante mencionar que los endpoints pueden estar duplicados en diferentes EndpointSlices.
170+
171+
Puedes encontrar una implementación de referencia sobre cómo realizar esta agregación y deduplicación de endpoints como parte del código `EndpointSliceCache` dentro de `kube-proxy`.
172+
{{< /note >}}
173+
174+
## Comparación con endpoints {#motivación}
175+
176+
La API Endpoints original proporcionaba una forma simple y directa de rastrear los endpoints de red en Kubernetes. A medida que los clústeres de Kubernetes y los {{< glossary_tooltip text="Services" term_id="service" >}} crecían para manejar más tráfico y enviar más tráfico a más Pods backend, las limitaciones de la API original se hicieron más visibles.
177+
Más notablemente, estos incluyen desafíos con la ampliación a un mayor número de endpoints de red.
178+
179+
Dado que todos los endpoints de red para un Servicio se almacenaban en un único objeto Endpoint, esos objetos Endpoints podían llegar a ser bastante grandes. Para los Services que permanecían estables (el mismo conjunto de endpoints durante un largo período de tiempo), el impacto era menos notable; incluso entonces, algunos casos de uso de Kubernetes no estaban bien servidos.
180+
181+
182+
Cuando un Service tenía muchos Endpoints de backend y la carga de trabajo se escalaba con frecuencia o se introducían nuevos cambios con frecuencia, cada actualización del objeto Endpoint para ese Service suponía mucho tráfico entre los componentes del clúster de Kubernetes (dentro del plano de control y también entre los nodos y el servidor de API). Este tráfico adicional también tenía un coste en términos de uso de la CPU.
183+
184+
Con EndpointSlices, la adición o eliminación de un único Pod desencadena el mismo _número_ de actualizaciones a los clientes que están pendientes de los cambios, pero el tamaño de esos mensajes de actualización es mucho menor a gran escala.
185+
186+
EndpointSlices también ha permitido innovar en torno a nuevas funciones, como las redes de doble pila y el enrutamiento con conocimiento de la topología.
187+
188+
## {{% heading "whatsnext" %}}
189+
190+
* Sigue las instrucciones del tutorial [Conexión de aplicaciones con servicios](/docs/tutorials/services/connect-applications-service/)
191+
* Lee la [Referencia API](/docs/reference/kubernetes-api/service-resources/endpoint-slice-v1/) para la API EndpointSlice
192+
* Lee la [Referencia API](/docs/reference/kubernetes-api/service-resources/endpoints-v1/) para la API Endpoints

0 commit comments

Comments
 (0)