Код-ревью Middle Service и Ingress обновлено

Ревью: Service и Ingress

Вопрос

Поды Deployment имеют метки app: shop, tier: api и слушают порт 3000. Найди ошибки в манифестах.

apiVersion: v1
kind: Service
metadata:
  name: shop-api
spec:
  type: NodePort
  selector:
    app: shop-api
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop
spec:
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: shop
                port:
                  number: 80

Коротко

Исправленные манифесты: Хорошая привычка: давать порту контейнера имя (name: http) и ссылаться на него targetPort: http, тогда смена номера порта не ломает сервис.

Что должен найти ревьюер

  1. Безопасностьстрока 6
    NodePort не нужен за Ingress: он открывает порт на каждом узле в обход Ingress. Достаточно ClusterIP.
  2. Ошибкастрока 8
    Селектор app: shop-api не совпадает с метками подов app: shop: эндпоинтов не будет. Нужно app: shop, tier: api.
  3. Ошибкастрока 11
    targetPort: 8080, а приложение слушает 3000: соединения будут отклонены.
  4. Ошибкастрока 17
    Нет ingressClassName: если в кластере нет класса по умолчанию, Ingress не будет обработан ни одним контроллером.
  5. Безопасностьстрока 19
    Нет секции tls: трафик идёт по HTTP без шифрования. Нужен TLS-секрет (например, от cert-manager).
  6. Ошибкастрока 26
    Бэкенд ссылается на сервис shop, а сервис называется shop-api.

Разбор

Исправленные манифесты:

apiVersion: v1
kind: Service
metadata:
  name: shop-api
spec:
  selector:
    app: shop
    tier: api
  ports:
    - port: 80
      targetPort: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop
spec:
  ingressClassName: nginx
  tls:
    - hosts: [shop.example.com]
      secretName: shop-tls
  rules:
    - host: shop.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: shop-api
                port:
                  number: 80

Хорошая привычка: давать порту контейнера имя (name: http) и ссылаться на него targetPort: http, тогда смена номера порта не ломает сервис.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме