Я пытаюсь запустить кластер 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
Однако это не разрешило ситуацию.
Пользователь в другом месте предположил, что проблема может заключаться в том, что я не применил ресурсы 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"
Я создал новый образ, используя репо на момент фиксации 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