AKS Kubernetes 问题

AKS Kubernetes questions

有人可以解释一下 POD 到 POD 在 AKS 中的工作原理吗? 从文档中,我可以看到它使用 kube 代理组件将流量发送到所需的 POD。

但我被告知必须使用 clusterIP 服务并将所有相关的 POD 绑定在一起。 那么什么是真正的流量呢?或者我错过了什么。下面几个问题更清楚。

问题:

  1. 一个节点内的POD到POD如何相互通信?流量是多少?
  2. 一个集群(不同节点)内的 POD 到 POD 如何相互通信?流量是多少?
  3. 如果可能的话,如果您能描述 kubenet 和 CNI 部署中 #1 和 #2 的流程,我们将不胜感激。

非常感谢!

对于 pod 到 pod 的通信,我们使用 services。所以首先我们需要了解,

为什么我们需要服务: 实际为我们提供服务的是什么,他们解析 dns 名称并为我们提供连接特定 pod 所需的确切 ip。现在,当您想与 pod 通信时,您需要创建一个 ClusterIP 服务。

ClusterIP: 在集群内部 IP 上公开服务。选择此值会使服务只能从集群内访问。这是默认的服务类型。使用 ClusterIP 服务,您无法从集群外部访问 pod,因此如果我们只想在 pod 与 pod 之间进行通信,我们会使用 clusterip 服务。

kube-proxy 是在集群中每个节点上运行的网络代理。

它维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与您的 Pods 进行网络通信。 每个服务维护 iptables.And kube-proxy 为每个服务处理这些 ip 表。所以是的,kube-proxy 是我们 k8s 集群中网络设置最重要的一点。

网络策略在 kubernetes 中的工作原理:

  • 所有 Pods 可以在不使用网络地址转换 (NAT) 的情况下与所有其他 Pods 通信。
  • 所有节点都可以在没有 NAT 的情况下与所有 Pods 通信。
  • Pod 认为自己的 IP 与其他人认为的 IP 相同。

那些点:

  • 容器到容器网络
  • Pod 到 Pod 网络
  • Pod 到服务网络
  • 互联网到服务网络

它处理 pod 与 pods 之间以及与外界的数据包传输。通过使用 iptables.

中的 NAT 实现负载平衡,它就像节点上 pods 运行 的网络代理和负载平衡器

kube-proxy 进程位于 Kubernetes 网络和该特定节点上 运行 的 pods 之间。它负责确保在集群的所有元素之间有效地维护通信。当用户创建 Kubernetes 服务对象时,kube-proxy 实例负责将该对象转换为工作节点上本地 iptables 规则集中有意义的规则。 iptables 用于将分配给服务对象的虚拟 IP 转换为该服务映射的所有 pod IP。 我希望你对 kube 代理的想法很清楚。

让我们看看它是如何工作的。 在这里我使用 headless service 以便我可以连接特定的 pod。

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  clusterIP: None
  selector:
    app: my-test
  ports:
  - port: 80
    name: rest
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-sts
spec:
  serviceName:  my-service
  replicas: 3
  selector:
    matchLabels:
      app: my-test
  template:
    metadata:
      labels:
        app: my-test
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
              name: web

---

这将创建 3 个 pods。如:my-sts-0my-sts-1my-sts-2。现在,如果我们想连接到 pod my-sts-0,只需使用此 dns 名称 my-sts-0.my-service.default.svc:80。该服务将解析 dns 名称并提供 my-sts-0 的确切 podip。现在如果你需要从 my-sts-1my-sts-0 通信,你可以使用这个 dns 名称。

模板类似于 my_pod_name.my_Service_Name.my_Namespace.svc.cluster-domain.example ,但您可以跳过 cluster-domain.example 部分。只有 Service_Name.Namespace.svc 可以正常工作。

ref