Вопрос или проблема
Я следую учебному пособию по авторизации безопасности 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.