Как заблокировать трафик c в модуль базы данных и службу (DNS) из других пространств имен в кубернатах? - PullRequest
1 голос
/ 19 июня 2020

Я создал 2 клиента (tenant1, tenant2) в 2 пространствах имен tenant1-namespace, tenant2-namespace

У каждого клиента есть модуль db и его службы

Как изолировать модули db / сервис то есть как ограничить модуль / службу из его пространства имен для доступа к модулям базы данных других клиентов?

Я использовал учетную запись службы для каждого клиента и применил сетевые политики, чтобы пространства имен были изолированы.

kubectl get svc --all-namespaces

tenant1-namespace   grafana-app            LoadBalancer   10.64.7.233    104.x.x.x   3000:31271/TCP   92m
tenant1-namespace   postgres-app           NodePort       10.64.2.80     <none>      5432:31679/TCP   92m
tenant2-namespace   grafana-app            LoadBalancer   10.64.14.38    35.x.x.x    3000:32226/TCP   92m
tenant2-namespace   postgres-app           NodePort       10.64.2.143    <none>      5432:31912/TCP   92m

Итак,

Я хочу ограничить приложение grafana, чтобы использовать только его postgres db только в его пространстве имен, а не в другом пространстве имен.

Но проблема в что с использованием квалифицированного имени службы DNS (app-name.namespace-name.svc.cluster.local) он позволяет получить доступ друг к другу pod'ы db (приложение grafana в пространстве имен tenant1-namespace может иметь доступ к postgres db в другом пространстве имен tenant2 через postgres-app.tenant2-namespace.svc.cluster.local

Обновления: сетевые политики

1)

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-from-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

2)

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: web-allow-external
spec:
  podSelector:
    matchLabels:
      app: grafana-app
  ingress:
  - from: []

1 Ответ

1 голос
/ 19 июня 2020
  • Ваши 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, вы все еще сталкиваются с той же проблемой, дайте мне знать в комментариях, и мы можем копать дальше.

...