Представление приложения kubernetes с помощью AWS Elastic LoadBalancer - PullRequest
0 голосов
/ 28 января 2019

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

Это показывает External-IP как <pending> Но так как я создал балансировщик нагрузкитипа, почему он не создает 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

https://github.com/kenzanlabs/kubernetes-ci-cd/blob/master/applications/hello-kenzan/k8s/manual-deployment.yaml

Сейчас,при развертывании с использованием kubectl apply -f k8s/manual-deployment.yaml сам модуль не создавался, когда я проверял с помощью kubectl get po --all-namespaces

, поэтому я попытался удалить шаг 2, описанный выше, и снова сделал развертывание, и теперь модуль успешно создается.Но все же он показывает <pending> для ВНЕШНЕГО IP, когда я сделал kubectl get svc

Я даже переименовал свой главный и рабочий узлы, чтобы они были такими же, как в Экземпляре EC2 Частный DNS: 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 показывали состояние «Готов».

Следует отметить один важный момент: в пути / 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 контроллер 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

Хорошо, чтобы упростить процесс, я создал загрузку приложения awsБалансировщик myservices, и я получил следующее 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 Я получаю сообщение «Этот сайт недоступен»

Принимая во внимание, что если я перенаправлю прокси с моего главного сервераode экземпляр, использующий прокси-сервер kubectl - адрес 0.0.0.0 --accept-hosts '. *' И затем, если я получаю прямой доступ к ip своего главного узла, как показано ниже, я могу просматривать - 10.118.6.35:8001/api/v1/namespaces/default / services

Разве невозможно получить доступ к службам kubernetes, развернутым как NodePort или Loadbalancer Type, чтобы они были доступны с использованием прямого имени AWS Loadbalancer DNS?Я даже проверил подключение, используя 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:80" И я могу получить доступ даже к внешним URL-адресам. Может ли это быть проблемой?

1 Ответ

0 голосов
/ 29 января 2019

Здесь вы объединяете две отдельные проблемы.

Он показывает External-IP как. Но поскольку я создал тип loadbalancer, почему он не создает ip?

Если предположить, что он показывает <pending> достаточно долго, чтобы вы могли составить SO вопрос, это означает, что ваши controller-manager модули не имеют флагов командной строки --cloud-provider=aws и сопровождающих --cloud-config=/the/path/here и / илиу вас нет роли экземпляра IAM, которая позволяет этим модулям создавать балансировщики нагрузки от вашего имени.

Однако, сказав, что: исправление, которое создаст новый LoadBalancer, и он не будет использоватьваш существующий ALB.Это вдвойне верно, потому что type: LoadBalancer создаст классический ELB, если не аннотирован для других действий

Я создал внутренний балансировочный балансировщик нагрузки приложения AWS и в консоли AWS показывает его состояние как активное,Обратите внимание, что я создал этот ALB, используя задание jenkins, и в задании я указал свой сервер экземпляров AWS EC2, который настроен как мой мастер kubernetes.

Foremost, в общем youследует пропустить мастера из ротации, так как каждый 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...