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