Kubernetes 无法运行印花布进出规则

Kubernetes 无法运行印花布进出规则,kubernetes,project-calico,Kubernetes,Project Calico,我一直在尝试使用calico网络规则,我发现在拒绝所有入口和出口规则后,很难让入口和出口规则在calico中使用order kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS hello-web3 1/1 Running 0 45m app=foo hello-web4 1/1 Running 0 45m

我一直在尝试使用calico网络规则,我发现在拒绝所有入口和出口规则后,很难让入口和出口规则在calico中使用
order

 kubectl get pods --show-labels
NAME         READY   STATUS    RESTARTS   AGE   LABELS
hello-web3   1/1     Running   0          45m   app=foo
hello-web4   1/1     Running   0          45m   app=bar
hello-web5   1/1     Running   0          15s   app=foobar
hello-web6   1/1     Running   0          4s    app=barbar
我的网络策略如下

---
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: ppdp-default
spec:
  selector: all()
  order: 2000
  types:
  - Ingress
  - Egress
---
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: ppdp-egress-trusted
spec:
  selector: app == 'foo'
  order: 1000
  types:
  - Egress
  egress:
  - action: Allow
    destination:
      selector: app == 'bar'
---
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: ppdp-ingress-trusted
spec:
  selector: app == 'foobar'
  order: 100
  types:
  - Ingress
  ingress:
  - action: Allow
    source:
      selector: app == 'barbar'
入口输出:

(base) ➜ ✗ kubectl exec --stdin --tty hello-web5 -- sh
/ # ^C
/ # wget -qO- --timeout=2 http://hello-web6:8080
^C
/ # wget -qO- --timeout=2 http://hello-web6:8080
wget: bad address 'hello-web6:8080'
/ # command terminated with exit code 1
---
(base) ➜ ✗ kubectl exec --stdin --tty hello-web6 -- sh
/ # wget -qO- --timeout=2 http://hello-web5:8080
wget: bad address 'hello-web5:8080'
/ # command terminated with exit code 1
出口输出

(base) ➜ ✗ kubectl exec --stdin --tty hello-web3 -- sh
/ # wget -qO- --timeout=2 http://hello-web4:8080
^C
/ # command terminated with exit code 130
我遗漏了什么吗?任何帮助都会大有裨益

提前谢谢

在名称空间中,我首先要拒绝所有pod之间的流量,然后允许特定pod之间的进出流量 (匹配标签)

虽然我不知道您为什么要使用订单或印花布网络策略,但评论中描述的目标可以通过印花布CNI支持的Kubernetes网络策略实现。我准备了一个简单的例子,说明网络策略如何处理这些问题。让我们从我在
dev
名称空间中创建的pod列表开始:

➜  ~ kgp-n开发--显示标签-owide
名称就绪状态重新启动老化IP节点指定节点就绪门标签
centos 1/1运行0 30m 10.244.120.68 minikube主机=centos
运行0 30m 10.244.120.69 minikube主机的echo服务器1/1=echo服务器
注意标签。在我的示例中,我们将允许从名为
centos
的主机进入
echo服务器
。让我们首先测试以下各项之间的连接是否有效:

[root@centos /]# curl 10.244.120.69:80 -v
* About to connect() to 10.244.120.69 port 80 (#0)
*   Trying 10.244.120.69...
* Connected to 10.244.120.69 (10.244.120.69) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.244.120.69
> Accept: */*
  "path": "/",
  "headers": {
    "user-agent": "curl/7.29.0",
    "host": "10.244.120.69",
    "accept": "*/*"
  "os": {
    "hostname": "echo-server"
  },
  "connection": {}
* Connection #0 to host 10.244.120.69 left intact
现在,让我们拒绝该命名空间中的所有流量:

apiVersion:networking.k8s.io/v1 种类:网络策略 元数据: 名称:默认拒绝所有 名称空间:dev 规格: 播客选择器:{} 保单类型: -入口 -出口 一旦此策略到位,之前的测试将失败:

➜  ~ keti-n开发中心bash
[root@centos旋度10.244.120.69:80-v
*即将连接()到10.244.120.69端口80(#0)
*正在尝试10.244.120.69。。。
*连接超时
*未能连接到10.244.120.69:80;连接超时
*正在关闭连接0
curl:(7)未能连接到10.244.120.69:80;连接超时
现在让我们应用入口策略,该策略将允许我们访问
echo服务器
。因此,基本上,我们选择要应用策略的pod标签,并选择允许哪些pod进入流量:

apiVersion:networking.k8s.io/v1 种类:网络策略 元数据: 名称:允许回显 名称空间:dev 规格: 播客选择器: 火柴标签: 主机:echo服务器 进入: -发件人: -播客选择器: 火柴标签: 主持人:centos 现在,由于我们允许通信量流向我们的
echo服务器
,我们可能会想马上测试它,但这仍然不起作用。虽然我们允许进入
echo服务器的流量
,但我们必须记住,我们在
拒绝所有
策略中同时拒绝了
进入
退出
。这意味着我们必须允许来自
centos
pod的
出口
流量:

apiVersion:networking.k8s.io/v1 种类:网络策略 元数据: 姓名:森托斯出口酒店 名称空间:dev 规格: 播客选择器: 火柴标签: 主持人:centos 出口: -致: -播客选择器: 火柴标签: 主机:echo服务器
之后,我们成功地允许同一名称空间中某些特定pod的流量,同时拒绝与标签不匹配的每个pod。

既然您提到您在订单方面存在问题,我是否可以假设,如果不指定订单,网络策略工作正常?否,它不起作用,那么我想知道如何定义它们并给它们下命令确定,你的pod运行的是什么名称空间?你能描述一下你的网络策略目标吗?通过这种方式,我可以更容易地重现这种情况。在名称空间中,我首先要拒绝所有pod之间的流量,然后允许特定pod(匹配标签)之间的进出流量那么为什么在这个链接中他们只允许进入流量呢?这是因为隔离策略没有指定任何进入/出口类型,而且默认情况下。如果
网络策略
上未指定
策略类型
,则默认情况下将始终设置入口,如果网络策略具有任何出口规则,则将设置出口。这在
PolicyTypes
中进行了描述。我提供了上面的示例来精确匹配您描述的场景,这意味着您希望控制入口和出口。