启用网络策略后 Kubernetes 运行状况检查失败

nbr*_*ink 8 firewall calico kubernetes kubelet kubernetes-networkpolicy

仅启用出口网络策略时,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 网络。

Mat*_*att 3

看起来 kube-probe 使用 AKS 中每个pod cidr的 .1 地址。我相信这将是 Linux 网桥在代理池虚拟机上分配的地址,因此主机选择它作为到 Pod 的最便宜的路由。

没有具有此地址的 pod,因此我看不到它如何通过选择器进行匹配,除非 AKS 在其实现中内置了一些魔法。

kubectl get pods --all-namespaces -o json \
  | jq -r '.items[] | [ .status.podIP, .metadata.name ] | join("\t")'
Run Code Online (Sandbox Code Playgroud)

该策略可以适用于.1所有 pod CIDR 的源 IP 的特定规则。

kubectl get nodes -o json \
  | jq '.items[] | [ .metadata.name, .spec.podCIDR ]'
[
  "aks-agentpool-12345678-vmss000000",
  "10.212.0.0/24"
]
[
  "aks-agentpool-12345678-vmss000001",
  "10.212.1.0/24"
]
Run Code Online (Sandbox Code Playgroud)

ipBlock所以这对于每个节点来说都是:

  ingress:
  - from:
    - ipBlock:
        cidr: 10.212.0.1/32
    - ipBlock:
        cidr: 10.212.1.1/32
Run Code Online (Sandbox Code Playgroud)

这有点可怕,因为它是按集群和按节点池配置的。我只涉足 AKS,所以可能有更好的解决方案。如果您找不到其他任何内容,我会在https://github.com/Azure/AKS/上提交错误