k8s的service网络
K8s内部网络整体图
Service是什么:
- k8s定义服务是一种将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
- 这些Pod拥有相同的selector==》label
- k8s为Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。
- 而且使用 k8s,你无需修改应用程序,即可使用不熟悉的服务发现机制,黑盒式使用,简单易上手。
Service为什么出现的?缘由
- Pod是临时资源,随时可能被创建、删除等。参考Depolyment
- 每个Pod有自己的IP
- Pod创建、删除后,完整的服务应该都能正常工作,就需要一个前后端隔离的“代理层”,能够统筹后端的所有Pod
- 前端不关心现在有哪些Pod,前端只需要关注一个点==》service即可
那k8s为啥不用DNS轮询机制,而要自己实现一套流量转发机制呢?
DNS有缓存
注意:service与nignx不同
那k8s是怎么做的呢
插入一个知识点:k8s中的IP
Node IP:Node节点的IP地址,即物理网卡的IP地址
Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
Cluster IP:Service的IP地址,此为虚拟IP地址。
每个Node上运行kube-proxy,kube-proxy管理service的入口。
kube-proxyt通过监听api种service的变化,可以使用endpiont来记录所有pod的ip
service对外暴露一个V IP,也成为Cluster IP,集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod。
kube-proxy的代理示意图(user space)
附:
获取Node IP
1.kubectl get nodes
2.kubectl describe node nodeName
3.显示出来的InternalIP就是NodeIP
获取Pode IP
1.kubectl get pods
2.kubectl describe pod podName
获取Cluster IP
kubectl get svc
参考:https://kubernetes.io/docs/concepts/services-networking/service