Сохранить IP-адрес при обновлении кластера AWS EKS и управляемой группы узлов.

Вопрос или проблема

У нас есть кластер EKS версии 1.20 и управляемая группа узлов с общим IP-адресом. Когда мы обновляем кластер EKS и группу узлов до версии 1.21, управляемые узлы получат новый IP-адрес. Как мы можем сохранить оригинальный IP-адрес?

Вы не можете статически назначить Elastic IP конкретному рабочему узлу EKS, но вы можете сделать это динамически.

Определение пода:

spec:
      hostNetwork: true
      initContainers:
      - name: eip
        image: docker.io/amazon/aws-cli:2.0.18
        command:
        - /bin/bash
        - -xec
        - |
          INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
          aws ec2 disassociate-address --public-ip "$PUBLIC_IP" || true
          aws ec2 associate-address --public-ip "$PUBLIC_IP" --instance-id "$INSTANCE_ID"
        env:
        - name: PUBLIC_IP
          value: 
        - name: AWS_REGION
          value: eu-central-1
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              key: awsKeyId
              name: restund
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              key: awsSecretKey
              name: restund

Привилегии AWS:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateAddress",
        "ec2:DisassociateAddress"
      ],
      "Resource": "*"
    }
  ]
}

И секрет для приложения:

apiVersion: v1
kind: Secret
metadata:
  name: restund
type: Opaque
data:
  awsKeyId: {key-id}
  awsSecretKey: {secret-key}

Посмотрите этот блог для получения более подробной информации:

https://itnext.io/attaching-an-elastic-ip-to-eks-worker-node-f69b9d8fa521

.

Ответ или решение

Сохранение IP-адреса при обновлении EKS кластера и управляемой группы узлов AWS

При обновлении кластера Amazon EKS до версии 1.21 и управляемой группы узлов (managed nodegroup) становится актуальным вопрос сохранения исходного публичного IP-адреса. По умолчанию, обновление кластера приведет к созданию новых экземпляров узлов с новыми IP-адресами, и это может вызвать проблемы в работоспособности приложений, максимально зависящих от фиксированного публичного IP-адреса.

Чтобы сохранить оригинальный IP-адрес, следует использовать Elastic IP (EIP) и автоматизированные скрипты для их переноса на новые экземпляры узлов. К сожалению, статическое назначение Elastic IP на управляемые узлы в EKS невозможно, однако вы можете выполнить это динамически с помощью инициализационных контейнеров.

Подход к решению

  1. Получение Elastic IP: Вам необходимо сначала получить или создать Elastic IP, который будет использоваться для повторного назначения.

  2. Инициализационный контейнер: Вы можете настроить инициализационный контейнер в ваших подах, который будет автоматически ассоциировать Elastic IP с новым экземпляром узла при его создании. Это можно сделать с помощью AWS CLI, исполняемого внутри контейнера.

  3. Пример конфигурации пода:

spec:
  hostNetwork: true
  initContainers:
  - name: eip
    image: docker.io/amazon/aws-cli:2.0.18
    command:
    - /bin/bash
    - -xec
    - |
      INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
      aws ec2 disassociate-address --public-ip "$PUBLIC_IP" || true
      aws ec2 associate-address --public-ip "$PUBLIC_IP" --instance-id "$INSTANCE_ID"
    env:
    - name: PUBLIC_IP
      value: <ваш-public-ip>
    - name: AWS_REGION
      value: eu-central-1
    - name: AWS_ACCESS_KEY_ID
      valueFrom:
        secretKeyRef:
          key: awsKeyId
          name: restund
    - name: AWS_SECRET_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          key: awsSecretKey
          name: restund
  1. Разрешения AWS: Убедитесь, что ваш IAM пользователь или роль, используемая для выполнения данных команд, имеет необходимые разрешения для выполнения операций с Elastic IP:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateAddress",
        "ec2:DisassociateAddress"
      ],
      "Resource": "*"
    }
  ]
}
  1. Секрет с учетными данными AWS: Храните свои учетные данные для доступа к AWS в Kubernetes в виде секрета:
apiVersion: v1
kind: Secret
metadata:
  name: restund
type: Opaque
data:
  awsKeyId: {key-id}   # Закодированный в base64 ключ доступа
  awsSecretKey: {secret-key}  # Закодированный в base64 секретный ключ

Заключение

С помощью вышеописанных шагов вы сможете сохранить ваш публичный IP-адрес при обновлении Amazon EKS кластера и управляемой группы узлов. Данный подход требует внимательной настройки и тестирования, чтобы убедиться, что все компоненты работают корректно и что вся необходимая информация доступна в нужных переменных окружения. Интеграция с AWS CLI в инициализационном контейнере создает гибкое решение для управления IP-адресами в динамически создаваемых узлах.

Более подробно этот процесс описан в блоге инструкции по прикреплению Elastic IP к рабочему узлу EKS, где вы можете найти дополнительные советы и рекомендации по расширению данной практики.

Оцените материал
Добавить комментарий

Капча загружается...