Следуя учебнику по авторизации TCP-трафика в Istio, я получаю “соединение отклонено” вместо “соединение успешно”.

Вопрос или проблема

Я следую учебному пособию по авторизации безопасности Istio TCP Traffic tutorial.

На шаге 5 проверка успешной коммуникации sleep с tcp-echo на порту 9002 я получаю результат connection rejected, а не connection succeeded, который указывает учебник.

user@docker-host-01:~/istio-1.20.1$ kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" \
>     -c sleep -n foo -- sh -c \
>     'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
hello port 9000
connection succeeded

user@docker-host-01:~/istio-1.20.1$ kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" \
>     -c sleep -n foo -- sh -c \
>     'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
hello port 9001
connection succeeded

user@docker-host-01:~/istio-1.20.1$ TCP_ECHO_IP=$(kubectl get pod "$(kubectl get pod -l app=tcp-echo -n foo -o jsonpath={.items..metadata.name})" -n foo -o jsonpath="{.status.podIP}")
user@docker-host-01:~/istio-1.20.1$ kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" \
>     -c sleep -n foo -- sh -c \
>     "echo \"port 9002\" | nc $TCP_ECHO_IP 9002" | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
connection rejected

user@docker-host-01:~/istio-1.20.1$ echo $TCP_ECHO_IP
10.244.0.27

user@docker-host-01:~/istio-1.20.1$ kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})"     -c sleep -n foo -- sh -c     "echo \"port 9002\" | nc $TCP_ECHO_IP 9002"

user@docker-host-01:~/istio-1.20.1$

Логи, приведенные ниже, показывают, что сообщение отправляется из пода sleep, но не получает подом tcp-echo. Если я правильно понимаю, запись лога о том, что соединение с 10.244.0.27:9002 было маршрутизировано к PassthroughCluster, указывает, что маршрутизация по IP неправильная, тогда как по имени пода она работает правильно в предыдущих записях.

user@docker-host-01:~/istio-1.20.1$ kubectl logs -l app=sleep -c istio-proxy -n foo
[2024-01-01T14:59:50.262Z] "- - -" 0 - - - "-" 10 16 9 - "-" "-" "-" "-" "10.244.0.27:9000" outbound|9000||tcp-echo.foo.svc.cluster.local 10.244.0.26:52798 10.111.194.106:9000 10.244.0.26:36087 - -
[2024-01-01T14:59:54.343Z] "- - -" 0 - - - "-" 10 16 9 - "-" "-" "-" "-" "10.244.0.27:9001" outbound|9001||tcp-echo.foo.svc.cluster.local 10.244.0.26:43342 10.111.194.106:9001 10.244.0.26:42365 - -
[2024-01-01T15:00:02.734Z] "- - -" 0 - - - "-" 10 0 0 - "-" "-" "-" "-" "10.244.0.27:9002" PassthroughCluster 10.244.0.26:33738 10.244.0.27:9002 10.244.0.26:33999 - -
2024-01-01T15:02:03.306941Z     info    xdsproxy        connected to upstream XDS server: istiod.istio-system.svc:15012
[2024-01-01T15:03:52.319Z] "- - -" 0 - - - "-" 10 0 0 - "-" "-" "-" "-" "10.244.0.27:9002" PassthroughCluster 10.244.0.26:34762 10.244.0.27:9002 10.244.0.26:44177 - -

user@docker-host-01:~/istio-1.20.1$ kubectl logs -l app=tcp-echo -c istio-proxy -n foo
[2024-01-01T14:59:50.263Z] "- - -" 0 - - - "-" 554 590 8 - "-" "-" "-" "-" "10.244.0.27:9000" inbound|9000|| 127.0.0.6:58755 10.244.0.27:9000 10.244.0.26:52798 outbound_.9000_._.tcp-echo.foo.svc.cluster.local -
[2024-01-01T14:59:54.344Z] "- - -" 0 - - - "-" 554 590 8 - "-" "-" "-" "-" "10.244.0.27:9001" inbound|9001|| 127.0.0.6:43015 10.244.0.27:9001 10.244.0.26:43342 outbound_.9001_._.tcp-echo.foo.svc.cluster.local -

Я буду признателен за помощь в понимании, почему моя среда вызывает расхождение команд учебника с ожидаемым выводом и как это исправить. Спасибо!

Детали окружения:

  • minikube v1.32.0 на Ubuntu 20.04
  • Kubernetes v1.28.3 на Docker 24.0.7
  • bridge CNI
  • istio v1.20.1

Во-первых, проверьте, есть ли AuthorizationPolicy, который может блокировать трафик:

bash
kubectl get authorizationpolicies -n foo

Если есть тот, который может блокировать порт 9002:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: tcp-policy
  namespace: foo
spec:
  selector:
    matchLabels:
      app: tcp-echo
  action: ALLOW  # или DENY
  rules:
  - to:
    - operation:
        ports: ["9000", "9001"]  # Убедитесь, что 9002 включен, если он должен быть разрешен

Обновите или создайте AuthorizationPolicy, чтобы разрешить трафик на порту 9002:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: tcp-policy
  namespace: foo
spec:
  selector:
    matchLabels:
      app: tcp-echo
  action: ALLOW
  rules:
  - to:
    - operation:
        ports: ["9000", "9001", "9002"]

Проверьте конфигурацию службы Kubernetes:
проверьте, определен ли порт 9002 в вашем tcp-echo сервисе:

bash
kubectl get service tcp-echo -n foo -o yaml

Если нет, обновите или создайте службу, чтобы включить порт 9002:

apiVersion: v1
kind: Service
metadata:
  name: tcp-echo
  namespace: foo
spec:
  selector:
    app: tcp-echo
  ports:
  - name: port-9000
    port: 9000
    targetPort: 9000
  - name: port-9001
    port: 9001
    targetPort: 9001
  - name: port-9002
    port: 9002
    targetPort: 9002

Ответ или решение

В процессе настройки Istio для маршрутизации TCP-трафика часто возникают сложности, особенно если следовать официальному руководству и сталкиваться с ошибкой «connection rejected». Давайте подробно разберемся в причинах возникновения этой проблемы и способах её устранения, учитывая ваш опыт и техническую подготовку.

Понимание проблемы

Вы пытаетесь подключиться к сервису tcp-echo на порту 9002, после успешного подключения к портам 9000 и 9001. Это указывает, что конфигурация сети в общем работает, но существуют проблемы с правилами маршрутизации или авторизации именно для порта 9002.

Анализ конфигурации и поиск решений

1. Проверка AuthorizationPolicy

Первым шагом необходимо убедиться, что на уровне политики авторизации не блокируется трафик на порт 9002. Выполните команду, чтобы просмотреть существующие политики авторизации в пространстве имен foo:

kubectl get authorizationpolicies -n foo

Если вы видите политику, которая разрешает трафик только для портов 9000 и 9001, необходимо включить в неё порт 9002. Пример измененной политики авторизации может выглядеть следующим образом:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: tcp-policy
  namespace: foo
spec:
  selector:
    matchLabels:
      app: tcp-echo
  action: ALLOW
  rules:
  - to:
    - operation:
        ports: ["9000", "9001", "9002"]

2. Проверка конфигурации Kubernetes Service

Следующим шагом проверьте конфигурацию сервиса tcp-echo. Порт 9002 должен быть включен в конфиг:

kubectl get service tcp-echo -n foo -o yaml

Если порта 9002 нет, добавьте его следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: tcp-echo
  namespace: foo
spec:
  selector:
    app: tcp-echo
  ports:
  - name: port-9000
    port: 9000
    targetPort: 9000
  - name: port-9001
    port: 9001
    targetPort: 9001
  - name: port-9002
    port: 9002
    targetPort: 9002

Проверка работы сети

Проверьте, что поды могут взаимно "видеть" друг друга и что внутренняя сеть Kubernetes работает корректно. Ошибка маршрутизации на уровне PassthroughCluster обычно указывает на то, что запрос не был корректно сопоставлен с конфигурациями Istio, что может быть связано с неправильной конфигурацией сценариев привлечения.

Итог

Эти шаги помогут вам в устранении проблемы с подключением на порт 9002 и обеспечат успешное использование Istio в вашей инфраструктуре. Уделите внимание правильной настройке сетевых политик, чтобы минимизировать риск подобных сбоев в будущем. Убедитесь, что все конфигурации сервисов и политик соответствуют требованиям безопасности и сетевого взаимодействия Kubernetes.

Оцените материал
Добавить комментарий

Капча загружается...