aibangjuxin / groovy

study groovy
1 stars 0 forks source link

Network policy #148

Open aibangjuxin opened 2 weeks ago

aibangjuxin commented 2 weeks ago

要逐步放开 GKE 中的 Network Policy 防火墙以允许通过 Load Balancer IP 的通信,你需要进行以下几个步骤:

  1. 创建允许 Ingress 的 Network Policy:

    • 允许从 Load Balancer IP 到 Service 的流量。
    • 指定目标端口和命名空间。
  2. 创建允许 Egress 的 Network Policy:

    • 允许从 Pod 到外部的流量,如果有必要。
    • 指定目标端口和命名空间。
  3. 检查和更新防火墙规则:

    • 确保 GKE 防火墙规则允许从 Load Balancer IP 到 GKE 节点的流量。

具体步骤

  1. 允许 Ingress 流量: 下面的 Network Policy 允许 Load Balancer IP 访问指定命名空间中的 Pods。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-lb-ingress
      namespace: your-namespace
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: <LoadBalancer_IP>/32
        ports:
        - protocol: TCP
          port: 443
  2. 允许 Egress 流量(如果需要): 下面的 Network Policy 允许 Pods 访问外部流量。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress
      namespace: your-namespace
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        ports:
        - protocol: TCP
          port: 8443
  3. 更新 GKE 防火墙规则: 确保 GKE 防火墙允许从 Load Balancer IP 到 GKE 节点的流量。

    gcloud compute firewall-rules create allow-lb-to-nodes \
        --network default \
        --source-ranges <LoadBalancer_IP> \
        --allow tcp:443

需要注意的细节

  1. 命名空间隔离

    • 如果有多个命名空间,请确保为每个命名空间创建合适的 Network Policy。
    • 确保正确设置 namespaceSelectorpodSelector
  2. Service 和 Pod 的端口设置

    • 确保 Service 的 targetPort 和 Pod 上暴露的端口一致。
    • Service 定义示例:
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: your-namespace
    spec:
      selector:
        app: my-app
      ports:
      - protocol: TCP
        port: 443
        targetPort: 8443
      type: LoadBalancer
  3. 防火墙规则和网络策略的顺序

    • 先应用防火墙规则,再应用 Network Policy。
    • 检查防火墙规则是否覆盖所有必要的 IP 范围和端口。

Mermaid 流程图

flowchart TD
    subgraph Namespace
        A[Pod]
    end
    LB[Load Balancer]
    FW[Firewall Rule]
    NP[Network Policy]

    LB -- TCP 443 --> FW
    FW -- TCP 443 --> NP
    NP -- TCP 8443 --> A

通过以上步骤和注意事项,可以逐步放开 Network Policy 防火墙,确保 Load Balancer IP 的通信被允许。

aibangjuxin commented 2 weeks ago

根据你的配置,需要确保 GKE 节点之间可以通过端口 8443 进行通信。以下是实现这个目标的详细步骤,包括网络策略和防火墙规则的配置。

步骤1: 配置 Network Policy 允许节点间的流量

首先,确保所有的 Pods 能够在端口 8443 上进行通信。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-node-communication
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: my-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/8 # 这里假设你的 GKE 集群的节点 IP 范围是 10.0.0.0/8,根据实际情况调整
    ports:
    - protocol: TCP
      port: 8443
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/8
    ports:
    - protocol: TCP
      port: 8443

步骤2: 配置 GKE 防火墙规则

GKE 防火墙规则需要允许节点之间的流量通过 8443 端口。可以使用以下命令创建或更新防火墙规则:

gcloud compute firewall-rules create allow-internal-8443 \
    --network default \
    --allow tcp:8443 \
    --source-ranges 10.0.0.0/8 \
    --target-tags gke-node

完整的 Network Policy 和防火墙配置

以下是完整的 Network Policy 配置,确保 GKE 节点之间可以通过 8443 端口进行通信:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-node-communication
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      app: my-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.0.0.0/8
    ports:
    - protocol: TCP
      port: 8443
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/8
    ports:
    - protocol: TCP
      port: 8443

Mermaid 流程图

下面的流程图展示了网络流量的路径和防火墙规则的应用:

flowchart TD
    subgraph Namespace
        A[Pod]
    end
    LB[Load Balancer]
    FW[Firewall Rule: allow-internal-8443]
    NP[Network Policy: allow-node-communication]

    LB -- TCP 443 --> A
    A -- TCP 8443 --> FW
    FW -- TCP 8443 --> NP
    NP -- TCP 8443 --> A

通过以上步骤,你可以确保 GKE 节点之间能够通过 8443 端口进行通信,从而支持你的 Service 配置。请根据你的实际情况调整 IP 范围和其他细节。