0

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

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 上并在离开集群时映射回客户端的原始端口?

4

1 回答 1

2

您可能对网络策略(NP)有错误的理解。

这是您应该如何解释本节的方式:

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

为cidr 443中的所有 pod 的传出流量打开端口。0.0.0.0/0

你问的事情

Kubernetes 是如何知道该端口的,或者集群中是否存在某种端口映射,因此返回客户端的流量位于端口 443 上,并在离开集群时映射回客户端的原始端口?

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

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

查看Kubernetes 网络基础知识以更好地理解。

于 2019-09-20T09:31:45.123 回答