我对 kubernetes 非常陌生,刚刚使用 kube-up 在 AWS 上获得了一个股票 kubernetes v.1.3.5 集群。到目前为止,我一直在玩 kubernetes 以了解它的机制(节点、pod、svc 和其他东西)。根据我最初的(或者粗略的)理解,我有几个问题:

1) 路由到集群 IP 是如何工作的(即在 kube-aws 中)?我看到这些服务的 IP 范围为 10.0.0.0/16。我使用 rc=3 的股票 nginx 进行了部署,然后在暴露节点端口的情况下将服务附加到它。一切都很棒!我可以从我的开发机器连接到服务。该 nginx 服务的集群 IP 为 10.0.33.71:1321。现在,如果我通过 ssh 进入其中一个 Minion(或节点或 VMS)并执行“telnet 10.0.33.71 1321”,它会按预期连接。但我不知道这是如何工作的,我在 kubernetes 的 VPC 设置中找不到任何与 10.0.0.0/16 相关的路由。这里到底发生了什么,导致像 telnet 这样的应用程序成功连接?但是,如果我 ssh 进入主节点并执行“telnet 10.0.33.71 1321”,则无法连接。为什么从master连接失败?

2)每个节点内部都有一个cbr0接口(interface)。每个 minion 节点的 cbr0 配置为 10.244.x.0/24,master 的 cbr0 配置为 10.246.0.0/24。
我可以从任何节点(包括主节点)ping 到任何 10.244.x.x pod。但是我无法从任何小节点 ping 10.246.0.1(主节点内的 cbr0)。这里会发生什么?

下面是 kubernetes 在 aws 中设置的路由。专有网络。

Destination     Target
172.20.0.0/16   local
0.0.0.0/0       igw-<hex value>
10.244.0.0/24   eni-<hex value> / i-<hex value>
10.244.1.0/24   eni-<hex value> / i-<hex value>
10.244.2.0/24   eni-<hex value> / i-<hex value>
10.244.3.0/24   eni-<hex value> / i-<hex value>
10.244.4.0/24   eni-<hex value> / i-<hex value>
10.246.0.0/24   eni-<hex value> / i-<hex value>

最佳答案

Mark Betz ( SRE at Olark ) 在三篇文章中介绍了 Kubernetes 网络:

  • pods
  • services :
  • ingress

  • 对于 Pod,您正在查看:

    amazon-web-services - 如何在kubernetes-aws中配置群集IP?-LMLPHP

    你发现:
  • etho0 :“物理网络接口(interface)”
  • docker0 / cbr0 : bridge 用于连接两个 ethernet 段,无论它们的协议(protocol)如何。
  • veth0 , 1 , 2 :虚拟网络接口(interface),每个容器一个。
    docker0 veth0 default Gateway 。它被命名为 cbr0 表示“自定义网桥”。
    Kubernetes 通过共享 same veth0 来启动容器,这意味着每个容器必须公开不同的端口。
  • pause :在“pause”中启动的特殊容器,用于检测发送到 pod 的 SIGTERM,并将其转发到容器。
  • 节点 : 主机
  • 集群 :一组节点
  • router/gateway

  • 最后一个元素是事情开始变得更复杂的地方:



    当一个 pod 与另一个 pod 联系时,它会通过 service
    为什么?



    这意味着:您需要一个反向代理/动态负载平衡器。而且最好有弹性。



    该服务使用自己的网络。默认情况下,其类型为“ ClusterIP ”;它有自己的IP。

    这是两个 Pod 之间的通信路径:

    amazon-web-services - 如何在kubernetes-aws中配置群集IP?-LMLPHP

    它使用 kube-proxy
    这个代理使用一个 netfilter



    amazon-web-services - 如何在kubernetes-aws中配置群集IP?-LMLPHP



    但:



    网络架构变为:

    amazon-web-services - 如何在kubernetes-aws中配置群集IP?-LMLPHP

    但是,这不太适合需要外部固定 IP 的外部(面向公众)通信。

    你有专门的服务: nodePort and LoadBalancer :



    你得到:

    amazon-web-services - 如何在kubernetes-aws中配置群集IP?-LMLPHP

    Loadalancer 更先进,并允许使用标准端口公开服务。
    请参阅此处的映射:
    $ kubectl get svc service-test
    NAME      CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
    openvpn   10.3.241.52     35.184.97.156   80:32213/TCP     5m
    

    然而:



    例如:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
      annotations:
        kubernetes.io/ingress.class: "gce"
    spec:
      tls:
        - secretName: my-ssl-secret
      rules:
      - host: testhost.com
        http:
          paths:
          - path: /*
            backend:
              serviceName: service-test
              servicePort: 80
    

    关于amazon-web-services - 如何在kubernetes-aws中配置群集IP?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39159547/

    10-10 18:31
    查看更多