Kubernetes网络分类
- node网络
基础设施网络,所有节点处于同一个局域网
- node网络
- pod网络
虚拟网络,无论节点哪里,所有pod都在同一个虚拟网络中,IP-per-Pod,pod间使用ip通信
- pod网络
- service网络
服务clusterIP所在的网络
- service网络
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
以上命令可以看出需要指定pod网络和service网络的网段
pod网络
pod创建时会自动分配一个pod网络的IP,pod之间可以使用该IP相互通信,但是:
- pod会自动释放和重新创建,ip因此不稳定
- 集群外部不可见
所以需要service暴露服务
service网络
service创建以后会分配一个service网络的IP,service不会自动删除重建,所以IP固定不变。
service一般指kind=Service&type=clusterIP
的资源:
- service的默认type就是clusterIP,clusterIP自动分配
- 没有指定clusterIP的创建会自动分配一个ip(
外部依然访问不了
) - 指定clusterIP的创建也是允许的
- clusterIP: none的叫无头服务,dns直接查到pod的ip地址,这个适合各个pod之间相互通信的场景
node网络
-
Nodeport(
kind=Service&type=Nodeport
)
pod的服务直接映射到集群每一个节点的指定port,这样我们就可以通过节点的IP+port访问pod提供的服务了 -
LoadBalance(
kind=Service&type=LoadBalancer
)
这个只有云基础设施提供才行,LoadBalancer有外部ip(不属于node网络
),用户可以通过LoadBalancer的ip访问服务,内部是映射到类似Nodeport的节点+IP做负载均衡
Ingress
Ingress(kind=Ingress
)
第七层反向代理,同一个ip/域名管理多个服务,流程如下
- 外部能够访问Ingress控制器即可,一般叫做upstream
- upstream将请求转发给Ingress
- Ingress根据rules分流,将请求转发给指定的service
此处的service可以是Nodeport,也可以是clusterIP
Is Ingress working with ClusterIP services?
结论:
使用Ingress+clusterIP服务对外暴露计算服务
pod不能直接提供稳定的ip
clusterIP服务虽然提供了稳定的IP,没有办法暴露给外部
Nodeport可以暴露给外部,但是开放的口子太多了,如果集群有1万台机器,每台机器都要开放端口
LoadBalancer提供了唯一的入口,但是底层实现是基于Nodeport的,兼具Nodeport的缺点
方案只剩一个Ingress->clusterIP服务->pod集群
网友评论