我对 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 网络:
对于 Pod,您正在查看:
你发现:
veth0
, 1
, 2
:虚拟网络接口(interface),每个容器一个。docker0 是 veth0 的 default Gateway 。它被命名为 cbr0 表示“自定义网桥”。
Kubernetes 通过共享 same veth0 来启动容器,这意味着每个容器必须公开不同的端口。
pause
”中启动的特殊容器,用于检测发送到 pod 的 SIGTERM,并将其转发到容器。 最后一个元素是事情开始变得更复杂的地方:
当一个 pod 与另一个 pod 联系时,它会通过 service 。
为什么?
这意味着:您需要一个反向代理/动态负载平衡器。而且最好有弹性。
该服务使用自己的网络。默认情况下,其类型为“ ClusterIP ”;它有自己的IP。
这是两个 Pod 之间的通信路径:
它使用 kube-proxy 。
这个代理使用一个 netfilter 。
但:
网络架构变为:
但是,这不太适合需要外部固定 IP 的外部(面向公众)通信。
你有专门的服务: nodePort and LoadBalancer :
你得到:
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/