Возвращение Кубернетеса 404 - PullRequest
0 голосов
/ 23 июня 2019

У меня Kubernetes работает в Docker для Windows.

Я использую входной контроллер NGINX, я применил mandatory.yaml и cloud-generic.yaml.

> kubectl get services -n ingress-nginx
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.110.198.161   localhost     80:30037/TCP,443:31218/TCP   5h

У меня естьобраз в моем локальном реестре test-app/mock-service:1.0.0, который предоставляет порт 8080, на котором работает сервер с одной конечной точкой GET /mocks.Запуск этого в Docker с использованием docker run -d -p 8080:8080 test-app/mock-service:1.0.0 работает, и я вижу ожидаемый результат.

Я собираюсь развернуть это с использованием Kubernetes.

Я создал ресурс развертывания и обслуживания:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test-app-mock-service-deployment
  namespace: test-app
spec:
  selector:
    matchLabels:
      app: test-app-mock-service
  replicas: 1
  template:
    metadata:
      labels:
        app: test-app-mock-service
    spec:
      containers:
      - name: test-app-mock-service-container
        image: "test-app/mock-service:1.0.0"
---
apiVersion: v1
kind: Service
metadata:
  name: test-app-mock-service
  namespace: test-app
spec:
  type: ClusterIP
  selector:
    app: test-app-mock-service
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP

И входной ресурс:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-app-ingress
  namespace: test-app
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - http:
      paths:
      - path: /mocks
        backend:
          serviceName: test-app-mock-service
          servicePort: 8080

Я вижу службу:

> kubectl get services -n test-app
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
test-app-mock-service   ClusterIP   10.108.10.246   <none>        8080/TCP   1h

И пакет:

> kubectl get pods -n test-app
NAME                                                READY     STATUS    RESTARTS   AGE
test-app-mock-service-deployment-6b9b58fcb9-mdskn   1/1       Running   0          59m

Я вижувход:

> kubectl describe ingress test-app-ingress -n test-app
Name:             test-app-ingress
Namespace:        test-app
Address:          localhost
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *
        /mocks  test-app-mock-service:8080 (<none>)
Annotations:
  ingress.kubernetes.io/ssl-redirect:                true
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"ingress.kubernetes.io/ssl-redirect":"true"},"name":"test-app-ingress","namespace":"test-app"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"test-app-mock-service","servicePort":8080},"path":"/mocks"}]}}]}}

Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  CREATE  1h                nginx-ingress-controller  Ingress test-app/test-app-ingress
  Normal  UPDATE  53m (x2 over 1h)  nginx-ingress-controller  Ingress test-app/test-app-ingress

Однако, когда я перехожу к http://localhost/mocks, я получаю 308 до https://localhost/mocks, где я получаю 404.

Я не уверен, что вход неправильныйнастроен или если это другая проблема.

1 Ответ

0 голосов
/ 23 июня 2019

Вероятно, происходит то, что часть SSL использует SNI, и поскольку нет никакого хоста или установленного по умолчанию бэкенда, nginx не знает, куда отправить запрос.Есть две вещи, которые вы можете сделать, чтобы решить эту проблему:

Бэкэнд по умолчанию

Вы можете добавить аннотацию, чтобы установить бэкэнд по умолчанию для запросов без хоста или маршрута.Документация для этого на https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#default-backend. В вашем примере это будет:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-app-ingress
  namespace: test-app
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/default-backend: test-app-mock-service
spec:
  rules:
  - http:
      paths:
      - path: /mocks
        backend:
          serviceName: test-app-mock-service
          servicePort: 8080

Добавить хосты

Ваша спецификация не содержит имени хоста TLS.Добавление должно позволить SNI знать, какое имя необходимо использовать для указанных правил маршрутизации:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-app-ingress
  namespace: test-app
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/default-backend: test-app-mock-service
spec:
  tls:
  - hosts:
    - localhost
    secretName: tls-secret
  rules:
  - http:
      paths:
      - path: /mocks
        backend:
          serviceName: test-app-mock-service
          servicePort: 8080

Хотя, если вы используете самозаверяющий сертификат, вам, вероятно, потребуется найти его имя.Возможно, вам придется создать свой собственный.См. https://kubernetes.github.io/ingress-nginx/user-guide/tls/ для получения дополнительной информации об этом.

...