带有kubectl get pod命令的Init容器用于获取其他pod的就绪状态.
打开Egress NetworkPolicy后,init容器无法访问Kubernetes API : Unable to connect to the server: dial tcp 10.96.0.1:443: i/o timeout. CNI是Calico.
尝试了几个规则,但它们都没有工作(服务和主机主机IP,不同的CIDR掩码):
...
egress:
- to:
- ipBlock:
cidr: 10.96.0.1/32
ports:
- protocol: TCP
port: 443
...
Run Code Online (Sandbox Code Playgroud)
或使用命名空间(默认和kube系统命名空间):
...
egress:
- to:
- namespaceSelector:
matchLabels:
name: default
ports:
- protocol: TCP
port: 443
...
Run Code Online (Sandbox Code Playgroud)
看起来ipBlock规则只是不起作用,命名空间规则不起作用,因为kubernetes api是非标准pod.
可以配置吗?Kubernetes是1.9.5,Calico是3.1.1.
我试图限制我的 openvpn 以允许访问内部基础设施并仅通过“开发”命名空间来限制它,所以我从拒绝所有出口流量的简单策略开始,并且看不到任何影响或来自集群的任何反馈,我已经阅读了所有官方和非官方文档并且没有找到解决方案,这是我的政策:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: policy-openvpn
namespace: default
spec:
podSelector:
matchLabels:
app: openvpn
policyTypes:
- Egress
egress: []
Run Code Online (Sandbox Code Playgroud)
我已经用kubectl apply -f policy.yaml命令应用了上面的网络策略,但我没有看到这个策略的任何影响,我仍然能够从我的 openvpn pod 连接到任何东西,如何调试它并查看我的策略有什么问题?
这对我来说似乎是一个黑匣子,只能做尝试错误的方法,这似乎不是它应该如何工作的。
如何验证它是否找到了 pod 并将策略应用于它们?
我正在使用 GKE 提供的最新 kubernetes 集群
我注意到我没有在谷歌云设置中检查“使用网络策略”,在我检查我的 vpn 刚刚停止工作后,但我不知道如何检查它,或者为什么 vpn 只允许我连接并阻止所有网络请求,很奇怪,有没有办法调试是而不是随机改变东西?
kubernetes google-kubernetes-engine kubernetes-networkpolicy gke-networking
嗨,在centos中使用kubeadm安装Kubernetes当我在yaml文件中使用负载均衡器类型创建部署时,外部IPPending用于Kubernetes LB,它停留在Pending状态
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
service LoadBalancer 10.101.168.76 <pending> 80:32225/TCP 4m52s
Run Code Online (Sandbox Code Playgroud) 我正在尝试添加 calico 网络策略以允许我的命名空间与 kube-system 命名空间通信。但在我的 k8s 集群 kube-system 中没有附加标签,因此我无法在其中选择 pod。以下是我尝试过的但它不起作用。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-kube-system
namespace: advanced-policy-demo
spec:
podSelector: {} # select all pods in current namespace.
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels: {}
podSelector:
matchLabels:
tier: control-plane
egress:
- to:
- namespaceSelector:
matchLabels: {}
podSelector:
matchLabels:
tier: control-plane
Run Code Online (Sandbox Code Playgroud)
$ kubectl describe ns kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
No resource limits.
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以仅通过名称来选择名称空间?
仅启用出口网络策略时,Pod 重新启动后所有就绪性和活动性检查都会失败。
这是我在描述 pod 时看到的:
警告不健康 115s (x7 超过 2m55s) kubelet,就绪探测失败:获取http://10.202.158.105:80/health/ready : dial tcp 10.202.158.105:80: connect: 连接被拒绝 警告不健康 115s (x7 超过 2m55s) kubelet ,活性探测失败:获取http://10.202.158.105:80/health/live:拨打tcp 10.202.158.105:80:连接:连接被拒绝
如果我禁用这些策略,运行状况检查将立即恢复运行。如果 Pod 在应用网络策略之前已经正常运行,它将继续工作。
我还尝试使用此策略将每个名称空间列入白名单:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-ingress-all
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 8080
Run Code Online (Sandbox Code Playgroud)
我很难找到有关如何解决此问题的任何指导。是否需要启用出口策略才能允许 kubelet 监控 Pod 运行状况检查?
该 Pod 在 Azure Kubernetes 服务内部运行并使用 Calico 网络。
我是Kubernetes网络的新手.
我们已经分开的Kubernetes簇成一组命名空间(例如namespace-a,namespace-b).每个命名空间都有一组Kubernetes pod.每个pod都有一个可用的服务my-svc.namespace-x.svc.cluster.local.
现在,我们要防止的命名空间的豆荚namespace-a的服务,或者是部分荚交谈namespace-b和反之亦然.命名空间内的通信应该不受限制.
这是我在网络政策文档中作为示例找到的:https: //kubernetes.io/docs/concepts/services-networking/network-policies/#the-networkpolicy-resource
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
Run Code Online (Sandbox Code Playgroud)
据我了解,这可以完全阻止网络通信,对于命名空间中的所有pod.
我有一个多租户集群,其中通过命名空间实现多租户。每个租户都有自己的命名空间。来自租户的 Pod 无法与其他租户的 Pod 通信。但是,每个租户中的某些 Pod 必须使用 Ingress 向 Internet 公开服务。
这是我走了多远(我正在使用 Calico):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant1-isolate-namespace
namespace: tenant1
spec:
policyTypes:
- Ingress
podSelector: {} # Select all pods in this namespace
ingress:
- from:
- namespaceSelector:
matchLabels:
name: tenant1 # white list current namespace
Run Code Online (Sandbox Code Playgroud)
为每个命名空间 ( tenant1, tenant2, ... )部署,这限制了其命名空间内 pod 之间的通信。但是,这会阻止kube-system命名空间中的 Pod 与此命名空间中的 Pod 通信。
但是,kube-system默认情况下命名空间没有任何标签,因此我不能专门将此命名空间列入白名单。
我通过手动给它一个标签找到了解决这个问题的(肮脏的)解决方法:
kubectl label namespace/kube-system permission=talk-to-all
Run Code Online (Sandbox Code Playgroud)
并将白名单规则添加到网络策略中:
...
- from:
- namespaceSelector:
matchLabels:
permission: …Run Code Online (Sandbox Code Playgroud) 我正在尝试将命名空间中的 pod 与其他命名空间隔离。我尝试创建一个 NetworkPolicy:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
Run Code Online (Sandbox Code Playgroud)
此 NetworkPolicy 成功将我的命名空间中的 Pod 与另一个命名空间隔离。但此策略一旦应用,就会禁用到这些 Pod 的所有外部流量。是否有任何方法可以仅阻止来自其他命名空间的流量并允许所有外部流量到达 Pod。
kubernetes kubernetes-networkpolicy kubernetes-ingress kubernetes-networking
是NetworkPolicy状态防火墙吗?
例如,如果我允许从某些端口上的某些 IP 进入,是否会自动允许临时返回流量?允许的出口也是如此。
如果采用默认的阻止策略,这会如何发挥作用?
这里还有其他考虑吗?
有没有一种简单的方法可以Network Policies在Macsingle-node k8s cluster的Docker Desktop管理中启用?
kubernetes docker-for-mac kubernetes-networkpolicy docker-desktop