nginx-ingress не перенаправляет на панель управления

Привет и спасибо, что нашли время прочитать мой вопрос.

Во-первых, у меня есть кластер EKS для использования общедоступных и частных подсетей.

Я создал кластер с использованием облачной информации, как описано в https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#vpc-create

Затем я инициализировал helm, создав учетную запись службы для tiller через kubectl apply -f (below file):

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

а затем helm init --service-account=tiller, за которым следует helm repo update

Затем я использовал helm для установки контроллера nginx-ingress через:

helm install --name nginx-ingress \
        --namespace nginx-project \
        stable/nginx-ingress \
        -f nginx-ingress-values.yaml

где мой nginx-ingress-values.yaml:

controller:
  service:
    annotations:
      service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "60"
      service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"
      service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "abc-us-west-2-elb-access-logs"
      service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "vault-cluster/nginx"
      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456789:certificate/bb35b4c4-..."
      service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
      service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
      service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"

И пока все выглядит отлично, я вижу, что ELB создан и подключен для использования acm для https

Затем я устанавливаю kubernetes-dashboard через:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

и я могу получить к нему доступ через kubectl proxy

Но когда я добавляю правило входа для панели управления через: kubectl apply -f dashboard-ingress.yaml Где dashboard-ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  namespace: kube-system
spec:
#  tls:
#  - hosts:
#    - abc.def.com
  rules:
  - host: abc.def.com
    http:
      paths:
      - path: /dashboard
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 8443

затем, когда я пытаюсь перейти на http://abc.def.com/, я застреваю в бесконечном перенаправлении петля.

то же самое для https://abc.def.com/ и http://abc.def.com/dashboard

Я новичок в кубернетах и ​​очень зациклился на этом. Любая помощь будет очень признательна

ОБНОВЛЕНИЕ - 05.09.2019: когда я вынимаю блок tls из ingress.yaml, я получаю

на серверную часть nginx, но http://abc.def.com перенаправляет меня на https://abc.def.com, и я получаю 502 Bad Gateway от openresty / 1.15.8.1

когда я затем пытаюсь перейти на https://abc.def.com/dashboard

Я получаю сообщение «404 страница не найдена», что является ответом контроллера nginx-ingress, насколько я понимаю.

ОБНОВЛЕНИЕ - 06.09.2019: Большое спасибо mk_sta за ответ ниже, который помог мне понять, чего мне не хватало.

Для тех, кто читает это в будущем, моя установка nginx-ingress через helm работает, как и ожидалось, но в моей установке kubernetes-dashboard отсутствовали некоторые ключевые аннотации. В конце концов я смог настроить helm для установки kubernetes-dashboard через:

helm install --name kubernetes-dashboard \
    --namespace kube-system \
    stable/kubernetes-dashboard \
    -f kubernetes-dashboard-values.yaml

где kubernetes-dashboard-values.yaml - это:

ingress:
  enabled: true
  hosts: [abc.def.com]
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  paths: [/dashboard(/|$)(.*)]

Затем я могу получить доступ к панели управления по адресу http://abc.def.com/dashboard/ и https://abc.def.com/dashboard/

По какой-то причине, если я оставлю косую черту в конце, это не сработает.

На данный момент для меня этого достаточно.


person gh4x    schedule 05.09.2019    source источник


Ответы (2)


Мне кажется, что вы использовали неправильный путь /dashboard в своей конфигурации origin Ingress, тем более соответствующий Панель управления K8s UI по умолчанию отображается на 443 порте для соответствующих K8s Service, если вы не настраивали этот параметр.

ports:
- port: 443
  protocol: TCP
  targetPort: 8443

Чтобы получить маршрутизацию на основе правильного пути, переопределите существующие параметры со следующими аргументами:

paths:
- path: /
  backend:
    serviceName: kubernetes-dashboard
    servicePort: 443

После того как вы решили получить доступ к интерфейсу панели управления K8s через URL-адрес держателя косвенного пути (https://abc.def.com/dashboard), вы можете управлять применением Перепишите правила, чтобы прозрачно изменить часть аутентичного URL и передавать запросы по верному целевому пути. Фактически, Nginx Ingress-контроллер добавляет эту функциональность через специальный nginx.ingress.kubernetes.io/rewrite-target аннотация:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  namespace: kube-system
spec:
#  tls:
#  - hosts:
#    - abc.def.com
  rules:
  - host: abc.def.com
    http:
      paths:
      - path: /dashboard(/|$)(.*)
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
person Nick_Kh    schedule 06.09.2019

Это может произойти, если ваш кластер не имеет nginx в качестве входного класса по умолчанию, и в вашем входном манифесте он не указан.

Вы можете попробовать одно из следующих действий: - Обновите установку NGINX-ingress, установив controller.ingressClass на nginx (при этом все созданные входящие подключения будут использовать NGINX-ingress по умолчанию) - Добавьте аннотацию kubernetes.io/ingress.class: nginx в свой входящий yaml, чтобы указать, что вы хотите NGINX -ингресс, чтобы справиться с этим.

person Ramiro Berrelleza    schedule 06.09.2019
comment
Спасибо за предложение, но я проверил, и это настройка по умолчанию в диаграмме управления: github.com/helm/charts/blob/master/stable/nginx-ingress/ - person gh4x; 07.09.2019