Calico 的网络策略无法 select kubernetes.default 服务
Calico's network policy can't select kubernetes.default service
我正在使用 google spark-operator and some calico 网络策略来保护命名空间。
Spark 驱动程序 pods 需要能够与 default
命名空间中的 kubernetes
服务通信,以便与 api-服务器通信。
这就是我得到的:
Operation: [get] for kind: [Pod] with name: [xx] in namespace: [xx] failed.
问题是:
使用任何类型的网络策略都会阻止与默认名称空间的通信。恢复连接是可能的,但选择 kubernetes.default
服务仍然是不可能的,因为它是一个特定的服务(没有选择器)...所以你不能与之通信!
我尝试打开与 default
+ kube-system
命名空间中的所有 pods 的通信。它适用于所有服务 除了 kubernetes.default
仍然无法访问!
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: mynetpol
spec:
selector: all()
types:
- Egress
egress:
# Allows comm to kube-system namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'kube-system'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'kube-system'
# Allows comm to default namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'default'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'default'
由于某些原因,尽管所有通信都是开放的,但卷曲 kubernetes.default.svc.cluster.local:443
超时事件。
所以……最后……
网络策略不适用于不以 pods 为目标的服务,这种特殊的 kubernetes
服务静静地位于 default
命名空间中就是这种情况。这是一项始终指向 api-服务器的特殊服务。
解决方案是检索 api- 服务器的真实 IP 并允许 egress
-ing 访问它。
要查找此 IP,您可以使用此命令:
kubectl get endpoints --namespace default kubernetes
由@Dave McNeill 提供
然后您可以在您的网络策略中允许此 IP。
如果您使用的是默认 netpol API,请查看 Dave 的回答
如果您正在使用 calico 策略,我鼓励您这样做,因为 Kube 策略很糟糕,下面是工作 yaml:
kind: NetworkPolicy
metadata:
name: allow-egress-api-server
spec:
selector: all()
types:
- Egress
egress:
# Allow api-server
- action: Allow
protocol: TCP
destination:
nets:
- <Your api-server IP>/32
ports:
- 6443
我正在使用 google spark-operator and some calico 网络策略来保护命名空间。
Spark 驱动程序 pods 需要能够与 default
命名空间中的 kubernetes
服务通信,以便与 api-服务器通信。
这就是我得到的:
Operation: [get] for kind: [Pod] with name: [xx] in namespace: [xx] failed.
问题是:
使用任何类型的网络策略都会阻止与默认名称空间的通信。恢复连接是可能的,但选择 kubernetes.default
服务仍然是不可能的,因为它是一个特定的服务(没有选择器)...所以你不能与之通信!
我尝试打开与 default
+ kube-system
命名空间中的所有 pods 的通信。它适用于所有服务 除了 kubernetes.default
仍然无法访问!
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: mynetpol
spec:
selector: all()
types:
- Egress
egress:
# Allows comm to kube-system namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'kube-system'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'kube-system'
# Allows comm to default namespace
- action: Allow
destination:
selector: all()
namespaceSelector: ns == 'default'
- action: Allow
source:
selector: all()
namespaceSelector: ns == 'default'
由于某些原因,尽管所有通信都是开放的,但卷曲 kubernetes.default.svc.cluster.local:443
超时事件。
所以……最后……
网络策略不适用于不以 pods 为目标的服务,这种特殊的 kubernetes
服务静静地位于 default
命名空间中就是这种情况。这是一项始终指向 api-服务器的特殊服务。
解决方案是检索 api- 服务器的真实 IP 并允许 egress
-ing 访问它。
要查找此 IP,您可以使用此命令:
kubectl get endpoints --namespace default kubernetes
由@Dave McNeill 提供
然后您可以在您的网络策略中允许此 IP。
如果您使用的是默认 netpol API,请查看 Dave 的回答
如果您正在使用 calico 策略,我鼓励您这样做,因为 Kube 策略很糟糕,下面是工作 yaml:
kind: NetworkPolicy
metadata:
name: allow-egress-api-server
spec:
selector: all()
types:
- Egress
egress:
# Allow api-server
- action: Allow
protocol: TCP
destination:
nets:
- <Your api-server IP>/32
ports:
- 6443