Kubernetes 网络策略出口端口

Kubernetes network policy egress ports

我有以下网络策略来限制对前端服务页面的访问:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  namespace: namespace-a
  name: allow-frontend-access-from-external-ip
spec:
  podSelector:
    matchLabels:
      app: frontend-service
  ingress:
    - from:
        - ipBlock:
            cidr: 0.0.0.0/0
        ports:
          - protocol: TCP
            port: 443
  egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        ports:
          - protocol: TCP
            port: 443

我的问题是:我可以使用我的出口规则(端口限制在 443 上)强制执行 HTTPS 吗?如果可以,它是如何工作的?假设客户端连接到前端服务,客户端在他的机器上选择一个随机端口用于此连接,Kubernetes 如何知道该端口,或者集群中是否存在某种端口映射,以便返回客户端的流量是在端口 443 上并在离开集群时映射回客户端原始端口?

你可能对网络策略(NP)理解有误。

你应该这样解释这一部分:

egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
        ports:
          - protocol: TCP
            port: 443

0.0.0.0/0 cidr 内所有 pods 的传出流量打开端口 443

你问的问题

how does Kubernetes know about that port, or is there a kind of port mapping in the cluster so the traffic back to the client is on port 443 and gets mapped back to the clients original port when leaving the cluster?

由 kube-proxy 通过以下方式管理:

对于从 pod 到外部地址的流量,Kubernetes 只使用 SNAT。它所做的是将 pod 的内部源 IP:port 替换为主机的 IP:port。当 return 数据包返回到主机时,它将 pod 的 IP:port 重写为目的地并将其发送回原始 pod。整个过程对原始pod是透明的,根本不知道地址转换。

查看 Kubernetes networking basics 以获得更好的理解。