当前位置: 首页 > 知识库问答 >
问题:

如何阻止流量到db pod

林修真
2023-03-14

我在2个命名空间tenant1命名空间和tenant2命名空间中创建了2个租户(tenant1,tenant2)

每个租户都有db pod及其服务

如何隔离db pods/service,即如何限制pod/service从他的命名空间访问其他租户db pod?

我为每个租户使用了服务号,并应用了网络策略,以便隔离命名空间。

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-app仅在他的命名空间中使用他的postgres db,而不是在其他命名空间中。

但问题是使用DNS限定的服务名称(app-name.namespace-name.svc.cluster.local)允许访问其他db pod(命名空间tenant1-namesspace中的grafana-app可以通过postgres-app.tenant2-namespace.svc.cluster.local访问其他tenant2-namesspace中的postgres db)

更新:网络策略

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个答案

富建章
2023-03-14

>

  • 您的Net工作策略对象是正确的,我用它们创建了一个示例,并将在下面演示。

    如果您仍然可以使用FQDN访问其他命名空间上的服务,则您的NetworkPolicy可能无法在您的群集上完全启用。

    运行gcloud容器集群描述“CLUSTER_NAME”--zone“zone”并查找以下两个片段:

      < li >在描述的开头,它显示了如果在主级别启用了网络策略插件,它应该是这样的:
    addonsConfig:
    networkPolicyConfig: {}
    
    • 在描述的中间,您可以找到是否在节点上启用了网络策略。它应该如下所示:
    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
    
    • 如果上述任何不同,请在此处查看:如何在GKE中启用网络策略

    繁殖:

      我将
    • 创建一个简单的示例,我将 gcr.io/google-samples/hello-app:1.0 租户 1 的图像和 租户 2 的 gcr.io/google-samples/hello-app:2.0 图像,因此查看它的连接位置更简单,但我将使用您的环境名称:
    $ 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
    
    • 现在,让我们部署您的两条规则:第一条阻止来自命名空间外部的所有流量,第二条允许从命名空间外部进入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: []
    
    • 让我们回顾一下网络策略隔离的规则:

    默认情况下,pods是非隔离的;他们接受来自任何来源的流量。

    pod通过选择它们的网络策略而变得孤立。一旦命名空间中的任何网络策略选择了特定的pod,该pod将拒绝任何网络策略不允许的任何连接。(命名空间中未被任何网络策略选择的其他pod将继续接受所有流量。)

    网络策略不冲突;它们是相加的。如果任何一个或多个策略选择了一个pod,该pod将被限制为这些策略的进入/退出规则的联合所允许的范围。因此,评估顺序不会影响策略结果。

      < li >然后我们将在两个命名空间上应用规则,因为规则的范围是它被分配到的命名空间:
    $ 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
    
    • 现在为了进行最终测试,我将登录tenant1中的grafana-app并尝试在两个命名空间中访问postgg-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 已解析,但网络策略阻止了对后端 Pod 的访问。

    如果在仔细检查主节点和节点上启用了网络策略后,您仍然面临相同的问题,请在评论中告诉我,我们可以进一步挖掘。

  •  类似资料:
    • 我有一个装在Docker容器中的NodeJS应用程序,我可以通过它向<code>smtp.gmail发送电子邮件。com(使用<code>nodeEmailer从Ubuntu容器中使用docker exec…,ping工作正常。我想知道是什么问题。详情如下:- 我的 Macbook: < li >操作系统:MacOS High Sierra(版本10.13.6) < li>Docker:版本18.

    • 问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery

    • 问题内容: 是否有可能做出无法逃脱和?我目前得到: 但我正在寻找这样的事情: 问题答案: 从Go 1.7开始,您仍然 无法使用json.Marshal()做到​​这一点 。json.Marshal的源代码显示: json.Marshal总是这样做的原因是: 字符串值编码为强制转换为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。尖括号“ <”和“>”转义为“ \ u003c”

    • 问题内容: 是否可以使用angularjs拦截器阻止请求? 问题答案: 在1.1.5及更高版本中,您可以使用配置对象的’timeout’属性。 从文档中: 超时– {number | Promise} –超时(以毫秒为单位),或承诺应在解决后中止请求。 简单的例子:

    • 我正在用量角器在竹子上进行E2E测试。我收到了这个错误未知错误:Chrome启动失败:异常退出(未知错误:DevToolsActivePort文件不存在) 然后我发现我不得不降级到2.37版本的Chrome驱动程序。我发现这里“https://github.com/angular/protractor/issues/4850”。 我在这里找到了下载chromedriver特定版本的方法https:

    • 我们正在使用nexus-staging-plugin将我们的开源库部署到Sonatype Nexus的OSS实例(https://OSS.Sonatype.org/)。这一切都很好。但是,由于我们使用的是构建服务器,我希望阻止对现有工件id的意外重新部署--这通常不是Maven所假设的。然而,OSSRH欣然接受并更新了现有的版本。有什么方法可以阻止这一点并使构建失败吗?