Назад | Перейти на главную страницу

Интеграция AWS Cloud Provider с Kubernetes - узлы застряли с пометкой «uninitialized: true» после начальной загрузки

Резюме

Я пытаюсь запустить кластер 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 устанавливают для облачного провайдера значение external в четырех местах

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"

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

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

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

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