Вопрос или проблема
У нас есть кластер 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 невозможно, однако вы можете выполнить это динамически с помощью инициализационных контейнеров.
Подход к решению
-
Получение Elastic IP: Вам необходимо сначала получить или создать Elastic IP, который будет использоваться для повторного назначения.
-
Инициализационный контейнер: Вы можете настроить инициализационный контейнер в ваших подах, который будет автоматически ассоциировать Elastic IP с новым экземпляром узла при его создании. Это можно сделать с помощью AWS CLI, исполняемого внутри контейнера.
-
Пример конфигурации пода:
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
- Разрешения AWS: Убедитесь, что ваш IAM пользователь или роль, используемая для выполнения данных команд, имеет необходимые разрешения для выполнения операций с Elastic IP:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AssociateAddress",
"ec2:DisassociateAddress"
],
"Resource": "*"
}
]
}
- Секрет с учетными данными 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, где вы можете найти дополнительные советы и рекомендации по расширению данной практики.