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