Представление приложения kubernetes с помощью AWS Elastic LoadBalancer
Я создал внутренний балансировочный балансировщик нагрузки приложения AWS и в консоли AWS показывает его состояние как активное. Обратите внимание, что я создал этот ALB, используя задание jenkins, и в задании я указал мой сервер экземпляров AWS EC2, который настроен как мой мастер kubernetes.
И я могу видеть следующие детали после того, как работа была успешно завершена.
В консоли AWS под описанием, я могу видеть ниже детали -
DNS internal-myservices-987070943.us-east-1.elb.amazonaws.com
Scheme internal
Type application
IP address type ipv4
Тогда есть вкладка Слушатели, под которой я вижу Идентификатор слушателя с HTTPS: 443
Также показаны правила со следующими 2 правилами -
IF Path is /* THEN Forward to myservices-LB
IF Requests otherwise not routed THEN Forward to myservices-LB
Также я вижу другие вкладки, такие как Мониторинг, Интегрированные сервисы и Теги.
Теперь у меня есть кластер kubernetes со следующей службой, созданной с помощью Type: LoadBalancer - (Ссылка на источник: https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml)
apiVersion: v1
Kind: Service
metadata:
name: hello-kenzan
labels:
app: hello-kenzan
spec:
ports:
- port: 80
targetPort: 80
selector:
app: hello-kenzan
tier: hello-kenzan
type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-kenzan
labels:
app: hello-kenzan
spec:
strategy:
type: Recreate
template:
metadata:
labels:
app: hello-kenzan
tier: hello-kenzan
spec:
containers:
- image: gopikrish81/hello-kenzan:latest
name: hello-kenzan
ports:
- containerPort: 80
name: hello-kenzan
После того, как я создал сервис с -
kubectl apply -f k8s/manual-deployment.yaml
kubectl get svc
Внешний IP-адрес отображается как <pending>
Но так как я создал тип loadbalancer, почему он не создает ip?
К вашему сведению, я могу получить доступ к приложению, используя curl <master node>:<nodeport>
Или даже я могу получить к нему доступ через прокси-сервер.
Таким образом, без созданного IP-адреса не будет возможности показать мое приложение с помощью DNS, верно? Пожалуйста, предложите, что я могу сделать, чтобы я мог предоставить свой сервис, используя DNS-имя internal-myservices-987070943.us-east-1.elb.amazonaws.com
Мне нужно, чтобы приложение отображалось с DNS-именем, таким как http://internal-myservices-987070943.us-east-1.elb.amazonaws.com/
заранее спасибо
ОБНОВЛЕНИЕ, как 29/1
Я следовал шагам ответа, как упомянуто в этом посте. Kube-controller-manager не запускается при использовании "cloud-provider=aws" с kubeadm
1) Я изменил файл "/etc/systemd/system/kubelet.service.d/10-kubeadm.conf", добавив приведенную ниже команду в разделе [Сервис]
Environment="KUBELET_EXTRA_ARGS=--cloud-provider=aws --cloud-config=/etc/kubernetes/cloud-config.conf
И я создал этот cloud-config.conf, как показано ниже:
[Global]
KubernetesClusterTag=kubernetes
KubernetesClusterID=kubernetes
Я не уверен, что означают этот тег и идентификатор, но когда я запускаю приведенную ниже команду, я вижу вывод с упоминанием clusterName как "kubernetes"
kubeadm config view
Затем я казнил,
systemctl daemon-reload
system restart kubelet
2) Затем, как уже упоминалось, я добавил --cloud-provider=aws
в обоих kube-controller-manager.yaml и kube-apiserver.yaml
3) Я также добавил аннотацию ниже в manual-deploy.yaml моего приложения
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
Теперь, когда я развернул с помощью kubectl apply -f k8s/manual-deployment.yaml
сам стручок не создается, когда я проверил с kubectl get po --all-namespaces
Поэтому я попытался удалить шаг 2 выше и снова сделал развертывание, и теперь модуль успешно создается. Но все же это показывает <pending>
для ВНЕШНЕГО IP, когда я сделал kubectl get svc
Я даже переименовал свой главный и рабочий узлы, чтобы они были такими же, как и в частном DNS-экземпляре EC2: ip-10-118-6-35.ec2.internal и ip-10-118-11-225.ec2.internal, как упомянуто ниже в посте и перенастроил кластер но все равно не повезло. https://medium.com/jane-ai-engineering-blog/kubernetes-on-aws-6281e3a830fe (в разделе "Правильные имена узлов")
Кроме того, в моих экземплярах EC2 я вижу прикрепленную роль IAM, и когда я вижу подробности этого, я вижу, что к этой роли применено 8 политик. И в одной из политик я вижу это ниже, и есть много других действий, которые я не публикую здесь.
{
"Action": "elasticloadbalancing:*",
"Resource": "*",
"Effect": "Allow"
}
Я не знаю, если некоторые другие настройки мне не хватает. Пожалуйста, предложите!
ОБНОВЛЕНИЕ, как 30/1
Я сделал следующие дополнительные шаги, как упомянуто в этом блоге - https://blog.scottlowe.org/2018/09/28/setting-up-the-kubernetes-aws-cloud-provider/
1) Добавлены теги AWS для всех моих экземпляров EC2 (главного и рабочего узлов) как "kubernetes.io/cluster/kubernetes", а также для моей группы безопасности
2) Я не добавил apiServerExtraArgs, controllerManagerExtraArgs и nodeRegistration вручную в файле конфигурации. Но то, что я сделал, я полностью сбросил кластер, используя "sudo kubeadm reset -f"
а затем я добавил это в conf файл kubeadm как на главном, так и на рабочем узлах -
Environment="KUBELET_EXTRA_ARGS=--cloud-provider=aws --cloud-config=/etc/kubernetes/cloud-config.conf
cloud-config.conf -
[Global]
KubernetesClusterTag=kubernetes.io/cluster/kubernetes
KubernetesClusterID=kubernetes
Затем выполняется как в главном, так и в рабочем узлах -
systemctl daemon-reload
system restart kubelet
3) Теперь я создал кластер, используя команду ниже в главном узле
sudo kubeadm init --pod-network-cidr=192.168.1.0/16 --apiserver-advertise-address=10.118.6.35
4) Тогда мне удалось успешно присоединить рабочий узел к кластеру и развернуть фланелевый CNI.
После этого узлы get показывали статус Ready.
Важно отметить, что в пути /etc/kubernetes/manifest есть файлы kube-apiserver.yaml и kube-controller-manager.yaml.
Когда я добавил --cloud-provider=aws
в обоих этих файлах yaml моего развертывания не происходило, и pod вообще не создавался. Поэтому, когда я удалил тег --cloud-provider=aws
от kube-apiserver.yaml, развертывания и модули были успешными.
И по просьбе Мэтью, когда я изменил yaml для kube-apiserver и kube-controller-manager, оба модуля снова были успешно созданы. Но поскольку модули не создавались, я удалил тег из kube-apiserver.yaml в одиночку.
Кроме того, я проверил журналы с kubectl logs kube-controller-manager-ip-10-118-6-35.ec2.internal -n kube-system
Но я не вижу каких-либо исключений или отклонений. Я вижу это в последней части -
IO130 19:14:17.444485 1 event.go:221] Event(v1.ObjectReference{Kind:"Deployment", Namespace:"default", Name:"hello-kenzan", UID:"c........", APIVersion:"apps/v1", ResourceVersion:"16212", FieldPath:""}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: hello-kenzan-56686879-ghrhj
Даже попытался добавить эту аннотацию ниже к manual-deploy.yaml, но все еще показывает то же самое <Pending>
service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
Обновление как на 1/31
Наконец-то достигнут некоторый прогресс!! Проблема выглядит как сопоставление тегов. В отображении значения ключа для тегов aws у меня был ключ как KubernetesCluster и значение как k8s, но в файле конфигурации у меня был ключ, сопоставленный вместо значения.
Но теперь я вижу журналы в модуле kube-controller-manager -
`1 aws.go: 1041] Создание облачного провайдера AWS
1 aws.go:1007] Зона не указана в файле конфигурации; запрос сервиса метаданных AWS
1 controller manager.go:208] ошибка построения контекста контроллера: не удалось инициализировать провайдер облака: не удалось инициализировать провайдер облака "aws": экземпляр поиска ошибок i-02dbgfghjf3e7: "ошибка при перечислении экземпляров AWS: \"RequestError: сбой отправки запроса \ ncaused by: Post https://ec2.us-east-1.amazonaws.com/: dial tcp 54.239.28.176:443: тайм-аут ввода-вывода \"" `
Последнее обновление
Я не использовал прокси для *.amazonaws.com и, кажется, теперь подключаюсь. В этом смысле я говорю "похоже на подключение", проверяя журналы, которые я вижу только в журналах ниже, без той ошибки тайм-аута, которая возникала до добавления этого прокси-сервера. Я также удостоверился, что модуль контроллера перезапустился с моим редактированием и сохранением. И после этого я вижу ниже журналы -
`1 aws.go: 1041] Создание облачного провайдера AWS
1 aws.go:1007] Зона не указана в файле конфигурации; запрос сервиса метаданных AWS
Итак, я предполагаю, что мой контроллер может подключаться к облаку aws, верно? Но, к сожалению, все еще становится <pending>
когда я снова создал свой сервис:(
Обновление от 01/02
Чтобы упростить процесс, я создал myservices для балансировки нагрузки приложения aws и получил следующее DNS-имя, указанное в консоли aws - internal-myservices-987070943.us-east-1.elb.amazonaws.com
У меня также есть целевые группы, созданные и показанные ниже в разделе "Описание" - "Имя как myservices-LB", "Протокол как HTTPS", "Порт как 443", "Тип цели как экземпляр", "Балансировщик нагрузки как myservices". На вкладке "Цели" я вижу зарегистрированные цели, показывающие мой идентификатор экземпляра как i-02dbf9b3a7d9163e7 с портом 443 и другими деталями. Этот идентификатор экземпляра является моим экземпляром ec2, который я настроил в качестве главного узла моего кластера kubernetes.
Теперь, когда я пытаюсь получить доступ к DNS-имени LB напрямую с помощью URL-адреса - internal-myservices-987070943.us-east-1.elb.amazonaws.com/api/v1/namespace s/default/services, я получаю "Этот сайт может" не быть достигнут "
Принимая во внимание, что если я перенаправлю прокси с моего экземпляра главного узла, используя прокси-сервер kubectl - адрес 0.0.0.0 --accept-hosts '.*' И затем, если я получу прямой доступ к ip своего главного узла, как показано ниже, я смогу просмотреть - 10.118.6.35:8001/ API / v1 / пространств имен / по умолчанию / услуги
Разве невозможно получить доступ к службам kubernetes, развернутым как NodePort или Loadbalancer Type, чтобы они были доступны с использованием прямого DNS-имени AWS Loadbalancer?? Я даже проверил подключение, используя tracert internal-myservices-987070943.us-east-1.elb.amazonaws.com И я могу успешно достичь пункта назначения 10.118.12.196 за 18 прыжков
Но от моего экземпляра главного узла ec2 это не трассировка. Обычно у меня установлен прокси с помощью этой команды - "export {http, https, ftp} _proxy = http://proxy.ebiz.myorg.com/" И я могу получить доступ даже к внешним URL-адресам. Может ли это быть проблемой?
1 ответ
Вы объединяете две отдельные проблемы здесь.
Внешний IP-адрес отображается как Но, поскольку я создал тип loadbalancer, почему он не создает ip?
Предполагая, что это показывает <pending>
достаточно долго для вас, чтобы составить так вопрос об этом означает, что ваш controller-manager
стручки не имеют флагов командной строки --cloud-provider=aws
и сопровождающие --cloud-config=/the/path/here
и / или не имеют роли экземпляра IAM, которая позволяет этим модулям создавать балансировщики нагрузки от вашего имени.
Однако, сказав, что: исправление, которое создаст новый LoadBalancer, и он не будет использовать ваш существующий ALB. Это вдвойне верно, потому что type: LoadBalancer
создаст классический ELB, если не указано иное, чтобы сделать иначе
Я создал внутренний балансировочный балансировщик нагрузки приложения AWS и в консоли AWS показывает его состояние как активное. Обратите внимание, что я создал этот ALB, используя задание jenkins, и в задании я указал мой сервер экземпляров AWS EC2, который настроен как мой мастер kubernetes.
Прежде всего, как правило, вы должны опустить мастера из поворота, так как каждый NodePort
предоставляется каждому работнику в вашем кластере, и почти никогда не требуется, чтобы вы увеличивали нагрузку и трафик, проходящий через ведущие в вашем кластере. Кроме того, если вы не настроили это иначе, действительные блоки, обслуживающие байты для службы, не будут жить на основных устройствах, и, таким образом, сетевой трафик в любом случае придется перенаправлять.
Кроме того, вы хотели бы изменить свой сервис, чтобы быть type: NodePort
и укажите целевую группу ALB на этом порту:
spec:
ports:
- port: 80
targetPort: 80
selector:
app: hello-kenzan
tier: hello-kenzan
type: NodePort
Вы можете включить nodePort:
строфа в этом ports:
Если вы хотите, или вы можете просто оставить его пустым, и kubernetes назначит его, очень вероятно, начиная с вершины NodePort
Диапазон распределения портов и работы вниз. Вы можете узнать, какой он выбрал через kubectl get -o yaml svc hello-kenzan