Интеграция облачного провайдера AWS с Kubernetes - узлы, застрявшие с пометкой «неинициализированный: истинный» после начальной загрузки

Резюме

Я пытаюсь запустить кластер Kubernetes на AWS с помощью Kubeadm. Пожалуйста, прежде чем предлагать их, я не заинтересован в использовании EKS или другого решения для самонастройки, такого как Kops, Kubespray и т. Д.

Похоже, что существует много неточной информации о надлежащих процедурах из-за раскола в отношении Интеграция с облачным провайдером не управляется деревом, а скорее деревом. Итак, я изо всех сил пытался получить в голове четкое представление о том, как правильно настроить эту интеграцию.

Требования

В официальном репозитории указаны три требования.

1) Вы должны инициализировать kubelet , kube-apiserver и ] kube-controller-manager с аргументом - cloud-provider = external . Если я правильно понимаю, это позволяет вам использовать поставщика вне дерева. Использование здесь aws вместо этого будет использовать поставщика в дереве, который находится на временной шкале устаревания.

2) Вы должны создать две политики IAM , связать их с профилями экземпляров IAM и запустить свои узлы Kubernetes с присоединенной указанной политикой.

3) Каждый узел в кластере должен иметь то же имя хоста, которое связано с базовым экземпляром EC2, что и его имя Private DNS .

В дополнение к этому, я считаю, что когда-то требовалось прикрепить следующие теги к вашим экземплярам EC2, таблицам маршрутов, группам безопасности и подсетям. Что я и сделал для хорошей меры:

"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}"

Проблема

Однако, несмотря на это, когда мои рабочие узлы подключаются к сети после начальной загрузки, к ним применяется следующее искажение:

node.cloudprovider.kubernetes.io/uninitialized : true

Очевидно, это означает, что узлы не были инициализированы поставщиком облака. Я не совсем уверен, что делать дальше. Существует открытый запрос для дополнительных инструкций по использованию интеграции облачного провайдера с AWS, но в настоящее время он не удовлетворен.

Моя конфигурация

Вы могли заметить, что я оставил комментарий по этой проблеме, в котором также подробно описывается моя проблема. Вот краткая информация о моей среде, показывающая, что я должен соответствовать перечисленным требованиям.

1) Мои файлы конфигурации Kubeadm устанавливают облачного провайдера на внешний в четырех местах

KubeletConfiguration и InitConfiguration

nodeRegistration:
  kubeletExtraArgs:
    cloud-provider: external

ClusterConfiguration

apiServer:
  extraArgs:
    cloud-provider: external

ClusterConfiguration

controllerManager:
  extraArgs:
    cloud-provider: external

2) Мои экземпляры EC2 были запущены с профилем экземпляра с политиками IAM, описанными в README:

$> aws ec2 describe-instances --instance-ids INSTANCE.ID | jq '.Reservations[].Instances[].IamInstanceProfile[]'
"arn:aws-us-gov:iam::ACCOUNT.ID:instance-profile/PROFILE-NAME"

3) Имена узлов - это частные DNS-имена EC2:

$> hostname -f
ip-10-0-10-91.us-gov-west-1.compute.internal

4) Экземпляры EC2, а также мои таблицы маршрутов, подсети и т. Д. Помечены:

"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}"

В результате похоже, что я соблюдаю все требования, поэтому я не уверен, почему мои узлы все еще остаются с этим Заражение. Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ

Я обновил теги в каждом экземпляре на:

"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "owned"

И добавил этот тег в каждую подсеть:

"kubernetes.io/role/internal-elb" = 1

Однако это не разрешило ситуацию.

РЕДАКТИРОВАТЬ 2

Пользователь в другом месте предположил, что проблема может заключаться в том, что я не применил ресурсы RBAC и DaemonSet, присутствующие в каталоге манифестов репозитория cloud-provider-aws . Сделав это, используя этот образ, я могу подтвердить, что это НЕ решило мою проблему, поскольку aws-cloud-controller-manager , похоже, ожидает, что вы будете использовать aws not external` согласно журналам, создаваемым модулем при запуске:

Generated self-signed cert in-memory

Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.

Version: v0.0.0-master+$Format:%h$

WARNING: aws built-in cloud provider is now deprecated. The AWS provider is deprecated and will be removed in a future release

Building AWS cloudprovider

Zone not specified in configuration file; querying AWS metadata service

Cloud provider could not be initialized: could not init cloud provider "aws": clusterID tags did not match: "example-14150" vs "True"

РЕДАКТИРОВАТЬ 3

Я создал новый образ, используя репо на момент фиксации 6a14c81 . Его можно найти здесь . Похоже, что по умолчанию он также использует поставщика aws ?

Cloud provider could not be initialized: could not init cloud provider "aws": clusterID tags did not match: "example-14150" vs "True"
2
задан 11 May 2020 в 21:39
1 ответ

В документации не упоминается, что необходимо развернуть AWS Cloud Controller Manager вместе с необходимыми политиками RBAC. Их можно найти в /manifests в репозитории.

В настоящее время нет опубликованного образа AWS Cloud Controller Manager. Поэтому вам нужно будет собрать его и разместить самостоятельно или использовать мой образ из последней фиксации, найденной здесь.

Вы заметите, что в качестве аргумента передается --cloud-provider=aws. Несмотря на то, что это ВНЕШНЯЯ интеграция с облачным провайдером, на самом деле здесь необходимо передавать aws, а не external.

Наконец, все ваши инстансы также должны быть помечены тегом: "KubernetesCluster" = var.K8S_CLUSTER_NAME

2
ответ дан 11 May 2020 в 19:22

Теги

Похожие вопросы