Kubernetes 无法运行印花布进出规则
我一直在尝试使用calico网络规则,我发现在拒绝所有入口和出口规则后,很难让入口和出口规则在calico中使用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
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
中进行了描述。我提供了上面的示例来精确匹配您描述的场景,这意味着您希望控制入口和出口。