Вход Kubernetes не работает, бэкэнд по умолчанию 404

Я новичок в Kubernetes. Я использую управляемую службу GKE для K8S. Есть 2 развертывания nginx, httpd и созданные службы NodePort для этих 2 развертываний.

Я пытаюсь создать правило входа для служб. Контроллер входящего трафика nginx устанавливается через helm. У меня есть домен от freenom, и я настроил облачный DNS Google для использования статического общедоступного IP-адреса. Когда я пытаюсь попасть на входящий URL (домен / nginx), он дает:

бэкэнд по умолчанию - 404


Развертывание:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
  replicas: 1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd
  labels:
    name: httpd
spec:
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
        - name: httpd
          image: httpd
  replicas: 1

Услуги:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort

То же, что и для службы httpd

Вход:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.global-static-ip-name: testingk8s
spec:
  rules:
    - host: xyz.tk
      http: 
        paths:
          - path: /nginx
            backend:
              serviceName: nginx-service
              servicePort: 80
          - path: /httpd
            backend:
              serviceName: httpd-service
              servicePort: 80

Описание Ingress:

Default backend:  default-http-backend:80 (10.48.0.7:8080)
Rules:
  Host           Path  Backends
  ----           ----  --------
  xyz.tk
                 /nginx   nginx-service:80 (10.48.0.25:80)
                 /httpd   httpd-service:80 (10.48.0.26:80)
Annotations:     ingress.kubernetes.io/backends:
                   {"k8s-be-30916--413d33a91e61ca5d":"HEALTHY","k8s-be-31376--413d33a91e61ca5d":"HEALTHY","k8s-be-32702--413d33a91e61ca5d":"HEALTHY"}

Журналы Ingress Controller Pod:

I0812 09:38:34.405188       6 event.go:278] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"nginx", Name:"test", UID:"61991dbd-a361-47d2-88cc-548a7c43e743", APIVersion:"networking.k8s.io/v1beta1", ResourceVersion:"316030", FieldPath:""}): type: 'Normal' reason: 'CREATE' Ingress nginx/test
I0812 09:38:34.405815       6 controller.go:139] Configuration changes detected, backend reload required.
I0812 09:38:34.532163       6 controller.go:155] Backend successfully reloaded.
I0812 09:38:41.369315       6 status.go:275] updating Ingress nginx/test status from [] to [{35.192.136.218 }]
I0812 09:38:41.374080       6 event.go:278] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"nginx", Name:"test", UID:"61991dbd-a361-47d2-88cc-548a7c43e743", APIVersion:"networking.k8s.io/v1beta1", ResourceVersion:"316057", FieldPath:""}): type: 'Normal' reason: 'UPDATE' Ingress nginx/test


person Kulandesu    schedule 10.08.2020    source источник
comment
Всего одно небольшое замечание. Вы используете NodePort как тип службы. Если вы открываете его через контроллер входящего трафика, обычно тип службы ClusterIP тогда.   -  person Lauri    schedule 11.08.2020


Ответы (2)


Добавьте аннотации kubernetes.io/ingress.class: nginx и nginx.ingress.kubernetes.io/rewrite-target: /. Итак, вход выглядит так, как показано ниже

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: xyz.tk
      http: 
        paths:
          - path: /nginx
            backend:
              serviceName: nginx-service
              servicePort: 80
          - path: /httpd
            backend:
              serviceName: httpd-service
              servicePort: 80
person Arghya Sadhu    schedule 10.08.2020
comment
Спасибо, вход все еще не работает после обновления аннотаций. - person Kulandesu; 11.08.2020
comment
Отредактируйте вопрос, чтобы добавить журналы из модулей контроллера входа nginx - person Arghya Sadhu; 11.08.2020

Когда вы устанавливаете диаграмму HELM, для nginx-insgress создается LoadBalancer со случайным IP-адресом, и по этой причине вы не можете использовать предварительно созданный IP-адрес в loadBalancer.

Попробуйте установить диаграмму HELM с настроенным controller.service.loadBalancerIP:

controller.service.loadBalancerIP IP-адрес для назначения балансировщику нагрузки (если поддерживается)

helm install --name nginx-ingress stable/nginx-ingress \
      --set controller.service.loadBalancerIP=<YOUR_EXTERNAL_IP>

ПРИМЕЧАНИЕ: ваш IP-адрес должен находиться в том же регионе кластера. См. Эту документацию

person Mr.KoopaKiller    schedule 11.08.2020