aibangjuxin / groovy

study groovy
1 stars 0 forks source link

GKE ingress network policy #139

Open aibangjuxin opened 1 month ago

aibangjuxin commented 1 month ago

是的,当您使用 Network Policy 时,可能需要开放一些特定的规则来允许健康检查流量通过。对于 GKE Ingress 的健康检查,您需要开放以下规则:

  1. 允许 Ingress 控制器与后端服务通信:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
     name: allow-ingress-controller
     namespace: your-namespace
    spec:
     podSelector:
       matchLabels:
         app: your-app
     ingress:
     - from:
       - namespaceSelector:
           matchLabels:
             project: ingress-controller
       ports:
       - port: your-service-port

    此规则允许 Ingress 控制器与您的服务通信。请将 your-namespace 替换为您的命名空间,将 your-app 替换为您的应用的标签选择器,将 your-service-port 替换为您服务的端口号。

  2. 允许后端服务与 GKE 健康检查通信:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
     name: allow-health-check
     namespace: your-namespace
    spec:
     podSelector:
       matchLabels:
         app: your-app
     ingress:
     - from:
       - ipBlock:
           cidr: 130.211.0.0/22
           cidr: 35.191.0.0/16
       ports:
       - port: your-service-port

    此规则允许来自 GKE 健康检查器的流量访问您的服务。GKE 健康检查使用 130.211.0.0/2235.191.0.0/16 这两个 CIDR 范围。请将 your-namespaceyour-service-port 替换为对应的值。

通过应用这两个 NetworkPolicy 规则,您应该能够解决 GKE Ingress 的健康检查问题。请注意,如果您还有其他需求,可能需要进一步调整这些规则。​​​​​​​​​​​​​​​​

这里的 namespaceSelector 用于选择 Ingress 控制器所在的命名空间。在 GKE 上,Ingress 控制器通常是部署在 kube-systemgke-system 等系统命名空间中的。

具体来说:

所以,如果您的 Ingress 控制器位于 kube-system 命名空间,您可以将上面的规则修改为:

namespaceSelector:
  matchLabels:
    kubernetes.io/metadata.name: kube-system

那么按照上面的这个说法,我应该去检查我对应的控制器位于 kube-system 命名空间一些详细信息 因为我必须允许namespace 的流入 我觉得这个是一个核心问题

如果位于 gke-system 命名空间,则修改为:

namespaceSelector:
  matchLabels:
    name: gke-system

这个规则的目的是允许 Ingress 控制器与您的应用服务进行通信,而不是授权您自己的工程。因为 Ingress 控制器作为中介,需要与后端服务通信来转发流量。

如果不确定 Ingress 控制器所在的命名空间及其标签,可以运行以下命令查看:

kubectl get namespaces --show-labels

然后根据输出结果调整 namespaceSelector 部分即可。​​​​​​​​​​​​​​​​

在使用 Kubernetes Network Policy 时,如果您的后端服务的健康检查状态变为 unhealthy,可能是由于网络策略过于严格,阻止了健康检查的流量。您需要为健康检查流量开放特殊的规则。

对于 GKE 的内部 Ingress,健康检查流量来自于 GKE 的一些特殊 IP 范围。因此,您需要在 Network Policy 中允许这些 IP 范围的入站流量。具体的规则如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-health-checks
  namespace: your-namespace
spec:
  ingress:
  - from:
    - ipBlock:
        cidr: 130.211.0.0/22
        except:
        - 130.211.4.0/22
    - ipBlock:
        cidr: 35.191.0.0/16
    ports:
    - port: your-service-port
  podSelector:
    matchLabels:
      app: your-app-label
  policyTypes:
  - Ingress

在上面的规则中:

请注意,如果您使用的是 GKE Ingress,则不需要额外的规则,因为 GKE Ingress 控制器已经对健康检查流量进行了处理。但如果您使用的是自定义 Ingress 控制器或负载均衡器,则需要添加类似的规则。

同时,确保您已经正确配置了 Network Policy 的命名空间选择器,以确保策略应用于正确的命名空间。

aibangjuxin commented 1 month ago

在使用 GKE (Google Kubernetes Engine) 配置内部负载均衡器时,如果启用了网络策略,如 Calico,可能需要特别注意确保健康检查流量能够正常通过。网络策略可以控制 Pod 之间的通信,如果不正确配置,可能会阻止来自 GKE 控制平面的健康检查流量,导致服务状态显示为 unhealthy。

解决方案

  1. 允许来自 GKE 控制平面的流量: GKE 的健康检查通常来自于 GKE 控制平面。因此,您需要确保网络策略允许来自控制平面(通常是 Google Cloud 的内部 IP 地址)的入站流量到达您的 Pod。这可以通过在 Calico 网络策略中明确允许这些 IP 地址来实现。

  2. 配置适当的标签和选择器: 确保您的网络策略正确地使用标签选择器来识别和允许健康检查流量。例如,您可能需要为执行健康检查的 GKE 系统 Pod 设置特定的标签,并在网络策略中引用这些标签。

  3. 检查和调整现有的网络策略: 如果已经有网络策略在运行,需要仔细检查这些策略是否无意中阻止了健康检查流量。可能需要调整或添加新的策略规则来特别允许这些流量。

示例网络策略

以下是一个 Calico 网络策略的示例,它允许来自特定 IP 地址范围的入站流量,这些 IP 地址范围应该包括 GKE 控制平面的 IP 地址:

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: allow-health-checks
spec:
  ingress:
    - action: Allow
      protocol: TCP
      source:
        nets:
          - "<GKE控制平面IP范围>"
      destination:
        ports:
          - 10256  # 假设的健康检查端口
  selector: "role == 'your-app'"

在这个策略中,您需要替换 <GKE控制平面IP范围> 为实际的 IP 地址范围,并确保 selector 正确匹配您的应用 Pod 的标签。此外,端口 10256 应替换为您的应用实际使用的健康检查端口。

结论

正确配置网络策略是确保 GKE 内部负载均衡器能够正常进行健康检查的关键。如果遇到问题,建议详细检查现有的网络策略设置,并根据需要进行调整。如果问题仍然存在,可能需要进一步检查日志和监控数据,或者联系 Google Cloud 支持获取帮助。

Sources [1] Configuring Ingress for internal Application Load Balancers | Google Kubernetes Engine (GKE) | Google Cloud https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balance-ingress [2] Control communication between Pods and Services using network ... https://cloud.google.com/kubernetes-engine/docs/how-to/network-policy [3] Get started with Calico network policy https://docs.tigera.io/calico/latest/network-policy/get-started/calico-policy/calico-network-policy [4] GKE Dataplane V2 | Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/concepts/dataplane-v2 [5] Support Project Network Policy (PNP) for Project level ... - GitHub https://github.com/rancher/rancher/issues/14085 [6] Allow only in-cluster ingress for calico network policy - Stack Overflow https://stackoverflow.com/questions/71433996/allow-only-in-cluster-ingress-for-calico-network-policy [7] Calico on Kubernetes 从入门到精通 https://www.kubernetes.org.cn/4960.html [8] 容器网络calico 基本原理和模拟- 不认命?就拼命! https://zhdya.gitee.io/zhdya/2019/04/22/%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%20calico%20%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86%E5%92%8C%E6%A8%A1%E6%8B%9F/ [9] gke pods not able to ping the gce's when using calico #2813 - GitHub https://github.com/projectcalico/calico/issues/2813 [10] Network policy | Calico Documentation - Tigera https://docs.tigera.io/calico-enterprise/latest/reference/resources/networkpolicy [11] K8S Calico网络插件- RidingWind - 博客园 https://www.cnblogs.com/RidingWind/p/16301622.html [12] Kubernetes policy, advanced tutorial - Calico Documentation - Tigera https://docs.tigera.io/calico/latest/network-policy/get-started/kubernetes-policy/kubernetes-policy-advanced [13] Calico网络策略详解 - 偷得浮生 https://zhangzhuo.ltd/articles/2022/08/24/1661307737007.html [14] DevOps/kubernetes/calico介绍-原理与使用.md at master - GitHub https://github.com/yangpeng14/DevOps/blob/master/kubernetes/calico%E4%BB%8B%E7%BB%8D-%E5%8E%9F%E7%90%86%E4%B8%8E%E4%BD%BF%E7%94%A8.md [15] calico rr - 滴滴滴- 博客园 https://www.cnblogs.com/gaoyuechen/p/16889157.html [16] calico多网口配置原创 - CSDN博客 https://blog.csdn.net/vah101/article/details/110234028

您遇到的问题很有可能是由于 Network Policy 的规则过于严格而导致的。当您应用了 Network Policy 后,Kubernetes 会根据这些规则来控制进出 Pod 的流量,如果规则太严格可能会阻止了正常的流量。

要解决这个问题,您需要在 Network Policy 中添加合适的规则,以允许以下流量:

  1. 允许 GKE Ingress 控制器与您的 Service 通信。
  2. 允许健康检查的流量到达您的 Pod。

具体来说,您可以尝试添加以下规则:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-and-healthcheck
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: your-app-label
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          component: ingress
    ports:
    - port: your-service-port
  - from:
    - ipBlock:
        cidr: 0.0.0.0/0
        except:
        - 10.0.0.0/8
        - 172.16.0.0/12
        - 192.168.0.0/16
    ports:
    - port: your-service-port

上面的规则做了以下工作:

  1. 允许来自 Ingress 命名空间的流量访问您的 Service 端口。
  2. 允许来自外部的健康检查流量访问您的 Service 端口,但排除了内部 IP 范围。

您需要根据您的实际情况调整 your-namespaceyour-app-labelyour-service-port 等参数。

如果上述规则无法解决您的问题,您可能需要进一步检查您的网络插件配置,或者查看 Ingress 控制器日志以获取更多信息。​​​​​​​​​​​​​​​​

我认为下面这个允许load balanced ip也可能有道理 You've followed the guide to set up an internal GKE ingress, and you're experiencing issues with the backend service health check when using network policies.

In this case, the issue is likely due to the fact that the health check probes sent by the ingress controller are blocked by the network policy.

To allow the health checks to succeed, you need to create a network policy that permits traffic from the ingress controller to your backend service. However, since you're using an internal load balancer, you need to allow traffic from the load balancer's IP address range instead of the ingress controller's pod IP.

Here's a possible solution:

Create a network policy to allow health checks

  1. Identify the internal load balancer's IP address range. You can do this by running kubectl describe ingress <ingress-name> -n <ingress-namespace> | grep "LoadBalancer Ingress" and looking for the ipRanges field.
  2. Create a network policy that allows traffic from the internal load balancer's IP address range to your backend service. You can use the following YAML as a starting point:
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
    name: allow-health-checks
    namespace: <your-namespace>
    spec:
    podSelector:
    matchLabels:
      app: <your-backend-service-app-label>
    ingress:
    - from:
    - ipBlock:
        cidr: <load-balancer-ip-range>/32
    - ports:
      - 8080 # or the port your backend service is listening on
    policyTypes:
    - Ingress

    Replace <load-balancer-ip-range> with the IP address range of the internal load balancer, and <your-backend-service-app-label> with the label of your backend service.

Apply the network policy

Run kubectl apply -f <network-policy-yaml> to create the network policy.

Verify the health check

After applying the network policy, verify that the backend service health check is successful again. You can check the health check status using kubectl describe ingress <ingress-name> -n <ingress-namespace>.

By allowing traffic from the internal load balancer's IP address range to your backend service, you should be able to resolve the health check issues caused by the network policy.

aibangjuxin commented 1 month ago

在使用 Network Policy 时,您需要确保网络策略允许所需的流量通过以维持健康的后端服务状态。在您的情况下,由于在没有网络策略时服务是正常的,但在应用网络策略后服务变得不健康,可能是由于网络策略阻止了必要的流量导致的。

根据您的描述,您的网络策略可能阻止了健康检查或其他必要的流量到达您的后端服务。您可以通过以下方式来解决这个问题:

  1. 允许健康检查流量通过:确保您的网络策略允许来自健康检查服务的流量到达后端服务。通常,健康检查的流量会使用特定的端口和协议,您可以根据您的健康检查设置来配置网络策略以允许该流量通过。

  2. 允许相关的服务通信:确保您的网络策略允许 GKE Ingress、GKE Service 和 GKE Deployment 之间的必要通信。您可以根据它们使用的端口和协议配置网络策略。

  3. 检查网络策略规则:审查您的网络策略规则,确保没有阻止必要的流量。您可能需要调整网络策略以允许所需的流量通过。

具体的网络策略规则取决于您的环境和应用程序的配置。以下是一些示例规则,您可以根据您的需求进行调整:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress
spec:
  podSelector:
    matchLabels:
      app: your-app # 调整为您的应用程序标签
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          role: backend # 调整为您的后端服务标签

这个示例允许来自标签为 app: your-app 的 Pod 的出站流量到达标签为 role: backend 的后端服务 Pod。您需要根据您的实际情况调整标签和端口。

如果您已经有特定的网络策略配置,请分享您的网络策略规则,以便更好地帮助您诊断问题并提出解决方案。

aibangjuxin commented 1 month ago

按照下面这个说法,我是不是需要在我的创建ingress 时候 指定一个标签 这样的话我才能在我的网络规则上做标签的选择

在 Kubernetes 中,Network Policies 是用来控制不同 Pods 之间的网络连接的规则。如果你在启用 Network Policies 后发现服务健康检查变为 unhealthy,这通常是因为 Network Policies 阻止了必要的网络流量。

对于你的内部 GKE Ingress、Service 和 Deployment 的配置,以下是一些可能需要的 Network Policy 规则,以确保流量可以正常流动:

  1. 允许 Ingress 到 Service 的流量:你需要一个规则允许 Ingress 资源访问你的 Service。

  2. 允许 Service 到 Deployment 的流量:Service 需要能够与后端的 Pods(Deployment 管理)通信。

  3. 端到端的流量:确保流量可以从 Ingress 经过 Service 到达 Pods,反之亦然。

  4. 健康检查:确保 Network Policies 允许 Kubernetes 的健康检查机制(如 kube-proxy 或类似的组件)对 Pods 进行健康检查。

一个基本的 Network Policy 示例可能如下所示:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-to-service
spec:
  podSelector:
    matchLabels:
      # 选择你的 Deployment 的标签
      app: your-app
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: your-ingress
    ports:
    - protocol: TCP
      port: 80 # 或者你的服务监听的端口

在这个例子中,your-app 是你的 Deployment 的标签,your-ingress 是你的 Ingress 的标签,而 80 是你的服务监听的端口。

请注意,Network Policies 可以非常具体,因此你需要根据你的具体配置和需求来调整规则。如果你不确定需要哪些规则,可以尝试以下步骤:

请记得,在实施任何 Network Policies 之前,最好在一个测试环境中进行测试,以避免在生产环境中引入问题。如果你不熟悉 Network Policies 的配置,可能需要进一步研究或咨询 Kubernetes 网络方面的专家。

aibangjuxin commented 1 month ago

对于在GKE的namespace中调试Network Policy规则的流量是否符合预期,您可以采取以下措施:

  1. 启用Kubernetes审计日志

Kubernetes审计日志记录了Kubernetes API服务器收到的所有请求。您可以在审计日志中查看Network Policy是否生效,以及哪些Pod或服务被拒绝访问。

  1. 使用kube-bench检查Network Policy

kube-bench是一个通过运行端到端测试来检查Kubernetes部署中Network Policy实施情况的工具。您可以运行以下命令:

kubectl run temp-pod --rm -i -t --image=aquasec/kube-bench:latest --restart=Never -- master --audit-env
  1. 利用开源工具检测网络连通性
  1. 配置Prometheus监控NetworkPolicy数据平面生效

利用kube-state-metrics导出NetworkPolicy生效的监控指标,并在Prometheus中配置抓取相关指标,从而监控NetworkPolicy运行状态。

  1. 使用命令行工具查看Network Policy细节
kubectl get networkpolicies <policy-name> -o yaml  #查看Policy详情
kubectl describe networkpolicy <policy-name>      #查看Policy事件

通过上述多种方式,您可以全面地查看Network Policy规则生效情况、影响范围、连通性测试等,从而调试您的NetworkPolicy是否按预期工作,哪些流量被阻挡或放行等细节信息。​​​​​​​​​​​​​​​​

aibangjuxin commented 1 month ago

要解决您提出的问题,即如何在默认拒绝所有入站和出站流量的情况下,逐步放开一些规则,并确认其他命名空间或流量是否可以到达您的命名空间,以及如何获取规则命中的详细信息,您可以采取以下步骤进行调试和确认:

1. 确认网络策略的存在和状态

首先,确保您已经正确创建并应用了网络策略。您可以使用以下命令列出当前命名空间中的所有网络策略:

kubectl get networkpolicies --namespace=<您的命名空间>

2. 使用日志和监控工具

GKE 并没有直接提供查看网络策略命中详情的内置工具,但您可以通过配置日志和监控来间接获取这些信息。您可以使用如 Stackdriver 这样的日志管理工具来收集和分析您的集群日志。通过配置适当的日志记录级别,您可以获取到关于网络流量和网络策略决策的详细信息。

3. 使用第三方工具

还有一些第三方工具和项目,如 Cilium 或 Calico,它们提供了更高级的网络策略调试和可视化功能。这些工具可以帮助您更容易地理解网络策略的行为,并且通常提供了更详细的日志和监控功能。

4. 测试网络连通性

您可以使用 kubectl exec 命令从一个 Pod 中尝试连接到另一个 Pod,以测试网络策略的效果。例如:

kubectl exec <源Pod名称> --namespace=<源命名空间> -- curl <目标Pod的IP地址>

如果请求成功,说明流量被允许;如果失败,可能是被网络策略拒绝。

5. 审查网络策略的定义

仔细检查您的网络策略定义,确保规则按预期工作。网络策略是基于白名单的,所以只有明确允许的流量才能通过。确保您的放行规则正确无误,并且顺序适当。

6. 使用 kubectl describe

您可以使用 kubectl describe networkpolicies <策略名称> --namespace=<您的命名空间> 命令来获取网络策略的更多信息,包括它的规则和作用的目标。

7. 考虑使用 Istio

如果您的需求非常复杂,考虑使用 Istio 这样的服务网格。Istio 提供了更细粒度的流量控制和安全策略,同时也提供了丰富的监控和日志功能,可以帮助您更好地理解和调试网络流量。

请注意,虽然这些步骤可以帮助您调试和确认网络策略的效果,但 GKE 目前没有直接提供查看特定网络策略命中详情的功能。您可能需要结合使用多种工具和方法来达到您的目的。

Sources [1] 使用政策配置网关资源| Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/configure-gateway-resources?hl=zh-cn [2] Harden your cluster's security | Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/hardening-your-cluster [3] Istio / Authorization Policy https://istio.io/latest/docs/reference/config/security/authorization-policy/ [4] Creating a private cluster | Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters [5] 使用Cloud Storage FUSE CSI 驱动程序访问Cloud Storage 存储桶 https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/cloud-storage-fuse-csi-driver?hl=zh-cn [6] 商业产品 - DaoCloud Enterprise https://docs.daocloud.io/native/commerce.html [7] 众所周知的标签、注解和污点 - Kubernetes https://kubernetes.io/zh-cn/docs/reference/labels-annotations-taints/ [8] Istio / 入门 https://istio.io/latest/zh/docs/setup/getting-started/ [9] 通过Ingress 配置容器原生负载均衡| Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing?hl=zh-cn [10] 在标准集群中配置IP 伪装代理| Google Kubernetes Engine (GKE) https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent?hl=zh-cn [11] Horizontal Pod Autoscaling | Kubernetes https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ [12] Network Plugins - Kubernetes https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/ [13] cilium/install/kubernetes/cilium/README.md at main - GitHub https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/README.md [14] Kubernetes(k8s)中文文档Google Computer Engine入门 https://www.kubernetes.org.cn/doc-8