Ваши NetworkPolicy
объекты верны , я создал с ними пример и продемонстрирую ниже.
Если у вас все еще есть доступ к службе в другом пространстве имен с использованием FQDN, ваш NetworkPolicy
может быть не полностью включен в вашем кластере.
Запустите gcloud container clusters describe "CLUSTER_NAME" --zone "ZONE"
и найдите эти два фрагмента:
- В начале описания отображается, включен ли подключаемый модуль NetworkPolicy на уровне мастера , он должен будет выглядеть так:
addonsConfig:
networkPolicyConfig: {}
- В середине описания вы можете найти, включена ли NetworkPolicy на узлах . Это должно выглядеть так:
name: cluster-1
network: default
networkConfig:
network: projects/myproject/global/networks/default
subnetwork: projects/myproject/regions/us-central1/subnetworks/default
networkPolicy:
enabled: true
provider: CALICO
Воспроизведение:
- Я создам простой пример, я буду использовать изображение
gcr.io/google-samples/hello-app:1.0
для tenant1 и gcr.io/google-samples/hello-app:2.0
для tenant2, поэтому проще увидеть, где он подключается, но я буду использовать имена вашей среды:
$ kubectl create namespace tenant1
namespace/tenant1 created
$ kubectl create namespace tenant2
namespace/tenant2 created
$ kubectl run -n tenant1 grafana-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:1.0
pod/grafana-app created
$ kubectl run -n tenant1 postgres-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:1.0
pod/postgres-app created
$ kubectl run -n tenant2 grafana-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:2.0
pod/grafana-app created
$ kubectl run -n tenant2 postgres-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:2.0
pod/postgres-app created
$ kubectl expose pod -n tenant1 grafana-app --port=8080 --type=LoadBalancer
service/grafana-app exposed
$ kubectl expose pod -n tenant1 postgres-app --port=8080 --type=NodePort
service/postgres-app exposed
$ kubectl expose pod -n tenant2 grafana-app --port=8080 --type=LoadBalancer
service/grafana-app exposed
$ kubectl expose pod -n tenant2 postgres-app --port=8080 --type=NodePort
service/postgres-app exposed
$ kubectl get all -o wide -n tenant1
NAME READY STATUS RESTARTS AGE IP NODE
pod/grafana-app 1/1 Running 0 100m 10.48.2.4 gke-cluster-114-default-pool-e5df7e35-ez7s
pod/postgres-app 1/1 Running 0 100m 10.48.0.6 gke-cluster-114-default-pool-e5df7e35-c68o
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/grafana-app LoadBalancer 10.1.23.39 34.72.118.149 8080:31604/TCP 77m run=grafana-app
service/postgres-app NodePort 10.1.20.92 <none> 8080:31033/TCP 77m run=postgres-app
$ kubectl get all -o wide -n tenant2
NAME READY STATUS RESTARTS AGE IP NODE
pod/grafana-app 1/1 Running 0 76m 10.48.4.8 gke-cluster-114-default-pool-e5df7e35-ol8n
pod/postgres-app 1/1 Running 0 100m 10.48.4.5 gke-cluster-114-default-pool-e5df7e35-ol8n
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/grafana-app LoadBalancer 10.1.17.50 104.154.135.69 8080:30534/TCP 76m run=grafana-app
service/postgres-app NodePort 10.1.29.215 <none> 8080:31667/TCP 77m run=postgres-app
- Теперь давайте развернем ваши два правила: Первое блокирует весь трафик c из вне пространства имен, второй разрешающий вход
grafana-app
извне пространства имен:
$ cat default-deny-other-ns.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
$ cat allow-grafana-ingress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
run: grafana-app
ingress:
- from: []
По умолчанию поды не изолированы; они принимают трафик c из любого источника.
Поды становятся изолированными, поскольку их выбирает NetworkPolicy. Как только в пространстве имен есть какая-либо NetworkPolicy, выбирающая конкретный модуль, этот модуль будет отклонять любые соединения, которые не разрешены никакими NetworkPolicy. (Другие модули в пространстве имен, которые не выбраны какой-либо NetworkPolicy, будут продолжать принимать весь трафик c.)
Сетевые политики не конфликтуют; они аддитивные . Если какая-либо политика или политики выбирают модуль, модуль ограничивается тем, что разрешено объединением этих политик 'правил входа / выхода. Таким образом, порядок оценки не влияет на результат политики.
- Затем мы применим правила к обоим пространствам имен, поскольку область действия правила - это пространство имен, которому оно назначено:
$ kubectl apply -n tenant1 -f default-deny-other-ns.yaml
networkpolicy.networking.k8s.io/deny-from-other-namespaces created
$ kubectl apply -n tenant2 -f default-deny-other-ns.yaml
networkpolicy.networking.k8s.io/deny-from-other-namespaces created
$ kubectl apply -n tenant1 -f allow-grafana-ingress.yaml
networkpolicy.networking.k8s.io/web-allow-external created
$ kubectl apply -n tenant2 -f allow-grafana-ingress.yaml
networkpolicy.networking.k8s.io/web-allow-external created
- Теперь для окончательного тестирования я войду внутрь
grafana-app
в tenant1
и попытаюсь достичь postgres-app
в обоих пространствах имен и проверить вывод:
$ kubectl exec -n tenant1 -it grafana-app -- /bin/sh
/ ### POSTGRES SAME NAMESPACE ###
/ # wget -O- postgres-app:8080
Connecting to postgres-app:8080 (10.1.20.92:8080)
Hello, world!
Version: 1.0.0
Hostname: postgres-app
/ ### GRAFANA OTHER NAMESPACE ###
/ # wget -O- --timeout=1 http://grafana-app.tenant2.svc.cluster.local:8080
Connecting to grafana-app.tenant2.svc.cluster.local:8080 (10.1.17.50:8080)
Hello, world!
Version: 2.0.0
Hostname: grafana-app
/ ### POSTGRES OTHER NAMESPACE ###
/ # wget -O- --timeout=1 http://postgres-app.tenant2.svc.cluster.local:8080
Connecting to postgres-app.tenant2.svc.cluster.local:8080 (10.1.29.215:8080)
wget: download timed out
- Вы можете видеть, что DNS разрешен, но сетевая политика блокирует доступ к бэкэнд-модулям.
Если после двойной проверки NetworkPolicy включена на Master и Nodes, вы все еще сталкиваются с той же проблемой, дайте мне знать в комментариях, и мы можем копать дальше.