documentation.suse.com / Documentación de SUSE Edge / Guías prácticas / MetalLB delante del servidor de Kubernetes API

26 MetalLB delante del servidor de Kubernetes API

Esta guía explica cómo usar un servicio MetalLB para exponer la API de RKE2/K3s externamente en un clúster de HA con tres nodos de plano de control. Para lograrlo, se crearán manualmente un servicio de Kubernetes de tipo LoadBalancer y puntos finales. Los puntos finales mantienen las IP de todos los nodos de plano de control disponibles en el clúster. Para que el punto final esté continuamente sincronizado con los eventos que ocurren en el clúster (añadir/eliminar un nodo o que un nodo se desconecte), se desplegará el Endpoint Copier Operator (Capítulo 20, Endpoint Copier Operator). Este operador supervisa los eventos que ocurren en el punto final kubernetes por defecto y actualiza el que se gestiona automáticamente para mantenerlos sincronizados. Dado que el servicio gestionado es de tipo LoadBalancer, MetalLB le asigna una IP externa (ExternalIP estática. Esta ExternalIP se utilizará para comunicarse con el servidor de API.

26.1 Requisitos previos

  • Tres hosts para desplegar RKE2/K3s encima.

    • Asegúrese de que los hosts tienen nombres distintos.

    • Para realizar pruebas, pueden ser máquinas virtuales.

  • Al menos 2 IP disponibles en la red (una para Traefik/Nginx y otra para el servicio gestionado).

  • Helm

26.2 Instalación de RKE2/K3s

Nota
Nota

Si no desea utilizar un clúster nuevo, omita este paso y continúe con el siguiente.

En primer lugar, se debe reservar una IP libre en la red que se utilizará posteriormente para ExternalIP en el servicio gestionado.

Use SSH para el primer host e instale la distribución deseada en modo de clúster.

Para RKE2:

# Export the free IP mentioned above
export VIP_SERVICE_IP=<ip>

curl -sfL https://get.rke2.io | INSTALL_RKE2_EXEC="server \
 --write-kubeconfig-mode=644 --tls-san=${VIP_SERVICE_IP} \
 --tls-san=https://${VIP_SERVICE_IP}.sslip.io" sh -

systemctl enable rke2-server.service
systemctl start rke2-server.service

# Fetch the cluster token:
RKE2_TOKEN=$(tr -d '\n' < /var/lib/rancher/rke2/server/node-token)

Para K3s:

# Export the free IP mentioned above
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --cluster-init \
 --disable=servicelb --write-kubeconfig-mode=644 --tls-san=${VIP_SERVICE_IP} \
 --tls-san=https://${VIP_SERVICE_IP}.sslip.io" K3S_TOKEN=foobar sh -
Nota
Nota

Asegúrese de que se proporciona el indicador --disable=servicelb en el comando k3s server.

Importante
Importante

A partir de ahora, los comandos deben ejecutarse en el equipo local.

Para acceder al servidor de API desde el exterior, se utilizará la IP de la máquina virtual RKE2/K3s.

# Replace <node-ip> with the actual IP of the machine
export NODE_IP=<node-ip>
export KUBE_DISTRIBUTION=<k3s/rke2>

scp ${NODE_IP}:/etc/rancher/${KUBE_DISTRIBUTION}/${KUBE_DISTRIBUTION}.yaml ~/.kube/config && sed \
 -i '' "s/127.0.0.1/${NODE_IP}/g" ~/.kube/config && chmod 600 ~/.kube/config

26.3 Configuración de un clúster existente

Nota
Nota

Este paso solo es válido si pretende utilizar un clúster RKE2/K3s existente.

Para usar un clúster existente, deben modificarse los indicadores tls-san. Además, el equilibrador de carga servicelb debe inhabilitarse para K3s.

Para cambiar los indicadores de los servidores RKE2 o K3s, es necesario modificar el archivo /etc/systemd/system/rke2.service o el archivo /etc/systemd/system/k3s.service en todas las máquinas virtuales del clúster, en función de la distribución.

Los indicadores deben insertarse en ExecStart. Por ejemplo:

Para RKE2:

# Replace the <vip-service-ip> with the actual ip
ExecStart=/usr/local/bin/rke2 \
    server \
        '--write-kubeconfig-mode=644' \
        '--tls-san=<vip-service-ip>' \
        '--tls-san=https://<vip-service-ip>.sslip.io' \

Para K3s:

# Replace the <vip-service-ip> with the actual ip
ExecStart=/usr/local/bin/k3s \
    server \
        '--cluster-init' \
        '--write-kubeconfig-mode=644' \
        '--disable=servicelb' \
        '--tls-san=<vip-service-ip>' \
        '--tls-san=https://<vip-service-ip>.sslip.io' \

A continuación, se deben ejecutar los siguientes comandos para cargar las nuevas configuraciones:

systemctl daemon-reload
systemctl restart ${KUBE_DISTRIBUTION}

26.4 Instalación de MetalLB

Para desplegar MetalLB, se puede usar la guía de MetalLB en K3s (Capítulo 25, MetalLB en K3s (con el modo de capa 2)).

NOTA: asegúrese de que las direcciones IP del IPAddressPool ip-pool no se solapan con las direcciones IP previamente seleccionadas para el servicio LoadBalancer.

Cree un IpAddressPool independiente que se utilizará solo para el servicio gestionado.

# Export the VIP_SERVICE_IP on the local machine
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: kubernetes-vip-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - ${VIP_SERVICE_IP}/32
  serviceAllocation:
    priority: 100
    namespaces:
      - default
EOF
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: ip-pool-l2-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - ip-pool
  - kubernetes-vip-ip-pool
EOF

26.5 Instalación de Endpoint Copier Operator

helm install \
endpoint-copier-operator oci://registry.suse.com/edge/charts/endpoint-copier-operator \
--namespace endpoint-copier-operator \
--create-namespace

El comando de arriba desplegará el operador endpoint-copier-operator con dos réplicas. Una será la líder y la otra asumirá el papel de líder si fuera necesario.

Ahora se debe desplegar el servicio kubernetes-vip, que el operador reconciliará, y se creará un punto final con los puertos y la IP configurados.

Para RKE2:

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-vip
  namespace: default
spec:
  ports:
  - name: rke2-api
    port: 9345
    protocol: TCP
    targetPort: 9345
  - name: k8s-api
    port: 6443
    protocol: TCP
    targetPort: 6443
  type: LoadBalancer
EOF

Para K3s:

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-vip
  namespace: default
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: https
    port: 6443
    protocol: TCP
    targetPort: 6443
  sessionAffinity: None
  type: LoadBalancer
EOF

Verifique que el servicio kubernetes-vip tenga la dirección IP correcta:

kubectl get service kubernetes-vip -n default \
 -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'

Asegúrese de que los recursos de punto final kubernetes-vip y kubernetes del espacio de nombres default dirijan a las mismas IP.

kubectl get endpoints kubernetes kubernetes-vip

Si todo está correcto, lo último que queda por hacer es usar VIP_SERVICE_IP en nuestro Kubeconfig.

sed -i '' "s/${NODE_IP}/${VIP_SERVICE_IP}/g" ~/.kube/config

A partir de ahora, todo kubectl pasará por el servicio kubernetes-vip.

26.6 Adición de nodos de plano de control

Para supervisar todo el proceso, se pueden abrir dos pestañas de terminal más.

Primer terminal:

watch kubectl get nodes

Segundo terminal:

watch kubectl get endpoints

Ahora, ejecute los comandos siguientes en el segundo y el tercer nodo.

Para RKE2:

# Export the VIP_SERVICE_IP in the VM
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>

curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="server" sh -
systemctl enable rke2-server.service


mkdir -p /etc/rancher/rke2/
cat <<EOF > /etc/rancher/rke2/config.yaml
server: https://${VIP_SERVICE_IP}:9345
token: ${RKE2_TOKEN}
EOF

systemctl start rke2-server.service

Para K3s:

# Export the VIP_SERVICE_IP in the VM
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
 --server https://${VIP_SERVICE_IP}:6443 --disable=servicelb \
 --write-kubeconfig-mode=644" K3S_TOKEN=foobar sh -
Documentation survey