Nginx Kubernetes出口网络策略在选定的pod上不起作用

Nginx Kubernetes出口网络策略在选定的pod上不起作用,nginx,kubernetes,weave,Nginx,Kubernetes,Weave,我在kube集群上设置出口网络策略时遇到了一个奇怪的问题 基本上我只想让我的A舱进入B舱 我有两个豆荚: hello-k8s-deploy nginx hello-k8s-deploy pod通过NodePort在端口8080上公开API。 我的nginx pod只是一个访问API的映像 因此,让我们尝试登录到nginx pod并访问hello-k8s-deploy pod公开的API 上面显示了API的响应消息以Hello K8s开始 现在,让我们在我的nginx pod上应用网络策略,以便

我在kube集群上设置出口网络策略时遇到了一个奇怪的问题

基本上我只想让我的A舱进入B舱

我有两个豆荚:

  • hello-k8s-deploy
  • nginx
  • hello-k8s-deploy pod通过NodePort在端口
    8080
    上公开API。 我的nginx pod只是一个访问API的映像

    因此,让我们尝试登录到nginx pod并访问hello-k8s-deploy pod公开的API

    上面显示了API的响应消息以
    Hello K8s开始

    现在,让我们在我的nginx pod上应用网络策略,以便它只能访问此API,而不能访问其他API

    网络策略:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: app
    spec:
      podSelector:
        matchLabels:
          run: nginx
      egress:
        - to:
          - podSelector:
              matchLabels:
                app: hello-k8s-deploy
      policyTypes:
       - Egress
    
    上述策略将应用于带有标签的pod
    run:nginx

    规则是允许流量通过标签
    app:hello-k8s-deploy

    让我们通过查看pods nginx和hello-k8s-deploy的定义来验证它

    nginx:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: app
    spec:
      podSelector:
        matchLabels:
          run: nginx
      egress:
        - to:
          - podSelector:
              matchLabels:
                app: hello-k8s-deploy
      policyTypes:
       - Egress
    

    hello-k8s-deploy

    正如我们所看到的,两个标签都与网络策略相匹配

    在我应用了网络策略并再次访问nginx之后,我希望能以同样的方式工作,并从API获得响应,但我得到了以下错误

    注意:

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
      namespace: app
    spec:
      podSelector:
        matchLabels:
          run: nginx
      egress:
        - to:
          - podSelector:
              matchLabels:
                app: hello-k8s-deploy
      policyTypes:
       - Egress
    
  • 所有资源都位于同一名称空间
    app
  • 我的网络插件是weave net,它根据文档支持网络策略
  • 我甚至尝试指定名称空间选择器并添加端口8080

  • 我终于解决了这个问题,基本上我遇到的问题是
    无法解决主机hello-k8s-svc
    。这意味着k8s正在尝试使用此主机进行连接,并通过dns名称(服务名称)进行解析

    由于我的pod只允许hello-k8s-deploy的出口,所以它失败了,因为它还需要连接到kube dns来解析dns。因此,在应用出口之前,请确保命名空间中的pod或所有pod都允许连接到kube dns进行dns解析

    修复方法只是为所有吊舱创建一个出口资源,以便在吊舱特定出口配置的基础上连接到kube dns

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny-all-egress
    spec:
      podSelector: {}
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              networking/namespace: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
        ports:
        - protocol: TCP
          port: 53
        - protocol: UDP
          port: 53
      policyTypes:
      - Egress
    
    在我的例子中,我将kube系统名称空间标记为:

     kubectl label namespace kube-system networking/namespace=kube-system
    

    我终于解决了这个问题,基本上我遇到的问题是
    无法解决主机hello-k8s-svc
    。这意味着k8s正在尝试使用此主机进行连接,并通过dns名称(服务名称)进行解析

    由于我的pod只允许hello-k8s-deploy的出口,所以它失败了,因为它还需要连接到kube dns来解析dns。因此,在应用出口之前,请确保命名空间中的pod或所有pod都允许连接到kube dns进行dns解析

    修复方法只是为所有吊舱创建一个出口资源,以便在吊舱特定出口配置的基础上连接到kube dns

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny-all-egress
    spec:
      podSelector: {}
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              networking/namespace: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
        ports:
        - protocol: TCP
          port: 53
        - protocol: UDP
          port: 53
      policyTypes:
      - Egress
    
    在我的例子中,我将kube系统名称空间标记为:

     kubectl label namespace kube-system networking/namespace=kube-system