|
| 1 | +--- |
| 2 | +title: Leases |
| 3 | +api_metadata: |
| 4 | +- apiVersion: "coordination.k8s.io/v1" |
| 5 | + kind: "Lease" |
| 6 | +content_type: concept |
| 7 | +weight: 30 |
| 8 | +--- |
| 9 | + |
| 10 | +<!-- overview --> |
| 11 | + |
| 12 | +Los sistemas distribuidos suelen necesitar _leases_, que proporcionan un mecanismo para bloquear recursos compartidos |
| 13 | +y coordinar la actividad entre los miembros de un conjunto. |
| 14 | +En Kubernetes, el concepto de lease (arrendamiento) está representado por objetos [Lease](/docs/reference/kubernetes-api/cluster-resources/lease-v1/) |
| 15 | +en el {{< glossary_tooltip text="grupo API" term_id="api-group" >}} de `coordination.k8s.io`, |
| 16 | +que se utilizan para capacidades críticas del sistema, como los heartbeats del nodo y la elección del líder a nivel de componente. |
| 17 | +<!-- body --> |
| 18 | + |
| 19 | +## Heartbeats del nodo {#node-heart-beats} |
| 20 | + |
| 21 | +Kubernetes utiliza la API Lease para comunicar los heartbeats de los nodos kubelet al servidor API de Kubernetes. |
| 22 | +Para cada `Nodo` , existe un objeto `Lease` con un nombre que coincide en el espacio de nombres `kube-node-lease`. |
| 23 | +Analizando a detalle, cada hearbeat es una solicitud **update** a este objeto `Lease`, actualizando |
| 24 | +el campo `spec.renewTime` del objeto Lease. El plano de control de Kubernetes utiliza la marca de tiempo de este campo |
| 25 | +para determinar la disponibilidad de este «Nodo». |
| 26 | + |
| 27 | +Ve [Objetos Lease de nodos](/docs/concepts/architecture/nodes/#heartbeats) para más detalles. |
| 28 | + |
| 29 | +## Elección del líder |
| 30 | + |
| 31 | + |
| 32 | +Kubernetes también utiliza Leases para asegurar que sólo una instancia de un componente se está ejecutando en un momento dado. |
| 33 | +Esto lo utilizan componentes del plano de control como `kube-controller-manager` y `kube-scheduler` en configuraciones de |
| 34 | +HA, donde sólo una instancia del componente debe estar ejecutándose activamente mientras las otras |
| 35 | +instancias están en espera. |
| 36 | + |
| 37 | +## Identidad del servidor API |
| 38 | + |
| 39 | +{{< feature-state feature_gate_name="APIServerIdentity" >}} |
| 40 | + |
| 41 | +A partir de Kubernetes v1.26, cada `kube-apiserver` utiliza la API Lease para publicar su identidad al resto del sistema. |
| 42 | +Aunque no es particularmente útil por sí mismo, esto proporciona un mecanismo para que los clientes |
| 43 | +puedan descubrir cuántas instancias de `kube-apiserver` están operando el plano de control de Kubernetes. |
| 44 | +La existencia de los objetos leases de kube-apiserver permite futuras capacidades que pueden requerir la coordinación entre |
| 45 | +cada kube-apiserver. |
| 46 | + |
| 47 | +Puedes inspeccionar los leases de cada kube-apiserver buscando objetos leases en el namespace `kube-system` |
| 48 | +con el nombre `kube-apiserver-<sha256-hash>`. También puedes utilizar el selector de etiquetas `apiserver.kubernetes.io/identity=kube-apiserver`: |
| 49 | + |
| 50 | +```shell |
| 51 | +kubectl -n kube-system get lease -l apiserver.kubernetes.io/identity=kube-apiserver |
| 52 | +``` |
| 53 | +``` |
| 54 | +NAME HOLDER AGE |
| 55 | +apiserver-07a5ea9b9b072c4a5f3d1c3702 apiserver-07a5ea9b9b072c4a5f3d1c3702_0c8914f7-0f35-440e-8676-7844977d3a05 5m33s |
| 56 | +apiserver-7be9e061c59d368b3ddaf1376e apiserver-7be9e061c59d368b3ddaf1376e_84f2a85d-37c1-4b14-b6b9-603e62e4896f 4m23s |
| 57 | +apiserver-1dfef752bcb36637d2763d1868 apiserver-1dfef752bcb36637d2763d1868_c5ffa286-8a9a-45d4-91e7-61118ed58d2e 4m43s |
| 58 | +
|
| 59 | +``` |
| 60 | + |
| 61 | + |
| 62 | +El hash SHA256 utilizado en el nombre del lease se basa en el nombre de host del sistema operativo visto por ese servidor API. Cada kube-apiserver debe ser |
| 63 | +configurado para utilizar un nombre de host que es único dentro del clúster. Las nuevas instancias de kube-apiserver que utilizan el mismo nombre de host |
| 64 | +asumirán los leases existentes utilizando una nueva identidad de titular, en lugar de instanciar nuevos objetos leases. Puedes comprobar el |
| 65 | +nombre de host utilizado por kube-apiserver comprobando el valor de la etiqueta `kubernetes.io/hostname`: |
| 66 | + |
| 67 | +```shell |
| 68 | +kubectl -n kube-system get lease apiserver-07a5ea9b9b072c4a5f3d1c3702 -o yaml |
| 69 | +``` |
| 70 | +```yaml |
| 71 | +apiVersion: coordination.k8s.io/v1 |
| 72 | +kind: Lease |
| 73 | +metadata: |
| 74 | + creationTimestamp: "2023-07-02T13:16:48Z" |
| 75 | + labels: |
| 76 | + apiserver.kubernetes.io/identity: kube-apiserver |
| 77 | + kubernetes.io/hostname: master-1 |
| 78 | + name: apiserver-07a5ea9b9b072c4a5f3d1c3702 |
| 79 | + namespace: kube-system |
| 80 | + resourceVersion: "334899" |
| 81 | + uid: 90870ab5-1ba9-4523-b215-e4d4e662acb1 |
| 82 | +spec: |
| 83 | + holderIdentity: apiserver-07a5ea9b9b072c4a5f3d1c3702_0c8914f7-0f35-440e-8676-7844977d3a05 |
| 84 | + leaseDurationSeconds: 3600 |
| 85 | + renewTime: "2023-07-04T21:58:48.065888Z" |
| 86 | +``` |
| 87 | +
|
| 88 | +Los leases caducados de los kube-apiservers que ya no existen son recogidos por los nuevos kube-apiservers después de 1 hora. |
| 89 | +
|
| 90 | +Puedes desactivar el lease de identidades del servidor API desactivando la opción `APIServerIdentity` de los [interruptores de funcionalidades](/docs/reference/command-line-tools-reference/feature-gates/). |
| 91 | + |
| 92 | +## Cargas de trabajo {#custom-workload} |
| 93 | + |
| 94 | +Tu propia carga de trabajo puede definir su propio uso de los leases. Por ejemplo, puede ejecutar un |
| 95 | +{{< glossary_tooltip term_id=controller text=controlador >}} en la que un miembro principal o líder |
| 96 | +realiza operaciones que sus compañeros no realizan. Tú defines un Lease para que las réplicas del controlador puedan seleccionar |
| 97 | +o elegir un líder, utilizando la API de Kubernetes para la coordinación. |
| 98 | +Si utilizas un lease, es una buena práctica definir un nombre para el lease que esté obviamente vinculado a |
| 99 | +el producto o componente. Por ejemplo, si tienes un componente denominado Ejemplo Foo, utilice un lease denominado |
| 100 | +`ejemplo-foo`. |
| 101 | + |
| 102 | +Si un operador de clúster u otro usuario final puede desplegar varias instancias de un componente, selecciona un nombre |
| 103 | +prefijo y elije un mecanismo (como el hash del nombre del despliegue) para evitar colisiones de nombres |
| 104 | +para los leases. |
| 105 | + |
| 106 | +Puedes utilizar otro enfoque siempre que consigas el mismo resultado: los distintos productos de software no entren en conflicto entre sí. |
0 commit comments