Как проверить, была ли применена сетевая политика для pod?
Я пытаюсь ограничить свой openvpn разрешением доступа к внутренней инфраструктуре и ограничить его только с помощью "пространства разработки", поэтому я начал с простой политики, которая запрещает весь исходящий трафик и не видит никакого эффекта или какой-либо обратной связи от кластера, к которому он был применен. Прочитал все документы, как официальные, так и нет, и не нашел решения, вот моя политика:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: policy-openvpn
namespace: default
spec:
podSelector:
matchLabels:
app: openvpn
policyTypes:
- Egress
egress: []
Я применил сетевую политику выше с kubectl apply -f policy.yaml
команда, но я не вижу никакого эффекта от этой политики, я все еще могу подключиться к чему-либо из моего модуля openvpn, как отладить это и посмотреть, что не так с моей политикой?
Мне кажется, что это черный ящик, и что я могу сделать, так это метод try-error, который, похоже, не работает.
Как я могу проверить, что он находит модули и применяет к ним политику?
Я использую последний кластер kubernetes, предоставленный GKE
Я заметил, что я не проверял "использовать networkpolicy" в облачных настройках Google, и после того, как я проверил, мой vpn просто перестал работать, но я не знаю, как это проверить, или почему vpn просто позволяет мне подключаться и блокирует все сетевые запросы Очень странно, есть ли способ отладки вместо случайного изменения материала?
4 ответа
GKE использует бязь для реализации сетевой политики. Перед применением сетевой политики необходимо включить сетевую политику для мастера и узлов. Вы можете проверить, включен ли calico, посмотрев на модули calico в пространстве имен kube-system.
kubectl get pods --namespace=kube-system
Для проверки сетевых политик вы можете увидеть следующие команды.
kubectl get networkpolicy
kubectl describe networkpolicy <networkpolicy-name>
При запуске вы можете проверить метку, используемую для селектора POD:
k describe netpol <networkpolicy-name>
Name: <networkpolicy-name>
Namespace: default
Created on: 2020-06-08 15:19:12 -0500 CDT
Labels: <none>
Annotations: Spec:
PodSelector: app=nginx
Селектор подов покажет вам, какие метки применены и к этому нетполу. Затем вы можете представить все капсулы с этим ярлыком:
k get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-f7b9c7bb-5lt8j 1/1 Running 0 19h
nginx-deployment-f7b9c7bb-cf69l 1/1 Running 0 19h
nginx-deployment-f7b9c7bb-cxghn 1/1 Running 0 19h
nginx-deployment-f7b9c7bb-ppw4t 1/1 Running 0 19h
nginx-deployment-f7b9c7bb-v76vr 1/1 Running 0 19h
Отладка с помощью netcat(nc):
$ kubectl exec <openvpnpod> -- nc -zv -w 5 <domain> <port>
PS: Чтобы запретить весь исходящий трафик, не нужно объявлять
spec.egress
key как пустой массив, однако он влияет на то же самое:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: policy-openvpn
namespace: default
spec:
podSelector:
matchLabels:
app: openvpn
policyTypes:
- Egress
ссылка: https://kubernetes.io/docs/reference/kubernetes-api/policy-resources/network-policy-v1/
- egress ([]NetworkPolicyEgressRule) ... Если это поле пусто, то эта NetworkPolicy ограничивает весь исходящий трафик (и служит исключительно для обеспечения того, чтобы выбранные ею модули были изолированы по умолчанию). ...
Проверить, действительно ли политики применяются к поду, можно с помощью тестирования. Есть несколько вещей, которые могут пойти не так, а именно: сетевые политики размещены в пространстве имен и на самом деле на метках, плюс их необходимо настроить, установив соответствующий плагин. Ярлыки, с другой стороны, являются свойствами модуля (в наблюдаемом случае), и поэтому люди часто забывают проверить метки, и вуаля модуль не ограничен. Чтобы проверить, применяются ли политики, можно протестировать: попробуйте это с помощью CURL, подключенного к модулям, которые могут или не могут иметь доступ к этому конкретному модуле. Что может помочь, так это следующее, однако у меня не было возможности проверить это.