Introducción
El objetivo principal del operador de ruta estática es proporcionar mayor flexibilidad y control sobre el tráfico de red en su entorno de Kubernetes. Permite ajustar la configuración de enrutamiento para satisfacer los requisitos de la aplicación y optimizar el rendimiento de la red. Se implementa como un DaemonSet. Por lo tanto, se ejecuta en todos los nodos de su clúster de Kubernetes administrado por DigitalOcean.
En este tutorial, aprenderá a administrar la tabla de enrutamiento de cada nodo de trabajo según la especificación CRD y a configurar una puerta de enlace de conmutación por error.
El objetivo principal de este tutorial es mostrar cómo administrar la tabla de enrutamiento de cada nodo de trabajo según la especificación CRD y configurar una puerta de enlace de conmutación por error.
Requisitos previos
- Un clúster de Kubernetes administrado por DigitalOcean al que tiene acceso.
- CLI de Kubectl instalado en su máquina local (configurado para apuntar a su clúster de Kubernetes administrado por DigitalOcean)
- Los droplets NAT GW (2 o más) se configuran e implementan como se detalla aquí.
- Cree un sistema de detección de fallos en el Droplet Gateway que se adapte a las necesidades del usuario y garantice una detección clara y precisa con un mínimo de falsas alarmas. Utilice servicios de monitorización como Prometheus o Nagios, configure endpoints de comprobación de estado en el Droplet o herramientas de alerta como Alertmanager para notificaciones. Para ello, puede utilizar una pila de monitorización de nuestra plataforma.
A continuación se muestra el diagrama de arquitectura:
Implementación del operador de rutas estáticas de Kubernetes
Implemente la última versión del operador de rutas estáticas en su clúster de Kubernetes administrado por DigitalOcean usando kubectl:
kubectl apply -f https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/releases/v1/k8s-staticroute-operator-v1.0.0.yaml
Compruebe que los pods de operador estén en funcionamiento:
Verifiquemos si los pods del operador están en funcionamiento.
“ bash kubectl obtener rutas estáticas -o ancho -n rutas estáticas
The output looks similar to the below:
```bash
[secondary_label Output]
NAME AGE DESTINATIONS GATEWAY
static-route-ifconfig.me 119s ["XX.XX.XX.XX"] XX.XX.XX.XX
static-route-ipinfo.io 111s ["XX.XX.XX.XX"] XX.XX.XX.XXAhora revisemos los informes del operador y no se deberían reportar excepciones:
kubectl logs -f ds/k8s-staticroute-operator -n static-routes
Deberías observar el siguiente resultado:
Output
Found 2 pods, using pod/k8s-staticroute-operator-498vv
[2023-05-15 14:12:32,282] kopf._core.reactor.r [DEBUG ] Starting Kopf 1.35.6.
[2023-05-15 14:12:32,282] kopf._core.engines.a [INFO ] Initial authentication has been initiated.
[2023-05-15 14:12:32,283] kopf.activities.auth [DEBUG ] Activity 'login_via_pykube' is invoked.
[2023-05-15 14:12:32,285] kopf.activities.auth [DEBUG ] Pykube is configured in cluster with service account.
[2023-05-15 14:12:32,286] kopf.activities.auth [INFO ] Activity 'login_via_pykube' succeeded.
[2023-05-15 14:12:32,286] kopf.activities.auth [DEBUG ] Activity 'login_via_client' is invoked.
[2023-05-15 14:12:32,287] kopf.activities.auth [DEBUG ] Client is configured in cluster with service account.
[2023-05-15 14:12:32,288] kopf.activities.auth [INFO ] Activity 'login_via_client' succeeded.
[2023-05-15 14:12:32,288] kopf._core.engines.a [INFO ] Initial authentication has finished.
[2023-05-15 14:12:32,328] kopf._cogs.clients.w [DEBUG ] Starting the watch-stream for customresourcedefinitions.v1.apiextensions.k8s.io cluster-wide.
[2023-05-15 14:12:32,330] kopf._cogs.clients.w [DEBUG ] Starting the watch-stream for staticroutes.v1.networking.digitalocean.com cluster-wide.Para mitigar el impacto de una falla de puerta de enlace, se recomienda tener una puerta de enlace en espera lista para conmutar por error si es necesario. Si bien el operador no ofrece actualmente alta disponibilidad (HA) real, realizar una conmutación por error ayuda a minimizar la duración de la interrupción del servicio.
Supongamos que tiene una dirección IP de destino designada, 34.160.111.145, que representa la puerta de enlace activa o principal, con la dirección IP 10.116.0.4, responsable del reenvío de tráfico. Esta dirección se almacena en el archivo primar.yaml.
apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: primary
spec:
destinations:
- "34.160.111.145"
gateway: "10.116.0.4"Además, tendrá una puerta de enlace secundaria o en espera con la dirección IP 10.116.0.12, lista para gestionar el tráfico desde la misma dirección IP de destino. La definición de StaticRoute en el archivo secondary.yaml es idéntica a la de la principal, excepto por la dirección IP de la puerta de enlace (y el nombre del objeto). Esta se almacena en el archivo secondary.yaml.
apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: secondary
spec:
destinations:
- "34.160.111.145"
gateway: "10.116.0.12"Entonces el proceso de falla real implica los siguientes pasos:
- Detectar que la puerta de enlace activa con dirección IP 10.116.0.5 está inactiva.
- Eliminar la StaticRoute actualmente activa.
- Aplicar la ruta estática preparada.
Eliminar ruta estática activa
Ahora eliminemos la StaticRoute actualmente activa.
kubectl delete -f primary.yaml
Espere de 30 a 60 segundos para que cada instancia del operador tenga tiempo suficiente para procesar la eliminación del objeto. Es decir, responda eliminando la ruta de todos los nodos.
Aplicar ruta estática en espera
Habilitemos la ruta estática secundaria.
kubectl apply -f secondary.yaml
El operador debe seleccionar la nueva ruta estática en espera e insertar las entradas correspondientes en la tabla de enrutamiento. Después, se completa la conmutación por error.
Prueba de configuración
Cada instancia de CRD crea una ruta estática a dos sitios web que reportan su IP pública: ifconfig.me/ip e ipinfo.io/ip. Una definición típica de ruta estática es la siguiente:
apiVersion: networking.digitalocean.com/v1
kind: StaticRoute
metadata:
name: static-route-ifconfig.me
spec:
destinations:
- "34.160.111.145"
gateway: "10.116.0.5"Para probar la configuración, descargue un manifiesto de muestra desde la ubicación de ejemplo:
Ejemplo para ifconfig.me e ipinfo.io-
curl -O https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/examples/static-route-ifconfig.me.yaml
curl -O https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/examples/static-route-ipinfo.io.yaml
Después de descargar los manifiestos, reemplace cada archivo de manifiesto con <>. Luego, aplique cada manifiesto con kubectl:
kubectl apply -f static-route-ifconfig.me.yaml
kubectl apply -f static-route-ipinfo.io.yaml
Por último, verifique si el pod curl-test responde a la IP pública de su puerta de enlace NAT para cada ruta:
kubectl exec -it curl-test -- curl ifconfig.me/ip
kubectl exec -it curl-test -- curl ipinfo.io/ipDebe usar la misma prueba durante la prueba de conmutación por error. Durante la conmutación por error de la droplet de la puerta de enlace principal, el resultado debe proporcionar al GW NAT la IP pública de la droplet principal, y durante la conmutación por error de la droplet secundaria, el resultado debe proporcionar la IP pública de la puerta de enlace NAT de la droplet secundaria.
Solución de problemas
Debe verificar el objeto StaticRoute: si ocurre un error, primero busque el error en el evento de ruta estática para cada nodo donde se aplica la regla.
kubectl get StaticRoute <static-route-name> -o yaml
Verificar registros: para profundizar más, puede verificar los registros del operador de ruta estática para detectar errores.
kubectl logs -f ds/k8s-staticroute-operator -n static-routes
Borrar
Para eliminar el operador y los recursos asociados, ejecute el siguiente comando kubectl (asegúrese de utilizar la misma versión de lanzamiento que utilizó durante la instalación):
kubectl delete -f deploy https://raw.githubusercontent.com/digitalocean/k8s-staticroute-operator/main/releases/v1/k8s-staticroute-operator-v1.0.0.yaml
Salida similar a:
customresourcedefinition.apiextensions.k8s.io "staticroutes.networking.digitalocean.com" deleted
serviceaccount "k8s-staticroute-operator" deleted
clusterrole.rbac.authorization.k8s.io "k8s-staticroute-operator" deleted
clusterrolebinding.rbac.authorization.k8s.io "k8s-staticroute-operator" deleted
daemonset.apps "k8s-staticroute-operator" deletedAhora, si prueba el mismo comando curl, obtendrá la IP del nodo de trabajo como salida:
kubectl exec -it curl-test -- curl ifconfig.me/ip
kubectl exec -it curl-test -- curl ipinfo.io/ip
Ahora verifique la IP pública del nodo de trabajo:
kubectl get nodes -o wide
Resultado
La implementación de capacidades de conmutación por error, incluso si no se admite totalmente la alta disponibilidad (HA) real, es un enfoque recomendado para minimizar el impacto de las fallas de la puerta de enlace.
Las organizaciones pueden reducir significativamente la duración de las interrupciones del servicio al contar con una puerta de enlace de reserva para realizar una conmutación por error en caso de ser necesario.
Es importante contar con una puerta de enlace de respaldo y garantizar una transición fluida en caso de fallo. Si bien la implementación puede variar según las necesidades específicas, priorizar la preparación ante fallos puede ayudar a mantener una prestación de servicios fiable e ininterrumpida.










